nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 13:44



Reply to topic  [ 198 posts ]  Go to page Previous  1 ... 9, 10, 11, 12, 13, 14  Next
ISA-8 SD-контроллер (SPI) на CPLD 
Author Message
Doomed

Joined: 16 Dec 2014 11:58
Posts: 370
Location: Киев
Reply with quote
angry_troll wrote:
Да вроде должно...

Да, точно. По памяти писал и сам запутался :)


23 Dec 2017 00:19
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Попробовал вчера опять перескочить с Clk на OSC (14,3 MHz) - не получается. В какой момент комп защелкивает данные после операции чтения? Вот у меня лежит CS, RD и IO CH CHK внизу, SPI сдвигает. В конце поднимается IO CH CHK. Потом через несколько тактов поднимается RD и потом поднимается CS. Данные на шине выставлены сразу после поднятия IO CH CHK и до поднятия RD. Этого мало? Нужно подержать данные немножко и после поднятия RD? Сколько тактов?

_________________
https://t.me/tronix_blog


23 Dec 2017 23:59
Profile
Devil

Joined: 30 Nov 2013 11:08
Posts: 706
Location: WWW
Reply with quote
Tronix wrote:
В какой момент комп защелкивает данные после операции чтения?

Данные защелкиваются по завершению (спаду) T3. На этот момент данные должны присутствовать минимум 30 ns, после - еще минимум 10 ns.
Если правильные данные есть на момент поднятия MEMR, то проблема, скорее всего, не в hold time.


24 Dec 2017 00:24
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Да неведомо, есть они там или нет. По логике - должны быть. Читает с ошибками...
Похоже без 16-ти канального анализатора дальше не продвинусь.
Или действительно в быстродействие упираюсь... Было вчера несколько раз, что CPLD как будто "зависает" - опускает READY и все... Сдвига уже не происходит. Вечный READY в нуле. Ну и не последнюю роль играет качество кода на верилог. Так как местами уже не лезет в 32 ячейки, приходится играться с настройками Speed/Balanced/Area. Вот на Area по-моему и висла эта система. Увы, много неизвестных.
Попробую еще READY не сразу после сдвига поднять, а обождать такт. Хз зачем, но может внутренний регистр данных "устаканится".
Чем больше играюсь с ним - тем больше вижу что это огромный костыль. Шаг в сторону - все рухает.

_________________
https://t.me/tronix_blog


24 Dec 2017 00:38
Profile
Doomed

Joined: 08 Apr 2013 04:04
Posts: 449
Location: 213.247.249.139
Reply with quote
Вот по-моему один из тех случаев, когда стоит хотя бы чуть взглянуть на 'technology map'.

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

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

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


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

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

Ну и наконец ещё раз напомню (вот я зануда :)) про slow slew rate и auto turbo bit=off (для епмок).
Без слоу слю рейт фронты очень резкие и от них может звенеть всё по пути :)

_________________
привет засранцу лавру :)


24 Dec 2017 03:13
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
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 не читал пока...

Спасибо, буду дальше тыркаться.

_________________
https://t.me/tronix_blog


24 Dec 2017 08:36
Profile
Devil

Joined: 30 Nov 2013 11:08
Posts: 706
Location: WWW
Reply with quote
Я (просто интуитивно, без объективных причин) уверен, что дело не в метастабильностях и формах сигналов, или в недостатке быстродействия из-за вложенности, а в принципиальной ошибке дизайна в каком-то месте.


24 Dec 2017 09:27
Profile
Doomed

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


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

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

Code:
         // 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:
assign Dat[7:0] = (~nCS & ~nRD) ?
                    (Adr) ? {~nINS,BUSY,4'h0,Ctrl[1:0]} : Data[7:0]
                    : 8'hZZ;


Когда отпустится READY, комп начнет поднимать RD к верху. Этот момент тоже смотрим, чтобы сбросить флаг "начала чтения из порта)

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



Не знаю...

_________________
https://t.me/tronix_blog


24 Dec 2017 10:17
Profile
Devil

Joined: 30 Nov 2013 11:08
Posts: 706
Location: WWW
Reply with quote
Неплохо бы погонять это в ModelSim - скорее всего, все станет понятно.


24 Dec 2017 14:16
Profile
Doomed

Joined: 08 Apr 2013 04:04
Posts: 449
Location: 213.247.249.139
Reply with quote
Tronix wrote:
Мне не кажется. Я уверен что это самый кривой дизайн, который только возможен. Индусы нервно курят в сторонке.

Все так начинали :)

Quote:
Но по другому не знаю как. Начинаешь писать "правильно" - тут же заканчиваются 32 ячейки.

Лёгкий апгрейд на epm3064 не думал сделать? Вроде по пинам 1к1 (ну или чуть больше IO у 3064, остальные такие же).


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

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

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



Quote:
Да я посмотрел описание в квартусе, про 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 мгц тебе точно хватит быстродействия :) Впрочем, можешь и проверить -- задай ква частоту клока.

_________________
привет засранцу лавру :)


24 Dec 2017 14:37
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
angry_troll wrote:
Лёгкий апгрейд на epm3064 не думал сделать?


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

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

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

Code:
always @(posedge Clk) begin


Список чувствительности... А если RD поднимется на negedge Clk то получается в холостую один такт пройдет.. Может основные сигналы (CS, WR, RD) тоже в список чувствительности включить.... Хотя влиять не должно на логику, но кто знает...

newold86 wrote:
Неплохо бы погонять это в ModelSim - скорее всего, все станет понятно.

Сложно засимулировать реальное поведение шины, особенно когда не видишь его (а я пока не все вижу со своими 8-ми каналами).

_________________
https://t.me/tronix_blog


25 Dec 2017 11:55
Profile
Doomed

Joined: 08 Apr 2013 04:04
Posts: 449
Location: 213.247.249.139
Reply with quote
Tronix wrote:
Из китая ее тащить? Не известно еще, может бу залоченная придет (или с назначенными выводами JTAG), а как разлочить без программатора от альтеры за десятьмильонов уе так до конца и не выяснили вроде на форуме zx.pk. б) Хочется все-таки уложиться, задача то простейшая...

да хоть бы и залоченная - с продавца потребуешь возврат или минусов ему наставишь в отзывы. Вроде не 100 баксов стоит :)


Quote:

Code:
always @(posedge Clk) begin


Список чувствительности... А если RD поднимется на negedge Clk то получается в холостую один такт пройдет.. Может основные сигналы (CS, WR, RD) тоже в список чувствительности включить.... Хотя влиять не должно на логику, но кто знает...

ни в коем случае! если клок - то только он, если асинхр сброс еще - то добавляется к клоку. если замена assign или латч - то always @*
все остальное - это несинтезируемый ахтунг :)

_________________
привет засранцу лавру :)


25 Dec 2017 14:40
Profile
Doomed

Joined: 08 Apr 2013 04:04
Posts: 449
Location: 213.247.249.139
Reply with quote
Tronix wrote:
Кстати клок то щаз не синхронизирован с системным. Сейчас тактуется от OSC 14,3 MHz, а он не синхронен никак с CLK.


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

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

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


далее:
Code:
always @(negedge wr)
 write_buffer <= databus


сигнал вейта (или не-реди):
Code:
assign wait = (rd | wr) && access_in_progress


access_in_progress так примерно:
Code:
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:
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 понадобится...

_________________
привет засранцу лавру :)


25 Dec 2017 15:12
Profile
Devil

Joined: 30 Nov 2013 11:08
Posts: 706
Location: WWW
Reply with quote
Зачем READY как inout объявлен ?


26 Dec 2017 00:22
Profile
Devil

Joined: 30 Nov 2013 11:08
Posts: 706
Location: WWW
Reply with quote
В первом приближении взглянул на запись в ModelSim:
Attachment:
MX2write.jpg
MX2write.jpg [ 170.5 KiB | Viewed 6922 times ]


Возможно, что-то делаю не так, но почему READY не сбрасывается в 0 ?


26 Dec 2017 00:40
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 198 posts ]  Go to page Previous  1 ... 9, 10, 11, 12, 13, 14  Next

Who is online

Users browsing this forum: No registered users and 15 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.