Оба стиля кодирования полностью действительны.
Давайте вспомним некоторые элементы. Начиная с ЛПВП, синтез проводится в два основных этапа:
- сначала анализируется VHDL для обнаружения шаблонов RTL (состоящих из элементов RTL: триггеры, арифметические выражения, мультиплексоры, логика управления). Мы говорим, что эти элементы «выведены» (т.е. вы должны кодировать, используя правильный шаблон, чтобы получить то, что вы хотели изначально. Вы должны представить, как эти элементы связаны, прежде чем кодировать).
- Второй шаг - это реальный логический синтез , который учитывает параметры конкретной целевой технологии (типы доступных затворов, время, площадь, мощность).
Эти два шага четко отделяют функциональные потребности RTL (рулевая логика, вычисления) от непредвиденных обстоятельств технологии (время и т. Д.).
Вернемся к первому шагу (RTL):
Что касается мультиплексоров, возможны несколько стилей кодирования:
с использованием параллельного назначения:
y <= a1, когда cond1 еще a2, когда cond2 еще cond3; </p>
использование оператора if в процессе:
процесс (a1, a2, a3, cond1, cond2)
начать
если (cond1) тогда
у <= a1;
elsif (cond2) тогда
у <= а2;
еще
у <= а3;
конец если;
конец; </p>
с использованием другого параллельного назначения
форма, подходящая для родового
описания: если sel является целым числом
и объединяем массив сигналов, затем:
muxout <= муксин (sel); - выведет мукс </p>
Обратите внимание, что 3 стиля кодирования всегда работают. Отметим также, что они «немного больше», чем простой мультиплексор, поскольку стиль кодирования вынуждает наличие приоритетного кодирования (если elsif, когда еще), который не является случаем простого мультиплексора на основе уравнений, действительно симметричного.
с использованием оператора case
процесс (a1, a2, a3, cond1, cond2)
переменная cond: std_logic (от 1 до 0);
начать
cond: = cond2 & cond1;
случай cond
когда "01" => y <= a1;
когда "10" => y <= a2;
когда другие => y <= a3;
конец дела;
конец; </p>
с помощью оператора выбора (в нашем
Например, два одновременных назначения
необходимо):
sel <= cond2 & cond1;
С SEL SELECT
y <= a1 КОГДА "01",
а2 КОГДА "10",
а3 КОГДА ДРУГОЕ; </p>
Последнее замечание касается повышения абстракции даже для RTL-дизайна: синтезаторы сейчас действительно зрелые. Посмотрите, например, стили кодирования Джири Гайслера для процессора с открытым исходным кодом LEON2, а также его стили кодирования ( см. Здесь ). Он придерживается совершенно другого подхода, но все же совершенно оправданного, по сравнению с классическими книгами.
Вы всегда должны понимать, что будет выводить синтезатор RTL.
Напротив, поведенческий синтез позволяет забыть (частично), что будет выводить синтезатор. Но это другая история.