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

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

Moderator: Shaos

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

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

Post by newold86 »

Tronix wrote: А как понять, что чтение из порта произошло?
А зачем ?
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

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

Post by Tronix »

Вообщем не сдается наш гордый варяг. Вчера весь день провозился с тремя строчками кода в верилоге безрезультатно. Добился того, что все отлично работает

out dx,al
out dx,al
out dx,al

выполняется

out dx,al
in al,dx

выполняется

in al,dx
in al,dx
in al,dx

выполняется

in al,dx
out dx,al

выполняется

Но когда инициализируется SD карта и идет чтение сектора в какой-то момент сдвигается 7 бит, вместо 8. И дальше опять по 8 бит. Оно даже умудряется при таком раскладе как-то работать, но так нельзя.
При тестовых прогонах не могу достичь такого-же эффекта. Все работает как надо.
Не могу закономерности выявить. Попробую на неделе еще раз подойти к устройству.
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

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

Post by Lavr »

Tronix wrote:Вчера весь день провозился с тремя строчками кода в верилоге безрезультатно.

out dx,al
out dx,al
out dx,al

выполняется

out dx,al
in al,dx
Ну я не гигантский спец в верилоге и прочих этих языках, но когда я тут начинал, и мне помогали
все коллеги по форуму, обратил я внимание на одно замечание, что текст в верилоге - это не программа
в привычном понимании
, там многие вещи выполняются одновременно, если не сказано иное.
Может быть, ты на этом спотыкаешься?
iLavr
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

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

Post by Tronix »

Lavr wrote:многие вещи выполняются одновременно, если не сказано иное.
Может быть, ты на этом спотыкаешься?
Это у меня в начале тоже было такое, сейчас вроде "переключился". Однако конечно влияет полное отсутствие опыта и никаких средств отладки, кроме внешнего анализатора. Наверное начать было нужно все-таки со светодиода на нормальной отладке с нормальной ПЛИС.
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

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

Post by newold86 »

Tronix wrote:Но когда инициализируется SD карта и идет чтение сектора в какой-то момент сдвигается 7 бит, вместо 8.
Возможно, где-то быстродействия не хватает, хотя маловероятно. Можно попробовать на пониженной тактовой частоте
DimkaM
Maniac
Posts: 261
Joined: 22 Jun 2005 04:35
Location: МО Россия

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

Post by DimkaM »

Tronix wrote:Но когда инициализируется SD карта и идет чтение сектора в какой-то момент сдвигается 7 бит, вместо 8.
У меня нечто похожее было когда визнет подключал по spi к спектруму.
Вот здесь я об этом намекал viewtopic.php?p=141508#p141508

Как оказалось - несоответствие времянок spi, не помню точно толи слишком рано, толи слишком поздно защёлкивался MOSI в рег.

Чуть сдвинул и всё заработало.
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

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

Post by Tronix »

newold86 wrote:
Tronix wrote:Но когда инициализируется SD карта и идет чтение сектора в какой-то момент сдвигается 7 бит, вместо 8.
Возможно, где-то быстродействия не хватает, хотя маловероятно. Можно попробовать на пониженной тактовой частоте
Да ну не, как это? Там же цикл грубо говоря. Пока до семи не досчитает (счет от нуля), не снимется флаг занятости и не поднимется READY. То есть до семи он досчитывает. Начинает не с ноля? Потенциально вижу что-то такое, но картинка каждый раз рассыпается когда пытаюсь в уме прокрутить код.

 Сейчас там так

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 & ~BEGWR & ~BEGRD)
				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 & ~BEGRD & ~BEGWR)
				begin
					BEGRD = 1'b1;			// установим признак начала чтения
					if (BUSY)
						// если SPI занят, положим сигнал READY вниз
						MRDY = 1'b1;
					else
						begin
							MRDY = 1'b1;
							Data[7:0] = 8'b11111111;
							BUSY = 1'b1;
						end
				end
				
			// Чтение из порта данных окончательное (nRD переключился)
			if (BEGRD & nRD)
            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 »

Не знаю как, в который уже раз, но поехало. Перед запуском SPI обождал один цикл, введя регистр. Какой-то отдаленной частью мозга понимаю, почему так, но объяснить не могу :)

 Неведомый рабочий код

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)
reg PRESTART;
// Комбинаторика
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;
			PRESTART <= 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 & ~BEGWR & ~BEGRD)
				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];
				PRESTART <= 1'b1;
            end

			// Чтение из порта данных (предварительное)
            if (~nCS & ~nRD & ~Adr & ~BEGRD & ~BEGWR)
				begin
					BEGRD = 1'b1;			// onoaiiaei i?eciae ia?aea ?oaiey
					if (BUSY)
						// если SPI занят, положим сигнал READY вниз
						MRDY = 1'b1;
					else
						begin
							MRDY = 1'b1;
							Data[7:0] = 8'b11111111;
							PRESTART <= 1'b1;
						end
				end
				
			// Чтение из порта данных окончательное (nRD переключился)
			if (BEGRD & nRD)
            begin
				BEGRD = 1'b0;				// сбросим признак начала чтения
				// остальное сделает синхронная логика
            end

			if (PRESTART)
				begin
					PRESTART <= 1'b0;
					BUSY <= 1'b1;
				end
		end
end

// Конец
endmodule

User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

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

Post by Lavr »

Tronix wrote:Перед запуском SPI обождал один цикл, введя регистр.
Если тебе не трудно - выложи конверсию кода в схему.
Интересно взглянуть, как Квартус себе это представляет...
iLavr
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

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

Post by Tronix »

Lavr wrote:
Tronix wrote:Перед запуском SPI обождал один цикл, введя регистр.
Если тебе не трудно - выложи конверсию кода в схему.
Интересно взглянуть, как Квартус себе это представляет...
Да мне не трудно, выкладываю, но схема мало-информативная, на мой взгляд.

Так как аппаратная часть более менее устаканилась вроде, задумался о BIOS. newold86 - вы каким ассемблером собирали? Я собрал ваш биос wasm. Собрался более-менее. Думаю в идеале бы написать эмулятор SD карты и встроить куда-нибудь в эмулятор PCEm....
You do not have the required permissions to view the files attached to this post.
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

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

Post by newold86 »

Tronix wrote:Да мне не трудно, выкладываю, но схема мало-информативная, на мой взгляд.
Я схемы от Quartus'а понимаю только в том случае, когда знаю совершенно определенно, в какое именно место нужно смотреть (если есть четко локализованная проблема, с которой нужно разобраться). В целях общего понимая картинки из Quartus'а в моей голове не помещаются...
Tronix wrote:newold86 - вы каким ассемблером собирали? Я собрал ваш биос wasm. Собрался более-менее. Думаю в идеале бы написать эмулятор SD карты и встроить куда-нибудь в эмулятор PCEm....
MASM6 - я вроде ничего там не применял компиляторно-зависимого, так как все подобные штучки давно забыл :)

Как уже говорил, мой код нужно доделать, как минимум, в части пересчета CHS, так как сейчас все жестко завязано на конкретный образ диска http://zet.aluzina.org/images/9/9c/C.img.zip
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 »

newold86 wrote:
Tronix wrote:Да мне не трудно, выкладываю, но схема мало-информативная, на мой взгляд.
Я схемы от Quartus'а понимаю только в том случае, когда знаю совершенно определенно, в какое именно место нужно смотреть (если есть четко локализованная проблема, с которой нужно разобраться). В целях общего понимая картинки из Quartus'а в моей голове не помещаются...
Имеет какой-то смысл смотреть только схемы "technology map", где ква раскладывает по ячейкам.
А вот смотреть RTL viewer'ом (как на картинке выше) нет никакого смысла -- там ровно то же самое, что и в верилоге понаписали, только картинками. На что какбэ название и намекает - "RTL viewer".
привет засранцу лавру :)
Vic3Dexe
Doomed
Posts: 370
Joined: 16 Dec 2014 11:58
Location: Киев

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

Post by Vic3Dexe »

Tronix wrote:Да мне не трудно, выкладываю, но схема мало-информативная, на мой взгляд.
newold86 wrote:Я схемы от Quartus'а понимаю только в том случае, когда знаю совершенно определенно, в какое именно место нужно смотреть (если есть четко локализованная проблема, с которой нужно разобраться)
Соглашусь с обоими ораторами. Ежели просто посмотреть чего-ты-там-накодил в виде схемы - сие нечитабельно от слова совсем.
А вот если есть некий неуловимый баг, то схема иногда очень четко дает понять, что у тебя лажа.

Увы, сейчас примера картинки привести не могу, но надо было мне выполнить ротацию 8-битного регистра на бит влево по posedge.

Code: Select all

alaways @(posedge CLK)
  some_reg <= {some_reg[6:1],some_reg[7]}; //да, я знаю, что это даже не компильнется, но мой баг был очень похож
Угу, когда внимание акцентировано, понятно, что тут ошибка, и понятно где. Но когда глаз "замылен" - хоть застрелись, но ничерта не видно.
Зато, когда смотришь в схему, видишь полнейшую бредятину.
angry_troll wrote:Имеет какой-то смысл смотреть только схемы "technology map", где ква раскладывает по ячейкам
Какой именно смысл?
Я спрашиваю, потому как сам тупил в ЭТО, но так и не понял, зачем мне это надо.
Не, я знаю, что вроде можно как-то рулить фиттером, если очень надо обеспечить задержку от А до Б, но... у меня задач таких не было.
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 »

Vic3Dexe wrote:

Code: Select all

alaways @(posedge CLK)
  some_reg <= {some_reg[6:1],some_reg[7]}; //да, я знаю, что это даже не компильнется, но мой баг был очень похож
Да вроде должно... (компильнуться) :)
angry_troll wrote:Имеет какой-то смысл смотреть только схемы "technology map", где ква раскладывает по ячейкам
Какой именно смысл?
Я спрашиваю, потому как сам тупил в ЭТО, но так и не понял, зачем мне это надо.
Не, я знаю, что вроде можно как-то рулить фиттером, если очень надо обеспечить задержку от А до Б, но... у меня задач таких не было.
Ну самый прямой, что-то сложнее A+B можно написать мульёном разных способов, и какой-нибудь из них может плохо лечь на ячейки (особенно актуально для ФПГА, где [в недорогих] ячейки строго 4-входовые), например в случае приоритетных энкодеров или мультиплексора "много-в-1". Есть правда лажа с тем, что в больших дизайнах уже каша, но тем не менее, может оказаться полезным. Ещё вариант вспомнил. Допустим, допущена какая-то ошибка, из-за которой какие-либо выходы всегда 0 (или всегда 1). В технолоджи вьювере это сразу будет видно (выход будет подсоединён к константе и ещё в таких случаях куча логики обычно выпиливаeтся ква). Другое дело что причину этого ни один из этих вьюверов не сообщит, да.

Ну и пожалуй соглашусь с тем, что лажа может быть и в ртл вьювере видна. Иногда :)
привет засранцу лавру :)
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

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

Post by Lavr »

Vic3Dexe wrote:Ежели просто посмотреть чего-ты-там-накодил в виде схемы - сие нечитабельно от слова совсем.
На мой взгляд - всё вполне читабельно. Не хотел лишний раз здесь оффтопить, но спасибо Tronix-у, что не отказал.
Меня как раз интересует, как эти системы представляют схемотехнически свой код. Мне лично это кажется полезным.
iLavr