'if' vs 'when' для создания мультиплексора - PullRequest
5 голосов
/ 10 марта 2010

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

Ответы [ 3 ]

3 голосов
/ 10 марта 2010

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

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

при выписке

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

если выписка

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

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

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

2 голосов
/ 10 марта 2010

См. Эти:

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

1 голос
/ 10 марта 2010

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

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

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

Эти два шага четко отделяют функциональные потребности 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.

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

...