Да, точно. По памяти писал и сам запуталсяangry_troll wrote:Да вроде должно...
ISA-8 SD-контроллер (SPI) на CPLD
Moderator: Shaos
- 
				Vic3Dexe
 - Doomed
 - Posts: 370
 - Joined: 16 Dec 2014 11:58
 - Location: Киев
 
Re: ISA-8 SD-контроллер (SPI) на CPLD
- 
				Tronix
 - Doomed
 - Posts: 662
 - Joined: 18 Nov 2013 02:38
 - Location: Москва
 
Re: ISA-8 SD-контроллер (SPI) на CPLD
Попробовал вчера опять перескочить с Clk на OSC (14,3 MHz) - не получается. В какой момент комп защелкивает данные после операции чтения? Вот у меня лежит CS, RD и IO CH CHK внизу, SPI сдвигает. В конце поднимается IO CH CHK. Потом через несколько тактов поднимается RD и потом поднимается CS. Данные на шине выставлены сразу после поднятия IO CH CHK и до поднятия RD. Этого мало? Нужно подержать данные немножко и после поднятия RD? Сколько тактов?
			
			
									
						
										
						- 
				newold86
 - Devil
 - Posts: 735
 - Joined: 30 Nov 2013 11:08
 - Location: WWW
 
Re: ISA-8 SD-контроллер (SPI) на CPLD
Данные защелкиваются по завершению (спаду) T3. На этот момент данные должны присутствовать минимум 30 ns, после - еще минимум 10 ns.Tronix wrote: В какой момент комп защелкивает данные после операции чтения?
Если правильные данные есть на момент поднятия MEMR, то проблема, скорее всего, не в hold time.
- 
				Tronix
 - Doomed
 - Posts: 662
 - Joined: 18 Nov 2013 02:38
 - Location: Москва
 
Re: ISA-8 SD-контроллер (SPI) на CPLD
Да неведомо, есть они там или нет. По логике - должны быть. Читает с ошибками...
Похоже без 16-ти канального анализатора дальше не продвинусь.
Или действительно в быстродействие упираюсь... Было вчера несколько раз, что CPLD как будто "зависает" - опускает READY и все... Сдвига уже не происходит. Вечный READY в нуле. Ну и не последнюю роль играет качество кода на верилог. Так как местами уже не лезет в 32 ячейки, приходится играться с настройками Speed/Balanced/Area. Вот на Area по-моему и висла эта система. Увы, много неизвестных.
Попробую еще READY не сразу после сдвига поднять, а обождать такт. Хз зачем, но может внутренний регистр данных "устаканится".
Чем больше играюсь с ним - тем больше вижу что это огромный костыль. Шаг в сторону - все рухает.
			
			
									
						
										
						Похоже без 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
Вот по-моему один из тех случаев, когда стоит хотя бы чуть взглянуть на 'technology map'.
Мне дизайн кажется немножечко кривым, вложенные ифы дают разлапистую логику, которая и может жрать ячейки в цплд.
Я бы написал это всё -- разделённым на блоки, например блок сдвига, счётчик, решатель ready/busy (его можно сделать из старшего бита счётчика).
Не помню, есть ли enable в триггерах epm, если есть -- постарался бы его заюзать в сдвигателе, например.
Ещё наблюдающиеся артефакты могут быть из-за метастабильностей, когда входные данные меняются на фронте клока. Но тут клок вроде с того же ISA идёт и все сигналы на ней синхронны относительно этого клока, по идее в этом дело не может быть.
Ещё бывает, что звон на стробах влияет, например если эти стробы используются для занесения данных с шины в регистры (это ещё не так страшно) или для начала каких-то действий (типа счёта), но это не твой случай.
Ну и наконец ещё раз напомню (вот я зануда
) про slow slew rate и auto turbo bit=off (для епмок).
Без слоу слю рейт фронты очень резкие и от них может звенеть всё по пути
			
			
									
						
							Мне дизайн кажется немножечко кривым, вложенные ифы дают разлапистую логику, которая и может жрать ячейки в цплд.
Я бы написал это всё -- разделённым на блоки, например блок сдвига, счётчик, решатель ready/busy (его можно сделать из старшего бита счётчика).
Не помню, есть ли enable в триггерах epm, если есть -- постарался бы его заюзать в сдвигателе, например.
Ещё наблюдающиеся артефакты могут быть из-за метастабильностей, когда входные данные меняются на фронте клока. Но тут клок вроде с того же ISA идёт и все сигналы на ней синхронны относительно этого клока, по идее в этом дело не может быть.
Ещё бывает, что звон на стробах влияет, например если эти стробы используются для занесения данных с шины в регистры (это ещё не так страшно) или для начала каких-то действий (типа счёта), но это не твой случай.
Ну и наконец ещё раз напомню (вот я зануда
Без слоу слю рейт фронты очень резкие и от них может звенеть всё по пути
привет засранцу лавру :)
			
						- 
				Tronix
 - Doomed
 - Posts: 662
 - Joined: 18 Nov 2013 02:38
 - Location: Москва
 
Re: ISA-8 SD-контроллер (SPI) на CPLD
Взглянул. Не понял ровным счетом ничего. Но красивоangry_troll wrote:стоит хотя бы чуть взглянуть на 'technology map'.
Мне не кажется. Я уверен что это самый кривой дизайн, который только возможен. Индусы нервно курят в сторонке.angry_troll wrote:Мне дизайн кажется немножечко кривым, вложенные ифы дают разлапистую логику, которая и может жрать ячейки в цплд.
Но по другому не знаю как. Начинаешь писать "правильно" - тут же заканчиваются 32 ячейки.
Это очевидная вешь, выделить сдвигатель в отдельный блок. Но у меня не получается. Как только делаю два allways (Clk), сразу начинает ругаться что нельзя совместно использовать одни и те же регистры в двух блоках. А как их не использовать, когда там всюду нужны хотя бы внутренний регистр данных? Да и остальные внутренние регистры то же.angry_troll wrote:Я бы написал это всё -- разделённым на блоки, например блок сдвига,
Да я посмотрел описание в квартусе, про Slow slew rate, увидел что оно влияет на только на output, ну и подумал что мне это не надо. Клок на SPI хороший, нажористый, MISO тоже ничего так с виду. Но врублю конечно, не сложно. Вот только на производительности это не скажется? Про auto turbo bit=off не читал пока...angry_troll wrote:Ну и наконец ещё раз напомню (вот я зануда ) про slow slew rate и auto turbo bit=off (для епмок).
Без слоу слю рейт фронты очень резкие и от них может звенеть всё по пути
Спасибо, буду дальше тыркаться.
- 
				newold86
 - Devil
 - Posts: 735
 - Joined: 30 Nov 2013 11:08
 - Location: WWW
 
Re: ISA-8 SD-контроллер (SPI) на CPLD
Я (просто интуитивно, без объективных причин) уверен, что дело не в метастабильностях и формах сигналов, или в недостатке быстродействия из-за вложенности, а в принципиальной ошибке дизайна в каком-то месте.
			
			
									
						
										
						- 
				Tronix
 - Doomed
 - Posts: 662
 - Joined: 18 Nov 2013 02:38
 - Location: Москва
 
Re: ISA-8 SD-контроллер (SPI) на CPLD
Почему-то тоже так кажется. Большой опыт наступления на грабли, наверное -)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
При этом уронили 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;
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: 735
 - Joined: 30 Nov 2013 11:08
 - Location: WWW
 
Re: ISA-8 SD-контроллер (SPI) на CPLD
Неплохо бы погонять это в ModelSim - скорее всего, все станет понятно.
			
			
									
						
										
						- 
				angry_troll
 - Doomed
 - Posts: 449
 - Joined: 08 Apr 2013 04:04
 - Location: 213.247.249.139
 
Re: ISA-8 SD-контроллер (SPI) на CPLD
Все так начиналиTronix wrote:Мне не кажется. Я уверен что это самый кривой дизайн, который только возможен. Индусы нервно курят в сторонке.
Лёгкий апгрейд на epm3064 не думал сделать? Вроде по пинам 1к1 (ну или чуть больше IO у 3064, остальные такие же).Но по другому не знаю как. Начинаешь писать "правильно" - тут же заканчиваются 32 ячейки.
Ну так логично же, одним регистром рули в одном always. Если рулишь в разных, то даже чисто с т.з. семантики верилога, разные блоки always могут исполняться в произвольном порядке (это актуально при моделировании в моделсимах разных). А с т.з. синтеза -- просто запрещено. Пиши по-другомуЭто очевидная вешь, выделить сдвигатель в отдельный блок. Но у меня не получается. Как только делаю два allways (Clk), сразу начинает ругаться что нельзя совместно использовать одни и те же регистры в двух блоках. А как их не использовать, когда там всюду нужны хотя бы внутренний регистр данных? Да и остальные внутренние регистры то же.
Например так: в одном always у тебя сдвигатель, управляется сигналами (wire) типа enable, load и что там ещё.
В другом -- счётчик, который при обращении компа инициализируется на 0 и начинает считать (его младший разряд может быть enable для сдвигателя и sck, старший -- busy).
Отдельно -- assignы для управляющих сигналов. Ну и в таком духе.
Поверь, это опыт (slow slew rate)Да я посмотрел описание в квартусе, про Slow slew rate, увидел что оно влияет на только на output, ну и подумал что мне это не надо. Клок на SPI хороший, нажористый, MISO тоже ничего так с виду. Но врублю конечно, не сложно. Вот только на производительности это не скажется? Про auto turbo bit=off не читал пока...
Даже на 2-слойных платах как правило без слоу слю рейт ничего не работает или глючит. А уж у тебя на макетке...
Хорошо, если у тебя 4-6 слойка, слой сплошной земли, питания, хорошая блокировка по питанию, и тебе надо выжать максимум частоты для прокидывания сигнала по плате. А в любом ином случае -- slow slew rate вообще не думая втыкай
Slow slew rate относится ислючительно к выходным пинам, на быстродействии внутренностей не скажется никак. Вот турбо бит -- относится к внутренностям, но на 14 мгц тебе точно хватит быстродействия
привет засранцу лавру :)
			
						- 
				Tronix
 - Doomed
 - Posts: 662
 - Joined: 18 Nov 2013 02:38
 - Location: Москва
 
Re: ISA-8 SD-контроллер (SPI) на CPLD
Да думал... Но а) в чип и дипе нету. На барахолках тоже. Из китая ее тащить? Не известно еще, может бу залоченная придет (или с назначенными выводами JTAG), а как разлочить без программатора от альтеры за десятьмильонов уе так до конца и не выяснили вроде на форуме zx.pk. б) Хочется все-таки уложиться, задача то простейшая...angry_troll wrote:Лёгкий апгрейд на epm3064 не думал сделать?
Остальное попробую, спасибо за информацию.
И тут еще подумал, посмотрев на начало:
Code: Select all
always @(posedge Clk) begin
Сложно засимулировать реальное поведение шины, особенно когда не видишь его (а я пока не все вижу со своими 8-ми каналами).newold86 wrote:Неплохо бы погонять это в ModelSim - скорее всего, все станет понятно.
- 
				angry_troll
 - Doomed
 - Posts: 449
 - Joined: 08 Apr 2013 04:04
 - Location: 213.247.249.139
 
Re: ISA-8 SD-контроллер (SPI) на CPLD
да хоть бы и залоченная - с продавца потребуешь возврат или минусов ему наставишь в отзывы. Вроде не 100 баксов стоитTronix wrote:Из китая ее тащить? Не известно еще, может бу залоченная придет (или с назначенными выводами JTAG), а как разлочить без программатора от альтеры за десятьмильонов уе так до конца и не выяснили вроде на форуме zx.pk. б) Хочется все-таки уложиться, задача то простейшая...
ни в коем случае! если клок - то только он, если асинхр сброс еще - то добавляется к клоку. если замена assign или латч - то always @*Список чувствительности... А если RD поднимется на negedge Clk то получается в холостую один такт пройдет.. Может основные сигналы (CS, WR, RD) тоже в список чувствительности включить.... Хотя влиять не должно на логику, но кто знает...Code: Select all
always @(posedge Clk) begin
все остальное - это несинтезируемый ахтунг
привет засранцу лавру :)
			
						- 
				angry_troll
 - Doomed
 - Posts: 449
 - Joined: 08 Apr 2013 04:04
 - Location: 213.247.249.139
 
Re: ISA-8 SD-контроллер (SPI) на CPLD
Ох нифига, я сразу-то и не заметил.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
Code: Select all
always @(negedge wr, negedge rst_access_n)
 if(!rst_access_n)
  access_in_progress <= 0;
else
 access_in_progress <= 1;
далее: как только вскочил 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;
Есть ещё вариант, который требует относительно быстрого клока (например для z80 на 14мгц более-менее комфортно с клоком x4, т.е. 56мгц, не знаю про времянки ИСА).
В этом случае ты сразу пересинхронизируешь и выделяешь фронты из сигналов типа rd и wr, а всё остальное делаешь синхронно на этом быстром клоке, например копируешь данные с ШД в буфер записи и т.д.
В обоих случаях асинхронное ещё будет чтение на шину, и в 1ом случае -- его можно сразу делать из сдвигового регистра, т.к. пока он двигается, будет гарантированно вейт при попытке обращения. Да и во 2ом тоже наверное так же можно.
ps: ну и на 3032 с такими подходами можно не рассчитывать
привет засранцу лавру :)
			
						- 
				newold86
 - Devil
 - Posts: 735
 - Joined: 30 Nov 2013 11:08
 - Location: WWW
 
Re: ISA-8 SD-контроллер (SPI) на CPLD
Зачем READY как inout объявлен ?
			
			
									
						
										
						- 
				newold86
 - Devil
 - Posts: 735
 - Joined: 30 Nov 2013 11:08
 - Location: WWW
 
Re: ISA-8 SD-контроллер (SPI) на CPLD
В первом приближении взглянул на запись в ModelSim:
Возможно, что-то делаю не так, но почему READY не сбрасывается в 0 ?
			
			
						You do not have the required permissions to view the files attached to this post.
			
						
										
						
				