Если вы используете VHDL для программирования вашей прототипической платы на основе FPGA, вас интересует семантика синтеза языка. Он сильно отличается от семантики моделирования, описанной в Справочном руководстве по языку (LRM). Хуже того: он не стандартизирован и варьируется между инструментами синтеза. В любом случае, синтез означает трансляцию из кода VHDL на цифровое оборудование. Единственный рекомендуемый подход здесь для новичков, которые до сих пор не ясно понимают семантику синтеза, составляет:
Сначала подумайте об аппаратном обеспечении, затем код.
Другими словами, нарисуйте хорошую блок-схему оборудования, которое вы хотите на листе бумаги. И используйте следующие 10 правил. Строго. Без исключений. Никогда. И не забудьте тщательно проверить последний, это так же важно, как и другие, но немного сложнее проверить.
- Окружайте свой рисунок большим прямоугольником. Это граница вашей цепи. Все, что пересекает эту границу, является входным или выходным портом. Объект VHDL будет описывать эту границу.
- Четко разделенные регистровые регистры (например, квадратные блоки) из комбинаторной логики (например, круглые блоки).
- Не используйте защелки с уровнем срабатывания.
- Используйте только начальные регистры с начальным фронтом и используйте одни и те же одиночные часы для всех них. Его имя
clock
. Он поступает извне и представляет собой вход всех квадратных блоков и только их. Даже не представляйте часы, это одинаково для всех квадратных блоков, и вы можете оставить его неявным в своей диаграмме.
- Представление сообщений между блоками с именованными и ориентированными стрелками. Для блока появляется стрелка, стрелка - выходной сигнал. Для блока стрелка идет, стрелка является входным сигналом.
- Стрелки имеют одно происхождение, но у них может быть несколько мест назначения. Если стрелка имеет несколько мест назначения, разворачивайте стрелку столько раз, сколько необходимо.
- Некоторые стрелки из-за большого прямоугольника. Это входные порты объекта. Стрелка ввода также не может быть выходом любого из ваших блоков.
- Некоторые стрелки выходят наружу. Это выходные порты. Стрелка вывода имеет одно единственное происхождение и одно место назначения: снаружи. Нет вил на выходных стрелках. Таким образом, стрелка вывода не может быть также входом одного из ваших блоков.Если вы хотите использовать стрелку вывода в качестве входа для некоторых ваших блоков, вставьте новый круглый блок, чтобы разбить его на две части: ввод нового блока с таким количеством вилок, как вы хотите, и стрелкой вывода, которая появляется из нового блока и выходит наружу. Новый блок станет простым непрерывным назначением в VHDL. Прозрачное переименование.
- Все стрелки, которые не поступают или не выходят из/наружу, являются внутренними сигналами. Вы объявите их все в архитектуре.
- Каждый цикл диаграммы должен содержать по меньшей мере один квадратный блок.
Если вы не можете найти способ описания функции, которую вы хотите с помощью этого подхода, проблема в том, какую функцию вы хотите. Не с VHDL или синтезатором. Это означает, что функция, которую вы хотите, это не цифровое оборудование. Внедрите его с использованием другой технологии.
Кодирование VHDL становится деталью:
- один синхронный процесс на квадратный блок,
- один комбинаторный процессом за один раунд блока.
Синхронный процесс выглядит следующим образом:
process(clock)
begin
if rising_edge(clock) then
o1 <= i1;
...
on <= in;
end if;
end process;
где i1, i2,..., in
являются все стрелки, которые входят в соответствующий квадратный блок вашей диаграммы и o1, ..., om
являются все стрелки, выход соответствующего квадратного блока вашей диаграмме. Не меняйте ничего, кроме имен сигналов. Ничего. Даже не один персонаж. ОК?
Комбинаторное процесс выглядит следующим образом:
process(i1, i2,... , in)
<declarations>
begin
o1 <= <default_value_for_o1>;
...
om <= <default_value_for_om>;
<statements>
end process;
где i1, i2,..., in
являются все стрелки, которые входят в соответствующий круглый блок диаграмме. все и не более. Не забудьте одну стрелку и ничего не добавляйте. Исключений нет. Никогда. А где o1, ..., om
: все стрелки, которые выводят соответствующий круглый блок вашей диаграммы. все и не более. Не меняйте ничего, кроме <declarations>
, имена входов, имена выходов, значения <default_value_for_oi>
и <statements>
. Do не забудьте одно назначение значения по умолчанию. Если бы вам пришлось создать новый круглый блок для разделения первичного выхода стрелки, соответствующий процесс просто:
process(i)
begin
o <= i;
end process;
который можно упростить:
o <= i;
без декларации процесса вшита. Это эквивалентное параллельное назначение сигнала.
После того, как вам будет комфортно с этим стилем кодирования и только тогда, вы будете:
Пропустить чертеж для простых конструкций. Но сначала подумайте об оборудовании. Нарисуйте в своей голове, а не на листе бумаги, но продолжайте рисовать.
Использование асинхронные переустанавливает:
process(clock, reset)
begin
if reset = '1' then
o <= reset_value_for_o;
elsif rising_edge(clock) then
o <= i;
end if;
end process;
объединить несколько комбинаторных процессов в одном комбинаторном процессе. Это тривиально и представляет собой просто реорганизацию блок-схемы.
Объединить некоторые комбинаторные процессы с синхронными процессами. Но для этого вы должны вернуться к своей блок-схеме и добавить одиннадцатое правило:
- Группируйте несколько круглых блоков и по крайней мере один квадратный блок, рисуя вокруг них ограждение. Также приложите стрелки, которые могут быть. Не позволяйте стрелке пересекать границу корпуса, если она не приходит или не выходит из/за пределы корпуса. Как только это будет сделано, посмотрите на все выходные стрелки корпуса. Если какой-либо из них поступает из круглого блока корпуса или также является входом в корпус, вы не можете объединить эти процессы в синхронном процессе.
И позже вы также начнете использовать защелки, падающие кромки часов, несколько часов и ресинхронизаторы между часовыми областями ... Но мы обсудим их, когда придет время.
* Мне нужен список чувствительности, чтобы мои инструменты синтеза не игнорировались. * Используйте последовательные конструкции, рекомендованные вашим поставщиком (как в ответе на вопрос). Любой оцениваемый сигнал в состоянии или инструкции в противном случае должен быть в списке чувствительности (эквивалент в -2008 для использования зарезервированного слова «все»). См. Quartus Prime Standard Edition Справочник Том 1, 12. Рекомендуемые стили кодирования HDL, регистр и стиль кодирования защелки. Моделирование (результаты не показаны), по-видимому, рассчитывается на защелке, которую ЕС не видит в списке чувствительности, который не используется в синтезе (и не обеспечивает фиксации). – user1155120