'если', по сравнению с 'когда' для того, чтобы сделать мультиплексор

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

5
задан Ahmed Kotb 9 March 2010 в 22:21
поделиться

3 ответа

Хорошо, давайте сначала обсудим некоторые моменты разницы между операторами if и when:

  • Оба они называются элементами дизайна потока данных.

когда оператор

  • параллельный оператор
  • не используется в процессе, используется только в архитектуре, поскольку процесс является последовательным выполнением

если оператор

  • последовательный оператор
  • используется в процессе, поскольку он является последовательным оператором, и не используется вне процесса

И вы знаете, что мультиплексор - это компонент, который не нуждается в блоке процесса, так как его поведение не меняется при изменении его ввода, поэтому он будет вне процесса, поэтому вы должны написать его, используя оператор when поскольку это параллельный оператор .. И если вы написали его с оператором if, могут возникнуть ошибки синхронизации. Также все ссылки, а также справка Xilinx (если вы используете Xilinx) пишут блок мультиплексора, используя оператор when, а не оператор if

Ссылка: Правила и методы цифрового дизайна, Джон Ф. Вакерли, 3-е издание

3
ответ дан 14 December 2019 в 13:33
поделиться

См. Эти:

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

2
ответ дан 14 December 2019 в 13:33
поделиться

Оба стиля кодирования полностью действительны.

Напомним некоторые элементы. Начиная с HDL, синтез выполняется в два основных этапа:

  1. сначала VHDL анализируется для обнаружения шаблонов RTL (состоящих из элементов RTL: триггеров, арифметических выражений, мультиплексоров, управляющей логики). ). Мы говорим, что эти элементы являются «введенными» (т.е. вы должны кодировать, используя правильный шаблон, чтобы получить то, что вы изначально хотели. Вы должны представить, как эти элементы связаны между собой, прежде чем кодировать).
  2. Второй этап - это реальный логический синтез , который учитывает конкретные целевые технологические параметры (типы доступных ворот, время, площадь, мощность).

Эти два шага четко отделяют функциональные потребности RTL (логика управления, вычисления) от технологических непредвиденных обстоятельств (время и т. Д.).

Вернемся к первому шагу (RTL):

Что касается мультиплексоров, возможны несколько стилей кодирования:

  • с использованием параллельного присваивания:

    y <= a1, когда cond1 else a2 when cond2 else cond3;

  • с использованием оператора if внутри процесса:

    process (a1, a2, a3, cond1, cond2) begin if (cond1) then y <= a1; elsif (cond2) then y <= a2; else y <= a3; конец, если; end;

  • с использованием другой формы параллельного присваивания , подходящей для общих описаний : если sel является целым числом и объединить массив сигналов , тогда:

    muxout <= muxin (sel); - будет выводить мультиплексор

Обратите внимание, что 3 стиля кодирования работают всегда.Также обратите внимание, что они «немного больше», чем простой мультиплексор, поскольку стиль кодирования требует наличия приоритетного кодирования (если elsif, когда else), что не является случаем простого мультиплексора на основе уравнений, действительно симметричного.

  • с использованием оператора case

    process (a1, a2, a3, cond1, cond2) переменная cond: std_logic (1 вниз до 0); begin cond: = cond2 & cond1; case cond равно when "01" => y <= a1; when "10" => y <= a2; when others => y <= a3; end case; end;

  • с использованием оператора select (в нашем примере два параллельных присваивания {{1 }} необходимо):

    sel <= cond2 & cond1; WITH sel SELECT y <= a1 WHEN "01", a2 WHEN "10", {{ 1}} a3 КОГДА ДРУГИЕ;

Последнее замечание касается роста абстракции, даже для дизайна RTL: синтезаторы сейчас действительно зрелые. Посмотрите, например, стили кодирования Джири Гайслера для процессора с открытым исходным кодом LEON2, а также его стили кодирования ( см. Здесь ). Он придерживается совершенно другого подхода, но вполне обоснованного, нежели классические книги.

Вы всегда должны понимать, что сделает синтезатор RTL.

Напротив, поведенческий синтез позволяет вам забыть (частично) то, что синтезатор выведет. Но это уже другая история.

1
ответ дан 14 December 2019 в 13:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: