Путаница с тактовой частотой в ПЛИС / Verilog

Я только что купил FPGA и изучаю Verilog, но столкнулся с некоторыми путаницами, большинство из которых касалось часов.

Мой первый вопрос: как работает последовательная логика? Делаются ли назначения, по одному за такт, или последовательность каким-то образом распространяется с максимальной скоростью, определяемой задержками ворот?

Мой второй вопрос: как работают умножители частоты? Я видел статью, в которой использовался один для получения сигнала 250 МГц на чипе с тактовой частотой всего 50 МГц. Как это возможно? Если чип способен работать на таких более высоких частотах (ограниченных, как я полагаю, только задержками затвора), то почему чип просто не работает на более высокой частоте для начала?

Как работает комбинационная логика в alwaysблоке? Я думал, что блоки всегда выполняются по событиям, таким как положительные или отрицательные фронты сигнала, и выполняются последовательно, поэтому я довольно запутался в этом вопросе, поскольку я видел назначения блокировки внутри блоков всегда.

всегда помните, что когда вы работаете с verilog или vhdl, вы предоставляете описание оборудования в том, что выглядит как код, а не кодирование. все происходит одновременно, если только вы не пытаетесь сделать все последовательно. Что касается умножения тактовых импульсов, будет полезен поиск контуров фазовой автоподстройки частоты (PLL).
Я думаю, проблема в том, что я слишком много думаю о природе языков описания оборудования. Я ожидал, что все будет строить модули из комбинационной логики и работать оттуда (или сверху вниз, но в конечном итоге до логического уровня). Я был очень удивлен, увидев, что в Verilog есть последовательные элементы, поэтому я все еще пытаюсь понять это и выяснить, как он синтезирует эту последовательную логику. И да, этот поиск был очень поучительным.
Вам нужно быть более осторожным с языком в вопросе. Операторы Verilog могут оцениваться (не выполняться) последовательно, но синтезироваться в комбинационную логику. Термин sequential logicочень запутанный, и лучше говорить о комбинационной логике (И, ИЛИ, НЕ) или синхронной логике (триггеры и защелки).

Ответы (2)

Прежде всего, отбросьте эту концепцию «инструкций». В Verilog их нет. Ничего не выполняется. Verilog, VHDL, SystemVerilog и т. д. называются языками описания оборудования. Они не выполняются. Они не интерпретируются. Они определяют аппаратные компоненты (логические вентили, триггеры, регистры и т. д.) и их взаимосвязи. (Я полагаю, не совсем точно; но единственный verilog, который вы можете поместить на FPGA — синтезируемый verilog — не будет выполняться или интерпретироваться. Тестовые стенды — это другое животное.)

Часы используются для управления триггерами и регистрами. Данные можно перемещать в триггеры и регистры по краям часов. Таким образом, внутри блока always @(posedge clk) все операторы будут «выполняться» одновременно, а результаты будут зафиксированы в регистрах на фронте тактового сигнала в соответствии с правилами интерпретации операторов HDL. Однако будьте очень осторожны при использовании = и <=. Смысл этих двух операций присваивания сильно отличается внутри блока always. Основная идея заключается в том, что все операции = обрабатываются первыми в порядке их появления. Это происходит на скорости распространения ворот. Затем все <= обрабатываются одновременно, сохраняя аргумент в регистр. Единственное, на что в данном случае влияют часы, это именно время обновления регистров.

Более быстрые часы могут быть сгенерированы с помощью устройства, называемого фазированной синхронизацией (PLL). PLL нельзя синтезировать в Verilog, но, как правило, существует способ создать экземпляр выделенного компонента PLL на используемой вами FPGA. На самом деле, я беру свои слова назад, вы, конечно, можете сделать цифровую PLL в Verilog, но вы можете использовать ее только для генерации сигналов ниже тактовой частоты. PLL содержит генератор, управляемый напряжением, один или несколько делителей частоты, фазовый компаратор и некоторые схемы управления. Выходной сигнал ГУН делится вниз и по фазе сравнивается с входной частотой. Управляющее напряжение VCO регулируется до тех пор, пока разделенный выходной сигнал VCO точно не совпадет с частотой и фазой опорного сигнала. Если вы установите делитель на 5 и используете 50 МГц в качестве опорной частоты, PLL будет генерировать сигнал 250 МГц, который точно синхронизирован по фазе с эталоном 50 МГц. Для этого есть несколько причин. Использование PLL позволяет генерировать несколько тактовых импульсов, поэтому различная логика может работать с разной скоростью, например, для определенных периферийных интерфейсов или для медленной сложной комбинаторной логики. Это также может позволить устройству управлять собственной тактовой частотой для экономии энергии.

Блокирующие операторы внутри всегда блоков будут генерировать комбинаторную логику. Опять же, эта логика, как правило, всегда будет «выполняться» независимо от часов, потому что она определяет фактические логические элементы. Может быть полезно использовать несколько временных переменных, но необходимо следить за тем, чтобы не было слишком много дополнительной логики, которая не удовлетворяла бы требованиям по времени.

Последнее уточнение. Есть ли смысл использовать всегда блок для блокировки присваиваний, если внутри всегда нет условного? Разве нельзя было достичь тех же целей с помощью assign, поскольку присваивания всегда были бы одинаковыми?
Он будет делать то же самое. Однако размещение его в том же блоке облегчает чтение кода. Вам не нужно искать оператор assign, чтобы увидеть логику.
  1. Оба варианта возможны и обычно называются асинхронной и синхронной логикой. Вы можете захотеть изучить это немного глубже, тем более, что вы можете, по крайней мере, описать различные синхронные схемы (например, запуск по уровню или фронту). Максимальная надежность часто достигается при срабатывании по фронту из-за условий гонки при срабатывании по уровню. Следовательно, FPGA десятки оптимизированы для bw.

  2. Использование ПЛЛ. В большинстве проектов используется несколько часов, и ограничение зависит от того, какую схему вы синтезируете. Для надлежащих синхронных схем с запуском по фронту синтезатор может уже вычислить его за вас (а для всего остального вам, возможно, придется научиться вручную подавлять предупреждения или ошибки о его невозможности сделать это).

  3. Смотрите этот вопрос .

Это не отвечает на мой первый вопрос к моему удовлетворению. Мне до сих пор неясно, выполняются ли последовательные инструкции по одному за такт или нет.
Возможно, я неправильно понял ваш вопрос о последовательной логике. Вы имели в виду последовательные задания? И, чтобы избежать заблуждений моего собственного новичка, вы используете <= или = ?
Мне было непонятно поведение обоих, но приведенный выше ответ хорошо объясняет это.