|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
ISA-8 SD-контроллер (SPI) на CPLD
Author |
Message |
Vic3Dexe
Doomed
Joined: 16 Dec 2014 11:58 Posts: 370 Location: Киев
|
Да, точно. По памяти писал и сам запутался
|
23 Dec 2017 00:19 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Попробовал вчера опять перескочить с Clk на OSC (14,3 MHz) - не получается. В какой момент комп защелкивает данные после операции чтения? Вот у меня лежит CS, RD и IO CH CHK внизу, SPI сдвигает. В конце поднимается IO CH CHK. Потом через несколько тактов поднимается RD и потом поднимается CS. Данные на шине выставлены сразу после поднятия IO CH CHK и до поднятия RD. Этого мало? Нужно подержать данные немножко и после поднятия RD? Сколько тактов?
|
23 Dec 2017 23:59 |
|
|
newold86
Devil
Joined: 30 Nov 2013 11:08 Posts: 709 Location: WWW
|
Данные защелкиваются по завершению (спаду) T3. На этот момент данные должны присутствовать минимум 30 ns, после - еще минимум 10 ns. Если правильные данные есть на момент поднятия MEMR, то проблема, скорее всего, не в hold time.
|
24 Dec 2017 00:24 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Да неведомо, есть они там или нет. По логике - должны быть. Читает с ошибками... Похоже без 16-ти канального анализатора дальше не продвинусь. Или действительно в быстродействие упираюсь... Было вчера несколько раз, что CPLD как будто "зависает" - опускает READY и все... Сдвига уже не происходит. Вечный READY в нуле. Ну и не последнюю роль играет качество кода на верилог. Так как местами уже не лезет в 32 ячейки, приходится играться с настройками Speed/Balanced/Area. Вот на Area по-моему и висла эта система. Увы, много неизвестных. Попробую еще READY не сразу после сдвига поднять, а обождать такт. Хз зачем, но может внутренний регистр данных "устаканится". Чем больше играюсь с ним - тем больше вижу что это огромный костыль. Шаг в сторону - все рухает.
|
24 Dec 2017 00:38 |
|
|
angry_troll
Doomed
Joined: 08 Apr 2013 04:04 Posts: 449 Location: 213.247.249.139
|
Вот по-моему один из тех случаев, когда стоит хотя бы чуть взглянуть на 'technology map'. Мне дизайн кажется немножечко кривым, вложенные ифы дают разлапистую логику, которая и может жрать ячейки в цплд. Я бы написал это всё -- разделённым на блоки, например блок сдвига, счётчик, решатель ready/busy (его можно сделать из старшего бита счётчика). Не помню, есть ли enable в триггерах epm, если есть -- постарался бы его заюзать в сдвигателе, например. Ещё наблюдающиеся артефакты могут быть из-за метастабильностей, когда входные данные меняются на фронте клока. Но тут клок вроде с того же ISA идёт и все сигналы на ней синхронны относительно этого клока, по идее в этом дело не может быть. Ещё бывает, что звон на стробах влияет, например если эти стробы используются для занесения данных с шины в регистры (это ещё не так страшно) или для начала каких-то действий (типа счёта), но это не твой случай. Ну и наконец ещё раз напомню (вот я зануда ) про slow slew rate и auto turbo bit=off (для епмок). Без слоу слю рейт фронты очень резкие и от них может звенеть всё по пути
_________________ привет засранцу лавру :)
|
24 Dec 2017 03:13 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Взглянул. Не понял ровным счетом ничего. Но красиво Мне не кажется. Я уверен что это самый кривой дизайн, который только возможен. Индусы нервно курят в сторонке. Но по другому не знаю как. Начинаешь писать "правильно" - тут же заканчиваются 32 ячейки. Это очевидная вешь, выделить сдвигатель в отдельный блок. Но у меня не получается. Как только делаю два allways (Clk), сразу начинает ругаться что нельзя совместно использовать одни и те же регистры в двух блоках. А как их не использовать, когда там всюду нужны хотя бы внутренний регистр данных? Да и остальные внутренние регистры то же. Да я посмотрел описание в квартусе, про Slow slew rate, увидел что оно влияет на только на output, ну и подумал что мне это не надо. Клок на SPI хороший, нажористый, MISO тоже ничего так с виду. Но врублю конечно, не сложно. Вот только на производительности это не скажется? Про auto turbo bit=off не читал пока... Спасибо, буду дальше тыркаться.
|
24 Dec 2017 08:36 |
|
|
newold86
Devil
Joined: 30 Nov 2013 11:08 Posts: 709 Location: WWW
|
Я (просто интуитивно, без объективных причин) уверен, что дело не в метастабильностях и формах сигналов, или в недостатке быстродействия из-за вложенности, а в принципиальной ошибке дизайна в каком-то месте.
|
24 Dec 2017 09:27 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Почему-то тоже так кажется. Большой опыт наступления на грабли, наверное -) Кстати клок то щаз не синхронизирован с системным. Сейчас тактуется от OSC 14,3 MHz, а он не синхронен никак с CLK. Но мне кажется это не важно - дождались CS и RD и не установлен флаг начала чтения и не установлен флаг начала записи -отметили во флаге "начало чтения из порта": Все, на следующий такт мы сюда не должны больше попасть, так как BEGRD = 1. При этом уронили READY в любом случае и либо уже биты сдвигались (например при предыдущей записи в порт), либо начали сдвигать биты SPI. При достижении 7-ого бита отпустится READY. В это время на шину данных все время выставляется данные из регистра данных. К седьмому биту там должен быть полноценный байт данных: Когда отпустится READY, комп начнет поднимать RD к верху. Этот момент тоже смотрим, чтобы сбросить флаг "начала чтения из порта) Не знаю...
|
24 Dec 2017 10:17 |
|
|
newold86
Devil
Joined: 30 Nov 2013 11:08 Posts: 709 Location: WWW
|
Неплохо бы погонять это в ModelSim - скорее всего, все станет понятно.
|
24 Dec 2017 14:16 |
|
|
angry_troll
Doomed
Joined: 08 Apr 2013 04:04 Posts: 449 Location: 213.247.249.139
|
Все так начинали Лёгкий апгрейд на epm3064 не думал сделать? Вроде по пинам 1к1 (ну или чуть больше IO у 3064, остальные такие же). Ну так логично же, одним регистром рули в одном always. Если рулишь в разных, то даже чисто с т.з. семантики верилога, разные блоки always могут исполняться в произвольном порядке (это актуально при моделировании в моделсимах разных). А с т.з. синтеза -- просто запрещено. Пиши по-другому Например так: в одном always у тебя сдвигатель, управляется сигналами (wire) типа enable, load и что там ещё. В другом -- счётчик, который при обращении компа инициализируется на 0 и начинает считать (его младший разряд может быть enable для сдвигателя и sck, старший -- busy). Отдельно -- assignы для управляющих сигналов. Ну и в таком духе. Поверь, это опыт (slow slew rate) Даже на 2-слойных платах как правило без слоу слю рейт ничего не работает или глючит. А уж у тебя на макетке... Хорошо, если у тебя 4-6 слойка, слой сплошной земли, питания, хорошая блокировка по питанию, и тебе надо выжать максимум частоты для прокидывания сигнала по плате. А в любом ином случае -- slow slew rate вообще не думая втыкай Резкий фронт -- это резкий импульс тока в провод, чтоб этот фронт обеспечить, и при этом обратный ток течёт, очевидно, по шинам питания и земли. Потенциалы которых от такого счастья подскакивают (в соответствии с U=-LdI/dt) и т.д. Slow slew rate относится ислючительно к выходным пинам, на быстродействии внутренностей не скажется никак. Вот турбо бит -- относится к внутренностям, но на 14 мгц тебе точно хватит быстродействия Впрочем, можешь и проверить -- задай ква частоту клока.
_________________ привет засранцу лавру :)
|
24 Dec 2017 14:37 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Да думал... Но а) в чип и дипе нету. На барахолках тоже. Из китая ее тащить? Не известно еще, может бу залоченная придет (или с назначенными выводами JTAG), а как разлочить без программатора от альтеры за десятьмильонов уе так до конца и не выяснили вроде на форуме zx.pk. б) Хочется все-таки уложиться, задача то простейшая... Остальное попробую, спасибо за информацию. И тут еще подумал, посмотрев на начало: Список чувствительности... А если RD поднимется на negedge Clk то получается в холостую один такт пройдет.. Может основные сигналы (CS, WR, RD) тоже в список чувствительности включить.... Хотя влиять не должно на логику, но кто знает... Сложно засимулировать реальное поведение шины, особенно когда не видишь его (а я пока не все вижу со своими 8-ми каналами).
|
25 Dec 2017 11:55 |
|
|
angry_troll
Doomed
Joined: 08 Apr 2013 04:04 Posts: 449 Location: 213.247.249.139
|
да хоть бы и залоченная - с продавца потребуешь возврат или минусов ему наставишь в отзывы. Вроде не 100 баксов стоит ни в коем случае! если клок - то только он, если асинхр сброс еще - то добавляется к клоку. если замена assign или латч - то always @* все остальное - это несинтезируемый ахтунг
_________________ привет засранцу лавру :)
|
25 Dec 2017 14:40 |
|
|
angry_troll
Doomed
Joined: 08 Apr 2013 04:04 Posts: 449 Location: 213.247.249.139
|
Ох нифига, я сразу-то и не заметил. Ну тогда любые сбои, раз в 2 обращения, раз в 10 обращений, раз в 100000 -- смело списывай на метастабильности. Любые начинающиеся или кончающиеся глюки от незначительного изменения сорца -- тоже По-хорошему надо делать пересинхронизацию. Для относительно медленного клока я бы сделал так (ахтунг -- это скорее псевдокод, чем верилог): далее: сигнал вейта (или не-реди): access_in_progress так примерно: тут триггер с асинхронным сбросом и "синхронной" загрузкой единички (т.е. на клок подан wr) далее: как только вскочил access_in_progress (записалось то что нужно передать в SPI), ты его пересинкиваешь через 2 триггера и 3им выделяешь фронт примерно так: по этому старту ты уже на клоке спокойно копируешь write_buffer в сдвиговый регистр и начинаешь передавать, а как передал -- 1тактовым импульсом отщёлкиваешь access_in_progress. Есть ещё вариант, который требует относительно быстрого клока (например для z80 на 14мгц более-менее комфортно с клоком x4, т.е. 56мгц, не знаю про времянки ИСА). В этом случае ты сразу пересинхронизируешь и выделяешь фронты из сигналов типа rd и wr, а всё остальное делаешь синхронно на этом быстром клоке, например копируешь данные с ШД в буфер записи и т.д. В обоих случаях асинхронное ещё будет чтение на шину, и в 1ом случае -- его можно сразу делать из сдвигового регистра, т.к. пока он двигается, будет гарантированно вейт при попытке обращения. Да и во 2ом тоже наверное так же можно. ps: ну и на 3032 с такими подходами можно не рассчитывать первый вариант может быть в 3064 влезет, а второму точно 3128 понадобится...
_________________ привет засранцу лавру :)
|
25 Dec 2017 15:12 |
|
|
newold86
Devil
Joined: 30 Nov 2013 11:08 Posts: 709 Location: WWW
|
Зачем READY как inout объявлен ?
|
26 Dec 2017 00:22 |
|
|
newold86
Devil
Joined: 30 Nov 2013 11:08 Posts: 709 Location: WWW
|
В первом приближении взглянул на запись в ModelSim: Возможно, что-то делаю не так, но почему READY не сбрасывается в 0 ?
|
26 Dec 2017 00:40 |
|
|
Who is online |
Users browsing this forum: No registered users and 3 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
|
|