Синхронизация шины FPGA
Я обнаружил, что внедряю код Verilog для сопряжения FT600 USB3.0 FIFO с ПЛИС решетки ICE40. Вопрос, который я здесь задам, не является специфическим для этих частей, поскольку он применим к каждому случаю, когда вам нужно спроектировать конечный автомат и читать / записывать данные в синхронную параллельную шину.
Я уверен, что это очень простые вещи, но я просто не могу найти удовлетворительный ответ в Интернете, и я не могу придумать другой способ сформулировать проблему. Здесь это идет.
Вот временная диаграмма рассматриваемого автобуса. (взято из спецификации ft600, исключая лишние части):
Наблюдая за диаграммой, мы видим, что данные и сигналы управления, предоставляемые FT600, стабильны во время нарастания тактовых импульсов. Следовательно, FSM должен сэмплировать эти сигналы и соответственно изменить состояние на передних фронтах тактового сигнала (
always @(posedge clk)
). Это рассуждение правильно?Я реализую Moore FSM, где выходы зависят только от текущего состояния. Допустим, начальное состояние
RX_WAIT
, Как только FSM выберет линию RXF_N=0 при повышении тактового сигнала (A), состояние изменится наRX_PRE
, Затем комбинационный блок переводит состояниеRX_PRE
на выходы ПЛИС OE_N=0, RD_N=0. Проблема в том, что если этот комбинационный блок очень быстрый, выходы изменятся на красной линии сразу после (A), а не на черной линии между восходящими часами, как должно быть. Это может нарушить состояние удержания чипа. Я могу придумать два решения для этого:A) Поместить регистр, который производит выборку выходных данных после комбинационного блока на заднем фронте часов. Тогда у нас будут проблемы, если комбинационный блок будет медленнее, чем полчаса. Кроме того, мне сказали, что не рекомендуется смешивать вьетнамки с восходящим и падающим краем, если вы не используете DDR.
Б) Как-то обеспечить, чтобы задержка комбинационного блока составляла ровно половину такта, добавляя задержку при необходимости (это то, что мы хотим? Сделать систему медленнее?). В таком случае, как я могу дать указание компилятору сделать это? Я использую Ice Cube 2, который поддерживает временные ограничения, аналогичные ограничениям Altera, но я никогда не использовал их, и я не знаком с терминами (задержка на выходе, задержка на вход, максимальная задержка, многоцикловый режим, задержка тактового сигнала...) и как их использовать.
Я уверен, что (B) - это путь, если опытный пользователь должен дать мне совет, я был бы очень благодарен.
1 ответ
Если вы пытаетесь предоставить время удержания относительно часов для интерфейса шины, есть несколько способов сделать это. Я не могу говорить с частью решетки или инструментами напрямую, я не работал с их устройствами.
- Фиксированная задержка, обусловленная ограничением
Предоставьте инструменту проектирования временные ограничения, которые будут определять правильное время удержания. Внутренне, он, вероятно, будет использовать программируемый элемент задержки, который обычно расположен в или около структуры блока ввода / вывода. Мне лично это не нравится из-за различий в компиляции. Инструменты не могут дать вам точную задержку, они гарантируют только "не меньше чем" или "не больше чем". Таким образом, вы можете исправить ошибку в несвязанной области, а затем сделать так, чтобы ваш автобус стал нестабильным с вашим новым потоком битов.
- Исправлена ручная задержка
Внедрить константы в экземпляр блока ввода-вывода RTL, подключив значение к порту задержки. Точно рассчитать это значение непросто, поскольку необходимо учитывать неопределенность конструкции печатной платы и вариантов деталей. Не все входные порты имеют одинаковую емкость, и не все трассы печатной платы имеют одинаковую длину.
- Исправлен ручной перекос
Сгенерируйте часы ввода / вывода для вашей шины и используйте настройку PLL для обеспечения задержки. Концептуально вы можете установить задержку на желаемое время удержания, а затем распространить его на свои исходящие сигналы. Будьте осторожны, так как статическое время не очевидно для ограничения и удовлетворения. По этой причине я бы избегал этого метода для программируемой технологии.
- Программируемая задержка
Аналогично #2, только теперь вы подключаете задержку к программируемому регистру в дизайне. Это позволяет вам прийти в лабораторию и затем "набрать" идеальную настройку, либо путем прямого наблюдения за сигналами с помощью осциллографа, либо путем косвенного поведения. Это наиболее универсальное решение, но учтите, что при производстве вы будете испытывать некоторые отклонения, основанные на деталях (неопределенность напряжения регулятора, изменение процесса), а также окружающей среде (температура).
- Самокалибрующаяся задержка
Аналогично #4, но теперь сама деталь определяет наилучшую задержку. Обычно это делается с помощью действия "запись-подтверждение" на шине. Вы пишете регистр в подчиненной части, а затем читаете его обратно. Используя этот цикл обратной связи, вы сканируете окно, перебирая значения задержки, а затем выбираете среднюю точку между краями окна успешной передачи. Это может быть выполнено при запуске, периодически или в ответ на изменения окружающей среды. Обычно это не касается всего, если только вы не имеете дело с высокоскоростным сериализованным вводом / выводом, которого нет у вас.
- Более быстрые часы и импульс захвата
Идея состоит в том, чтобы умножить ваши часы, а затем иметь конечный автомат, который запускает включение. Более точный, чем "negedge", но более зернистый, чем большинство блоков задержки ввода / вывода. Таким образом, вы можете перемещать сигналы 1/8 цикла за раз или 1/16. Я только упоминаю об этом, поэтому, если вы когда-нибудь увидите это, вы знаете, чтобы избежать этого.