Синхронизация шины FPGA

Я обнаружил, что внедряю код Verilog для сопряжения FT600 USB3.0 FIFO с ПЛИС решетки ICE40. Вопрос, который я здесь задам, не является специфическим для этих частей, поскольку он применим к каждому случаю, когда вам нужно спроектировать конечный автомат и читать / записывать данные в синхронную параллельную шину.

Я уверен, что это очень простые вещи, но я просто не могу найти удовлетворительный ответ в Интернете, и я не могу придумать другой способ сформулировать проблему. Здесь это идет.

Вот временная диаграмма рассматриваемого автобуса. (взято из спецификации ft600, исключая лишние части):

  1. Наблюдая за диаграммой, мы видим, что данные и сигналы управления, предоставляемые FT600, стабильны во время нарастания тактовых импульсов. Следовательно, FSM должен сэмплировать эти сигналы и соответственно изменить состояние на передних фронтах тактового сигнала (always @(posedge clk)). Это рассуждение правильно?

  2. Я реализую 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 ответ

Если вы пытаетесь предоставить время удержания относительно часов для интерфейса шины, есть несколько способов сделать это. Я не могу говорить с частью решетки или инструментами напрямую, я не работал с их устройствами.

  1. Фиксированная задержка, обусловленная ограничением

Предоставьте инструменту проектирования временные ограничения, которые будут определять правильное время удержания. Внутренне, он, вероятно, будет использовать программируемый элемент задержки, который обычно расположен в или около структуры блока ввода / вывода. Мне лично это не нравится из-за различий в компиляции. Инструменты не могут дать вам точную задержку, они гарантируют только "не меньше чем" или "не больше чем". Таким образом, вы можете исправить ошибку в несвязанной области, а затем сделать так, чтобы ваш автобус стал нестабильным с вашим новым потоком битов.

  1. Исправлена ​​ручная задержка

Внедрить константы в экземпляр блока ввода-вывода RTL, подключив значение к порту задержки. Точно рассчитать это значение непросто, поскольку необходимо учитывать неопределенность конструкции печатной платы и вариантов деталей. Не все входные порты имеют одинаковую емкость, и не все трассы печатной платы имеют одинаковую длину.

  1. Исправлен ручной перекос

Сгенерируйте часы ввода / вывода для вашей шины и используйте настройку PLL для обеспечения задержки. Концептуально вы можете установить задержку на желаемое время удержания, а затем распространить его на свои исходящие сигналы. Будьте осторожны, так как статическое время не очевидно для ограничения и удовлетворения. По этой причине я бы избегал этого метода для программируемой технологии.

  1. Программируемая задержка

Аналогично #2, только теперь вы подключаете задержку к программируемому регистру в дизайне. Это позволяет вам прийти в лабораторию и затем "набрать" идеальную настройку, либо путем прямого наблюдения за сигналами с помощью осциллографа, либо путем косвенного поведения. Это наиболее универсальное решение, но учтите, что при производстве вы будете испытывать некоторые отклонения, основанные на деталях (неопределенность напряжения регулятора, изменение процесса), а также окружающей среде (температура).

  1. Самокалибрующаяся задержка

Аналогично #4, но теперь сама деталь определяет наилучшую задержку. Обычно это делается с помощью действия "запись-подтверждение" на шине. Вы пишете регистр в подчиненной части, а затем читаете его обратно. Используя этот цикл обратной связи, вы сканируете окно, перебирая значения задержки, а затем выбираете среднюю точку между краями окна успешной передачи. Это может быть выполнено при запуске, периодически или в ответ на изменения окружающей среды. Обычно это не касается всего, если только вы не имеете дело с высокоскоростным сериализованным вводом / выводом, которого нет у вас.

  1. Более быстрые часы и импульс захвата

Идея состоит в том, чтобы умножить ваши часы, а затем иметь конечный автомат, который запускает включение. Более точный, чем "negedge", но более зернистый, чем большинство блоков задержки ввода / вывода. Таким образом, вы можете перемещать сигналы 1/8 цикла за раз или 1/16. Я только упоминаю об этом, поэтому, если вы когда-нибудь увидите это, вы знаете, чтобы избежать этого.

Другие вопросы по тегам