ISA-8 SD-контроллер (SPI) на CPLD

16-битные ПЦ-совместимые компьютеры с процессорами 8086/8088/80286 работающие под управлением ДОС

Moderator: Shaos

DimkaM
Maniac
Posts: 261
Joined: 22 Jun 2005 04:35
Location: МО Россия

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by DimkaM »

а не. сорри. запутался в форматировании
форум плохо табы и пробелы кажет.
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by Lavr »

А ты где надо - обрамляй тегом Code - он дает шрифт равноширинный как раз для кодов и программ.
iLavr
DimkaM
Maniac
Posts: 261
Joined: 22 Jun 2005 04:35
Location: МО Россия

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by DimkaM »

Эта строчка лишняя
// Чтение из регистра данных при сдвиге - опустим READY
if (~nCS & ~nRD & ~Adr & BUSY) MRDY <= 1'b1;
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by Tronix »

Почему лишняя? Записали в порт байт - начался сдвиг, тут пытаемся читать из порта а сдвиг еще не кончился, надо опустить линию READY, притормозив проц.
DimkaM
Maniac
Posts: 261
Joined: 22 Jun 2005 04:35
Location: МО Россия

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by DimkaM »

потому о уже есть тама:

Code: Select all

         // Запись в регистр данных
         if (~nCS & ~nWR & ~Adr)
         begin
         if (BUSY) 
            // если продолжается сдвиг, опустим READY
            MRDY <= 1'b1;
         else
         begin
             Data[7:0] = Dat[7:0];
             BUSY = 1'b1;
         end
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by Tronix »

Тама запись, а тута чтение.
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by Tronix »

Конечно не заработало.
newold86, было бы классно, если бы вы показали картинку с логического анализатора при операциях записи в spi и чтения, когда еще не сдвинулся до конца предыдущий байт.... С сигналами READY, CS, WR, RD....
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by newold86 »

Tronix wrote:Конечно не заработало.
newold86, было бы классно, если бы вы показали картинку с логического анализатора при операциях записи в spi и чтения, когда еще не сдвинулся до конца предыдущий байт.... С сигналами READY, CS, WR, RD....
С картинкой немного сложно - между железкой и мной расстояние приблизительно 9000 км, и в обозримом будущем будет только увеличиваться...

Но вообще там, с точки зрения работы шины, вообще ничего особенного - можно брать любую картинку работы шины ISA с тактами ожидания. В процессе реализации именно этой части никаких особенностей не возникало - как написано в книжках, так и работает. Естественно, если есть конкретные вопросы, попробую ответить.

P.S. А вот как внутри моего модуля сделано - могу попробовать вытащить и выложить VHDL код, но вряд ли польза будет, настолько я там коряво все написал. Вся проблема в асинхронщине. Если дойдут руки еще что-то писать, то, наверное, соберусь с силами и попробую все делать синхронным, с правильной обработкой внешних асинхронных сигналов и временным анализом...
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by Tronix »

Спасибо. Конкретных вопросов пока нет, сам еще не пойму. Похоже, что зацикливается у меня... В смысле READY никогда не отпускается, как упала в 0 так и лежит. Завтра потыкаю в нее чем-нибудь..
DimkaM
Maniac
Posts: 261
Joined: 22 Jun 2005 04:35
Location: МО Россия

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by DimkaM »

Смотрю в одном месте
MRDY <= 1'b0;   
А в другом
MRDY <= 1'b1;

Причём ,судя по условиям, это происходит одновременно вродебы
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by Tronix »

А вообще, IO CH CHK (READY) после того как положили на ноль нужно в конце именно поднимать в единицу? Я не поднимаю, а перевожу в Z состояние - такое ощущение, что комп ее сам не поднимает.
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by Tronix »

Не, это я все никак не привыкну к верилогу. Все правильно он делает, что не поднимает. А я - нет.
Вроде через еще пару регистров начал отслеживать фронт сигналов nRD или nWR. Вроде чуть-чуть заработало.

 Костылики

Code: Select all

module MX2_CPLD(
    // Системные
    input    Clk,              // Входная частота 14.31818 МГц
    input    Res,              // Входной сигнал сброса, активный уровень лог.0
    input    nRD,              // Вход строба чтения
    input    nWR,              // Вход строба записи
    input    nCS,              // Вход выбора контроллера
    input    Adr,              // Вход адреса данные/управление
    inout    [7:0]Dat,         // Шина данных
    inout	Ready,
    // SPI
    output   nSEL,             // Выходной сигнал выбора карты
    output   reg SCK,          // Выход тактовой частоты SPI
    input    MISO,             // Вход данных SPI
    output   MOSI,             // Выход данных SPI
    output   nRED,             // Выход управления красным светодиодом
    input    nINS              // Вход датчика вставления карты
);
// Внутренние регистры
reg [1:0]Ctrl;                 // Регистр управления
reg [7:0]Data;                 // Регистр данных
reg [2:0]Bits;                 // Счетчик сдвигаемых бит
reg RMISO;                     // Защелка сигнала MISO
reg BUSY;                      // SPI занят передачей
reg MRDY;					   // Признак записи/чтения порта при сдвиге
reg BEGWR;					   // Признак начала записи в порт данных (спад nWR)
reg BEGRD;					   // Признак начала чтения из порта данных (спад nRD)
// Комбинаторика
assign nSEL = ~Ctrl[0];        // Выбор карты
assign nRED = ~Ctrl[1];        // Красная лампочка
assign MOSI = Data[7];         // Выход MOSI SPI
assign Dat[7:0] = (~nCS & ~nRD & ~Clk) ?
                    (Adr) ? {~nINS,BUSY,4'h0,Ctrl[1:0]} : Data[7:0]
                    : 8'hZZ;
assign Ready = (MRDY) ? 1'b0 : 1'bZ;  // Если была попытка чтения/записи в порт, удерживаем READY

// Синхронная логика
always @(posedge Clk) begin
    // Запись в управление может происходить асинхронно
    if (~nCS & ~nWR & Adr) Ctrl[1:0] = Dat[1:0];
    // Сигнал сброса имеет приоритет вне зависимости от выбранной скорости
    if (Res)
		begin
			// Сброс действует на эти регистры
			Ctrl[1:0] <= 2'h0;
			Bits[2:0] <= 3'h0;
			BUSY <= 1'b0;
			SCK <= 1'b0;
			MRDY <= 1'b0;
			BEGWR <= 1'b0;
			BEGRD <= 1'b0;
		end 
	else
		begin
			// Состояние SPI
			if (BUSY)
				begin
					// SPI работает
					if (SCK)
						begin
							// Сбрасываем такт
							SCK <= 1'b0;
							// Спад, поэтому сдвигаем
							Data[7:0] <= {Data[6:0],RMISO};
							// Считаем биты
							Bits[2:0] <= Bits[2:0] + 3'h1;
							// Это был 7й бит?
							if (Bits[2] & Bits[1] & Bits[0]) 
								begin
									BUSY = 1'b0;	// Снимаем флаг занятости
									MRDY <= 1'b0;	// Переводим READY в hi-Z
								end;
						end 
					else 
						begin
							// Устанавливаем такт
							SCK <= 1'b1;
							// Это фронт, поэтому сэмплируем вход
							RMISO <= MISO;
						end
				end 
			else
				begin
					// Обнуляем счетчик бит
					Bits[2:0] <= 3'h0;
				end
			
			// Запись в регистр данных (предварительная)
            if (~nCS & ~nWR & ~Adr)
				begin
					BEGWR <= 1'b1;			// установим признак начала записи
					if (BUSY)
						// если SPI занят, положим сигнал READY вниз
						MRDY <= 1'b1;
				end
				
			// Запись в порт данных окончательная (nWR переключился)
			if (nWR & BEGWR)
            begin
				BEGWR <= 1'b0;				// сбросим признак начала записи
				Data[7:0] = Dat[7:0];
				BUSY = 1'b1;
            end

			// Чтение из порта данных (предварительное)
            if (~nCS & ~nRD & ~Adr)
				begin
					BEGRD <= 1'b1;			// установим признак начала чтения
					if (BUSY)
						// если SPI занят, положим сигнал READY вниз
						MRDY <= 1'b1;
				end
				
			// Чтение из порта данных окончательное (nRD переключился)
			if (nRD & BEGRD)
            begin
				BEGRD <= 1'b0;				// сбросим признак начала чтения
				// остальное сделает синхронная логика
            end

		end
end

// Конец
endmodule

Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by Tronix »

newold86 А какая логика работы при чтении порта данных? Вот обнаружили факт чтения - сразу кладем READY в ноль, сдвигаем, поднимаем READY? И с поднятием READY уходим в вечный цикл -)
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by newold86 »

Ну, у меня идеология немного другая, поэтому никакого вечного цикла нет. А так, если в двух словах, то все просто, как описали (за исключением вечного цикла). А если не в двух словах, то нужно смотреть весь код, а в нем разобраться не очень просто - никакой элегантности...

P.S. Наверное, ключевое отличие - у меня куча флагов, тогда как в данном коде - READY чуть ли не единственный, поэтому такие сложности с началом/завершением циклов.
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by Tronix »

Да, флаги у меня тоже появляются. А как понять, что чтение из порта произошло? Допустим обнаружили чтение из порта, установили флаг что у нас чтение в процессе, уронили READY, начали сдвигать. По завершению сдвига отпустили READY, дождались фронта /RD, сбросили флаг что чтение в процессе. Так что ли как то....