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

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

Moderator: Shaos

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

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

Post by Tronix »

newold86 wrote:Зачем READY как inout объявлен ?
Ну так на шине он вроде как открытый коллектор, то есть когда нужно вниз опустить - опускаем, когда не нужно - в hiZ. Вверх его специально тащить CPLD не нужно имхо, могут быть конфликты у других устройств.

А, или просто как output его сделать? Наверное да.

Тут еще дело в том, что код я менял уже неоднократно. Но вроде бы последний, который я здесь выкладывал, стабильно работает с Clk (не с OSC). Сам честно говоря запамятовал уже.

Не опускается READY? Странно, сейчас подумаю....
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

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

Post by newold86 »

Tronix wrote:
newold86 wrote:Зачем READY как inout объявлен ?
Ну так на шине он вроде как открытый коллектор, то есть когда нужно вниз опустить - опускаем, когда не нужно - в hiZ. Вверх его специально тащить CPLD не нужно имхо, могут быть конфликты у других устройств.
Так его можно просто output объявить - он точно так же должен в третье состояние уходить
Tronix wrote:Не опускается READY? Странно, сейчас подумаю....
На самом деле, все опускается, это я недоработал (вторую запись вдогон не послал):
MX2write2.jpg
You do not have the required permissions to view the files attached to this post.
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

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

Post by Tronix »

newold86 wrote: На самом деле, все опускается, это я недоработал (вторую запись вдогон не послал):
Так на первом рисунке не запись, а чтение. И там тоже должен RESET опуститься в 0.

Проблема еще в том, что сигнал nRD должен быть опущен все время на период сдвига (так как мы READY уронили и проц стоит) и подняться только после отпускания READY. То же касается и CS. На твоей и моей симуляции это не так. На моей симуляции CPLD никогда не выйдет из режима ожидания завершения цикла чтения порта.
You do not have the required permissions to view the files attached to this post.
Last edited by Tronix on 26 Dec 2017 01:16, edited 1 time in total.
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

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

Post by newold86 »

Tronix wrote:
newold86 wrote: На самом деле, все опускается, это я недоработал (вторую запись вдогон не послал):
Так на первом рисунке не запись, а чтение. И там тоже должен RESET опуститься в 0.
Там запись - в ModelSim строчки сигналов подписаны так, что фиг поймешь, к какому сигналу относится подпись. Если присмотреться, то nWR опускается (хотя курсор выделил nRD).

Даже если было бы чтение - а почему в этому случае READY опускаться должен (если не было предварительной записи, которая еще не ушла в SPI) ???
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

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

Post by Tronix »

newold86 wrote: Даже если было бы чтение - а почему в этому случае READY опускаться должен (если не было предварительной записи, которая еще не ушла в SPI) ???
Как почему ? Потому что в момент чтения еще читать нечего. Чтение - это запись 0xFF в MISO и чтение MOSI. Так что как только обнаружили чтение - сразу уронили READY и начали сдвигать 0xFF.
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

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

Post by newold86 »

Tronix wrote:
newold86 wrote: Даже если было бы чтение - а почему в этому случае READY опускаться должен (если не было предварительной записи, которая еще не ушла в SPI) ???
Как почему ? Потому что в момент чтения еще читать нечего. Чтение - это запись 0xFF в MISO и чтение MOSI. Так что как только обнаружили чтение - сразу уронили READY и начали сдвигать 0xFF.
А, я думал (в код в этой части не вникал), что для упрощения схемы FF пишется вручную, и потом читается. Вообще мне казалось, что Вы где-то так именно и объясняли...
angry_troll
Doomed
Posts: 449
Joined: 08 Apr 2013 04:04
Location: 213.247.249.139

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

Post by angry_troll »

В z-controller'e на спектруме сделали так:

Запись стартует собственно запись.
Чтение читает результат предыдущего обмена и стартует новую запись FF.

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

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

Post by Tronix »

newold86 wrote: А, я думал (в код в этой части не вникал), что для упрощения схемы FF пишется вручную, и потом читается. Вообще мне казалось, что Вы где-то так именно и объясняли...
Да, сначала было именно так. Но из-за двойной операции out dx,al ; in al,dx решил сделать как у вас, то есть для чтения - одна операция in al,dx.

Вообще, возможен случай, когда при чтении не произойдет сдвига - если перед чтением была операция записи и сигнал на чтение поступил еще до окончания момента записи. В этом случае отдадутся данные, которые были на момент окончания записи. То есть, грубо говоря так:

out dx,al
in al,dx

PS: Должно в теории так работать :)
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

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

Post by Tronix »

Интересно, а почему квартус при симуляции чтения оставляет Dat (шину данных) в hi-Z ? И добавляет какие-то Dat[0]~result .. Dat[7]~result от себя. И даже в них после сдвига крестики - неизвестное состояние? Почему неизвестное, ведь я в Dat сдвинул биты, они там и должны лежать пока снова их сдвигать не начнут.
UPD: С последним разобрался, нужно было MISO нарисовать ему. Но все равно Dat в hi-Z
You do not have the required permissions to view the files attached to this post.
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

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

Post by Tronix »

Вот рисунок, карточка ответила на команду 0x1. Внизу клок - это Clk 8 MHz. Сама железка работает от OSC 14,3 MHz, на рисунке не показан, не хватило канала. Какие вы здесь видите аномалии?
You do not have the required permissions to view the files attached to this post.
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

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

Post by Tronix »

Перевел все в неблокирующие записи. Все работает на Clk и виснет на OSC. На OSC в рандомном месте при чтении опускает READY вниз и все.

 код

Code: Select all

module MX2_CPLD(
    // System IO
    input    Clk,              // Input frequency					ISA CLK
    input    SysClk,
    input    Res,              // Input reset signal, active 1  	ISA RESET
    input    nRD,              // Input read port signal			ISA /IOR
    input    nWR,              // Input write signal 				ISA /IOW
    input    nCS,              // Input select controller			from 74138 decoder
    input    Adr,              // Input data/control bus			ISA SA0
    inout    [7:0]Dat,         // Data bus							ISA SD0..SD7
    output	Ready,             // Ready								ISA I/O CH RDY
    // SPI
    output   nSEL,             // Output card select
    output   reg SCK,          // Output SPI frequency
    input    MISO,             // Input SPI data
    output   MOSI,             // Output SPI data
    output   nRED,             // Output LED indicator
    input    nINS              // Input card inserted
);
// Internal registers
reg [7:0]Data;                 // Data register
reg [1:0]Ctrl;                 // Control register
reg [2:0]Bits;                 // Shifted bits counter
reg RMISO;                     // MISO signal latch
reg BUSY;                      // SPI busy
reg MRDY;					   // Read/write attempt flag when SPI busy
reg BEGWR;					   // Begin write to data port (falling nWR)
reg BEGWRC;
reg BEGRD;					   // Begin read from data port (falling nRD)
//reg PRESTART;
// Combinatorics
assign nSEL = ~Ctrl[0];        // Card select
assign nRED = ~Ctrl[1];        // RED LED
assign MOSI = Data[7];         // Output MOSI SPI
assign Dat[7:0] = (~nCS & ~nRD) ?
                    (Adr) ? {~nINS,BUSY,4'h0,Ctrl[1:0]} : Data[7:0]
                    : 8'hZZ;
assign Ready = (MRDY) ? 1'b0 : 1'bZ;  // If read/write attempt when SPI busy down READY signal

// Synchronous logic
always @(posedge Clk) begin
    // Write to control port maybe asynchronous
    if (~nCS & ~nWR & Adr & ~BEGWRC & ~BEGWR & ~BEGRD)
		BEGWRC <= 1'b1;

	if (nWR & BEGWRC)
		begin
			BEGWRC <= 1'b0;
			Ctrl[1:0] <= Dat[1:0];
		end
		
    // Reset signal high priority
    if (Res)
		begin
			// Clear internal registers
			Ctrl[1:0] <= 2'h0;
			Bits[2:0] <= 3'h0;
			BUSY <= 1'b0;
			SCK <= 1'b0;
			MRDY <= 1'b0;
			BEGWR <= 1'b0;
			BEGWRC <= 1'b0;
			BEGRD <= 1'b0;
			//PRESTART <= 1'b0;
		end 
	else
		begin
			// SPI state
			if (BUSY)
				begin
					// SPI working...
					if (SCK)
						begin
							// SCK low
							SCK <= 1'b0;
							// Falling, shift bits
							Data[7:0] <= {Data[6:0],RMISO};
							// Count bits
							Bits[2:0] <= Bits[2:0] + 3'h1;
							// This is seven bit?
							if (Bits[2] & Bits[1] & Bits[0]) 
								begin
									BUSY <= 1'b0;	// Clear BUSY flag
									MRDY <= 1'b0;	// Goes IO CH RDY to hi-Z
								end;
						end 
					else 
						begin
							// SCK high
							SCK <= 1'b1;
							// Rising, sample data
							RMISO <= MISO;
						end
				end 
			else
				begin
					// Clear bits counter
					Bits[2:0] <= 3'h0;
				end
			
			// Writing to data port (preliminary)
            if (~nCS & ~nWR & ~Adr & ~BEGWR & ~BEGRD & ~BEGWRC)
				begin
					BEGWR <= 1'b1;			// Set preliminary write flag
					if (BUSY)
						// If SPI busy set IO CH RDY low
						MRDY <= 1'b1;
				end
				
			// Final writing to data port (nWR goes high)
			if (nWR & BEGWR)
            begin
				BEGWR <= 1'b0;				// Clear preliminary write flag
				Data[7:0] <= Dat[7:0];       // Grab some data from ISA
				BUSY <= 1'b1;			// Set prestart flag for SPI state machine
            end

			// Reading from data port (preliminary)
            if (~nCS & ~nRD & ~Adr & ~BEGRD & ~BEGWR & ~BEGWRC)
				begin
					BEGRD <= 1'b1;			// Set preliminary read flag
					if (BUSY)
						// If SPI busy set IO CH RDY low
						MRDY <= 1'b1;
					else
						begin
							MRDY <= 1'b1; 				// set IO CH RDY low
							Data[7:0] <= 8'b11111111;	// 0xFF to data register
							BUSY <= 1'b1;			// Set prestart flag for SPI state machine
						end
				end
				
			// Final reading from data port (nRD goes high)
			if (BEGRD & nRD)
            begin
				BEGRD <= 1'b0;				// Clear preliminary read flag
				// all other job done by combinatorics logic
            end
			// Start SPI machine

/*
			if (PRESTART)
				begin
					//MRDY = 1'b1; 				// set IO CH RDY low
					PRESTART <= 1'b0;
					BUSY <= 1'b1;
				end
*/
		end
end

// End
endmodule

newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

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

Post by newold86 »

Вообще в очередной раз заметил, насколько сложно разбираться в чужом проекте... Когда сам погружаешься в свое творение, то все кажется совершенно прозрачным. А когда приходишь со стороны, то фиг чего с наскоку сделаешь, даже в относительно простых случаях, а погрузиться глубже времени/мотивации зачастую не хватает.
В данном случае еще и незнание Verilog’а сильно мешает - несколько раз брался за него, но наличие VHDL’а позволяет реализовывать свои хотелки, поэтому трудно заставить себя выучить еще что-то из той же области...
DimkaM
Maniac
Posts: 261
Joined: 22 Jun 2005 04:35
Location: МО Россия

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

Post by DimkaM »

Tronix wrote:Вот рисунок, карточка ответила на команду 0x1. Внизу клок - это Clk 8 MHz. Сама железка работает от OSC 14,3 MHz, на рисунке не показан, не хватило канала. Какие вы здесь видите аномалии?
При чтении, должно отдаваться прочитанное из СПИ при предыдущей записи. А на картинке не так.
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

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

Post by Tronix »

Короче, распаял все нафиг. И запаял плату от игрового автомата на EPM3256.

У меня тут Robotron EC1834 появился, я перепаял один из его слотов на обычный ISA-8. Так вот, весьма странно он с портами ввода-вывода работает. Например, контроллер XT-IDE работает только первой версии, а в котором увеличина скорость за счет чередования портов - не работает. Так же не работают и CGA/Hercules/EGA/VGA видюшки. Поэтому сижу пока на родной гроботроновской MDA видеокарте, но хочется все-таки разобраться, чего они там с перетасовщиком байт намудрили, и по возможности все-таки пофиксить.

Поэтому, плата скорее переходит в разряд логического анализатора ISA шины, нежели SD-контроллера. Завел на EPM3256 почти все сигналы с ISA шины. Там же на этой платке есть SRAM 32Kb, туда и планирую писать данные по различным триггерам (а триггеры могут быть очень любые - запись в порт/чтение из порта, запись в память и тд и тп), а потом мапить эту SRAM на основную память где-то в районе D8000 или E0000, откуда в последствии стягивать данные простой программой на паскале. Смотреть планирую в sigrock PulseView, оно понимает бинарный формат.

Ну а по окончанию эксперимента с Гроботроном, можно опять перейти к SD, уже на конечном автомате и не завися от клока.

Image

Image
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

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

Post by newold86 »

Tronix wrote:Поэтому, плата скорее переходит в разряд логического анализатора ISA шины,
Подобное уже упоминал здесь - viewtopic.php?f=87&t=17349&start=240#p143418

Только FPGA с внутренней памятью для этого лучше подходит - SignalTap можно использовать. Я даже специально плату под это нарисовал, с некоторыми функциями специально для отладки, но пока ленюсь делать