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

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

Moderator: Shaos

Vic3Dexe
Doomed
Posts: 370
Joined: 16 Dec 2014 11:58
Location: Киев

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

Post by Vic3Dexe »

angry_troll wrote:Да вроде должно...
Да, точно. По памяти писал и сам запутался :)
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

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

Post by Tronix »

Попробовал вчера опять перескочить с Clk на OSC (14,3 MHz) - не получается. В какой момент комп защелкивает данные после операции чтения? Вот у меня лежит CS, RD и IO CH CHK внизу, SPI сдвигает. В конце поднимается IO CH CHK. Потом через несколько тактов поднимается RD и потом поднимается CS. Данные на шине выставлены сразу после поднятия IO CH CHK и до поднятия RD. Этого мало? Нужно подержать данные немножко и после поднятия RD? Сколько тактов?
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

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

Post by newold86 »

Tronix wrote: В какой момент комп защелкивает данные после операции чтения?
Данные защелкиваются по завершению (спаду) T3. На этот момент данные должны присутствовать минимум 30 ns, после - еще минимум 10 ns.
Если правильные данные есть на момент поднятия MEMR, то проблема, скорее всего, не в hold time.
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

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

Post by Tronix »

Да неведомо, есть они там или нет. По логике - должны быть. Читает с ошибками...
Похоже без 16-ти канального анализатора дальше не продвинусь.
Или действительно в быстродействие упираюсь... Было вчера несколько раз, что CPLD как будто "зависает" - опускает READY и все... Сдвига уже не происходит. Вечный READY в нуле. Ну и не последнюю роль играет качество кода на верилог. Так как местами уже не лезет в 32 ячейки, приходится играться с настройками Speed/Balanced/Area. Вот на Area по-моему и висла эта система. Увы, много неизвестных.
Попробую еще READY не сразу после сдвига поднять, а обождать такт. Хз зачем, но может внутренний регистр данных "устаканится".
Чем больше играюсь с ним - тем больше вижу что это огромный костыль. Шаг в сторону - все рухает.
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 »

Вот по-моему один из тех случаев, когда стоит хотя бы чуть взглянуть на 'technology map'.

Мне дизайн кажется немножечко кривым, вложенные ифы дают разлапистую логику, которая и может жрать ячейки в цплд.

Я бы написал это всё -- разделённым на блоки, например блок сдвига, счётчик, решатель ready/busy (его можно сделать из старшего бита счётчика).

Не помню, есть ли enable в триггерах epm, если есть -- постарался бы его заюзать в сдвигателе, например.


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

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

Ну и наконец ещё раз напомню (вот я зануда :)) про slow slew rate и auto turbo bit=off (для епмок).
Без слоу слю рейт фронты очень резкие и от них может звенеть всё по пути :)
привет засранцу лавру :)
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

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

Post by Tronix »

angry_troll wrote:стоит хотя бы чуть взглянуть на 'technology map'.
Взглянул. Не понял ровным счетом ничего. Но красиво :mrgreen:
angry_troll wrote:Мне дизайн кажется немножечко кривым, вложенные ифы дают разлапистую логику, которая и может жрать ячейки в цплд.
Мне не кажется. Я уверен что это самый кривой дизайн, который только возможен. Индусы нервно курят в сторонке.
Но по другому не знаю как. Начинаешь писать "правильно" - тут же заканчиваются 32 ячейки.
angry_troll wrote:Я бы написал это всё -- разделённым на блоки, например блок сдвига,
Это очевидная вешь, выделить сдвигатель в отдельный блок. Но у меня не получается. Как только делаю два allways (Clk), сразу начинает ругаться что нельзя совместно использовать одни и те же регистры в двух блоках. А как их не использовать, когда там всюду нужны хотя бы внутренний регистр данных? Да и остальные внутренние регистры то же.
angry_troll wrote:Ну и наконец ещё раз напомню (вот я зануда ) про slow slew rate и auto turbo bit=off (для епмок).
Без слоу слю рейт фронты очень резкие и от них может звенеть всё по пути
Да я посмотрел описание в квартусе, про Slow slew rate, увидел что оно влияет на только на output, ну и подумал что мне это не надо. Клок на SPI хороший, нажористый, MISO тоже ничего так с виду. Но врублю конечно, не сложно. Вот только на производительности это не скажется? Про auto turbo bit=off не читал пока...

Спасибо, буду дальше тыркаться.
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

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

Post by newold86 »

Я (просто интуитивно, без объективных причин) уверен, что дело не в метастабильностях и формах сигналов, или в недостатке быстродействия из-за вложенности, а в принципиальной ошибке дизайна в каком-то месте.
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

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

Post by Tronix »

newold86 wrote:Я (просто интуитивно, без объективных причин) уверен, что дело не в метастабильностях и формах сигналов, или в недостатке быстродействия из-за вложенности, а в принципиальной ошибке дизайна в каком-то месте.
Почему-то тоже так кажется. Большой опыт наступления на грабли, наверное -)
Кстати клок то щаз не синхронизирован с системным. Сейчас тактуется от OSC 14,3 MHz, а он не синхронен никак с CLK.

Но мне кажется это не важно - дождались CS и RD и не установлен флаг начала чтения и не установлен флаг начала записи -отметили во флаге "начало чтения из порта":

Code: Select all

			// Reading from data port (preliminary)
            if (~nCS & ~nRD & ~Adr & ~BEGRD & ~BEGWR)
				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 start flag for SPI state machine
						end
Все, на следующий такт мы сюда не должны больше попасть, так как BEGRD = 1.
При этом уронили READY в любом случае и либо уже биты сдвигались (например при предыдущей записи в порт), либо начали сдвигать биты SPI. При достижении 7-ого бита отпустится READY.
В это время на шину данных все время выставляется данные из регистра данных. К седьмому биту там должен быть полноценный байт данных:

Code: Select all

assign Dat[7:0] = (~nCS & ~nRD) ?
                    (Adr) ? {~nINS,BUSY,4'h0,Ctrl[1:0]} : Data[7:0]
                    : 8'hZZ;
Когда отпустится READY, комп начнет поднимать RD к верху. Этот момент тоже смотрим, чтобы сбросить флаг "начала чтения из порта)

Code: Select all

			// 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

Не знаю...
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

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

Post by newold86 »

Неплохо бы погонять это в ModelSim - скорее всего, все станет понятно.
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 »

Tronix wrote:Мне не кажется. Я уверен что это самый кривой дизайн, который только возможен. Индусы нервно курят в сторонке.
Все так начинали :)
Но по другому не знаю как. Начинаешь писать "правильно" - тут же заканчиваются 32 ячейки.
Лёгкий апгрейд на epm3064 не думал сделать? Вроде по пинам 1к1 (ну или чуть больше IO у 3064, остальные такие же).

Это очевидная вешь, выделить сдвигатель в отдельный блок. Но у меня не получается. Как только делаю два allways (Clk), сразу начинает ругаться что нельзя совместно использовать одни и те же регистры в двух блоках. А как их не использовать, когда там всюду нужны хотя бы внутренний регистр данных? Да и остальные внутренние регистры то же.
Ну так логично же, одним регистром рули в одном always. Если рулишь в разных, то даже чисто с т.з. семантики верилога, разные блоки always могут исполняться в произвольном порядке (это актуально при моделировании в моделсимах разных). А с т.з. синтеза -- просто запрещено. Пиши по-другому :)

Например так: в одном always у тебя сдвигатель, управляется сигналами (wire) типа enable, load и что там ещё.
В другом -- счётчик, который при обращении компа инициализируется на 0 и начинает считать (его младший разряд может быть enable для сдвигателя и sck, старший -- busy).
Отдельно -- assignы для управляющих сигналов. Ну и в таком духе.


Да я посмотрел описание в квартусе, про Slow slew rate, увидел что оно влияет на только на output, ну и подумал что мне это не надо. Клок на SPI хороший, нажористый, MISO тоже ничего так с виду. Но врублю конечно, не сложно. Вот только на производительности это не скажется? Про auto turbo bit=off не читал пока...
Поверь, это опыт (slow slew rate) :)
Даже на 2-слойных платах как правило без слоу слю рейт ничего не работает или глючит. А уж у тебя на макетке... :)
Хорошо, если у тебя 4-6 слойка, слой сплошной земли, питания, хорошая блокировка по питанию, и тебе надо выжать максимум частоты для прокидывания сигнала по плате. А в любом ином случае -- slow slew rate вообще не думая втыкай :) Резкий фронт -- это резкий импульс тока в провод, чтоб этот фронт обеспечить, и при этом обратный ток течёт, очевидно, по шинам питания и земли. Потенциалы которых от такого счастья подскакивают (в соответствии с U=-LdI/dt) и т.д.

Slow slew rate относится ислючительно к выходным пинам, на быстродействии внутренностей не скажется никак. Вот турбо бит -- относится к внутренностям, но на 14 мгц тебе точно хватит быстродействия :) Впрочем, можешь и проверить -- задай ква частоту клока.
привет засранцу лавру :)
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

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

Post by Tronix »

angry_troll wrote:Лёгкий апгрейд на epm3064 не думал сделать?
Да думал... Но а) в чип и дипе нету. На барахолках тоже. Из китая ее тащить? Не известно еще, может бу залоченная придет (или с назначенными выводами JTAG), а как разлочить без программатора от альтеры за десятьмильонов уе так до конца и не выяснили вроде на форуме zx.pk. б) Хочется все-таки уложиться, задача то простейшая...

Остальное попробую, спасибо за информацию.

И тут еще подумал, посмотрев на начало:

Code: Select all

always @(posedge Clk) begin
Список чувствительности... А если RD поднимется на negedge Clk то получается в холостую один такт пройдет.. Может основные сигналы (CS, WR, RD) тоже в список чувствительности включить.... Хотя влиять не должно на логику, но кто знает...
newold86 wrote:Неплохо бы погонять это в ModelSim - скорее всего, все станет понятно.
Сложно засимулировать реальное поведение шины, особенно когда не видишь его (а я пока не все вижу со своими 8-ми каналами).
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 »

Tronix wrote:Из китая ее тащить? Не известно еще, может бу залоченная придет (или с назначенными выводами JTAG), а как разлочить без программатора от альтеры за десятьмильонов уе так до конца и не выяснили вроде на форуме zx.pk. б) Хочется все-таки уложиться, задача то простейшая...
да хоть бы и залоченная - с продавца потребуешь возврат или минусов ему наставишь в отзывы. Вроде не 100 баксов стоит :)

Code: Select all

always @(posedge Clk) begin
Список чувствительности... А если RD поднимется на negedge Clk то получается в холостую один такт пройдет.. Может основные сигналы (CS, WR, RD) тоже в список чувствительности включить.... Хотя влиять не должно на логику, но кто знает...
ни в коем случае! если клок - то только он, если асинхр сброс еще - то добавляется к клоку. если замена assign или латч - то always @*
все остальное - это несинтезируемый ахтунг :)
привет засранцу лавру :)
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 »

Tronix wrote: Кстати клок то щаз не синхронизирован с системным. Сейчас тактуется от OSC 14,3 MHz, а он не синхронен никак с CLK.
Ох нифига, я сразу-то и не заметил.
Ну тогда любые сбои, раз в 2 обращения, раз в 10 обращений, раз в 100000 -- смело списывай на метастабильности. Любые начинающиеся или кончающиеся глюки от незначительного изменения сорца -- тоже :)

По-хорошему надо делать пересинхронизацию.
Для относительно медленного клока я бы сделал так (ахтунг -- это скорее псевдокод, чем верилог):

Code: Select all

assign rd = (addr==чему нужно) & (~rd) & (~cs) и что ещё там
assign wr = так же
далее:

Code: Select all

always @(negedge wr)
 write_buffer <= databus
сигнал вейта (или не-реди):

Code: Select all

assign wait = (rd | wr) && access_in_progress
access_in_progress так примерно:

Code: Select all

always @(negedge wr, negedge rst_access_n)
 if(!rst_access_n)
  access_in_progress <= 0;
else
 access_in_progress <= 1;
тут триггер с асинхронным сбросом и "синхронной" загрузкой единички (т.е. на клок подан wr)

далее: как только вскочил access_in_progress (записалось то что нужно передать в SPI),
ты его пересинкиваешь через 2 триггера и 3им выделяешь фронт примерно так:

Code: Select all

always @(posedge clk)
begin
 sync1 <= access_in_progress
 sync2 <= sync1
 edge <= sync2
end
assign start_access = edge==1'b0 && sync2==1'b1;
по этому старту ты уже на клоке спокойно копируешь write_buffer в сдвиговый регистр и начинаешь передавать, а как передал -- 1тактовым импульсом отщёлкиваешь access_in_progress.

Есть ещё вариант, который требует относительно быстрого клока (например для z80 на 14мгц более-менее комфортно с клоком x4, т.е. 56мгц, не знаю про времянки ИСА).
В этом случае ты сразу пересинхронизируешь и выделяешь фронты из сигналов типа rd и wr, а всё остальное делаешь синхронно на этом быстром клоке, например копируешь данные с ШД в буфер записи и т.д.

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

ps: ну и на 3032 с такими подходами можно не рассчитывать :) первый вариант может быть в 3064 влезет, а второму точно 3128 понадобится...
привет засранцу лавру :)
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

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

Post by newold86 »

Зачем READY как inout объявлен ?
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

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

Post by newold86 »

В первом приближении взглянул на запись в ModelSim:
MX2write.jpg
Возможно, что-то делаю не так, но почему READY не сбрасывается в 0 ?
You do not have the required permissions to view the files attached to this post.