Нужна ли инициализация? - PullRequest
9 голосов
/ 01 августа 2011

В VHDL необходима ли инициализация при создании сигнала или вектора?Что произойдет, если забыть инициализировать сигнал или целочисленное значение?

Ответы [ 3 ]

8 голосов
/ 01 августа 2011

В симуляции , если вы не установите начальное значение, каждый элемент вашего вектора получит значение по умолчанию (это определяется VHDL спецификация языка). Для перечислимых типов это первый элемент, определенный в типе перечисления: логические значения будут false, std_logic будет 'U' (не определено). Обратите внимание, что «U» не имеет значения в электрических цепях. Это просто подсказка для инженера по верификации, что вы не знаете, какое значение имеет триггер при включении питания.

После синтеза : синтезаторы ПЛИС будут использовать начальное значение, заданное вами в качестве значения включения питания триггеров и памяти , если целевая технология поддерживает это ! Если технология не поддерживает принудительное начальное значение (и для ASIC), начальное значение при включении не известно. Это может быть 1 или 0. (См. Например: http://quartushelp.altera.com/11.0/mergedProjects/hdl/vhdl/vhdl_pro_power_up_state.htm)

Два возможных стиля:

  1. Выберите явное начальное значение с или без явных схем сброса (обычно для современных ПЛИС)
  2. Установите «U» в качестве начального значения и используйте правильную схему сброса, чтобы вызвать известное значение сброса

Если вы выбрали первый вариант, обязательно проверьте, поддерживает ли ваша целевая технология этот стиль!

7 голосов
/ 01 августа 2011

В симуляции все в VHDL инициализируется в начале к «крайнему левому» элементу диапазона, который их представляет.

Таким образом, std_logic получит 'U', boolean получит false, integer получит большое отрицательное число.Любые перечисленные типы, которые вы определили сами, будут инициализироваться их первым членом.и т. д.

Вы можете переопределить это явной инициализацией:

variable i : integer := 0;

симулятор затем будет использовать вашу инициализацию.


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

Когда вы нацеливаетесь на FPGA и не инициализируете явно, в большинстве случаев вещи инициализируются чем-то вроденоль », но вы не можете на это полагаться (иногда инверторы толкаются вокруг, и все выглядит так, будто они настроены на« один »).Таким образом, у вас есть пин-код сброса и явный код, который назначает значение, которое вы хотите, когда этот пин-код подтвержден.

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

0 голосов
/ 01 августа 2011

Это не является строго необходимым в VHDL, точно так же, как это необязательно в C / C ++, но может произойти аналогичный результат.Без инициализации сигнала или вектора сигналов симулятор обычно симулирует, что он находится в неизвестном состоянии (при условии, что вы используете сигналы std_logic).Однако механизм синтеза выберет одно или другое в качестве начального значения, поскольку при программировании ПЛИС все элементы памяти будут инициализированы тем или иным образом (т. Е. Они не инициализированы в неизвестном состоянии).

Некоторыелюди не будут инициализировать сигнал при объявлении, а вместо этого будут использовать свою схему для инициализации элемента памяти (например, создать логику сброса для инициализации элемента памяти).Другой инициализирует элемент памяти, когда он объявлен.Это дизайнерские решения, которые имеют свои собственные компромиссы.

...