Инициализация VHDL std_logic

Я пишу последовательный счетчик, состоящий из ряда компонентов с одним счетчиком, в которых используются компоненты D-триггера. В одиночном счетчике мне нужно начать с начального значения '0' для q, но у меня возникают проблемы с его инициализацией.

q — это сигнал STD_LOGIC, и я попытался инициализировать его следующим образом:

signal q : STD_LOGIC := '0';

Однако, когда я запускаю программу с помощью ModelSim, она показывает значение U, как будто оно не назначено. Если я принудительно заморозил сигнал от '0' до q при запуске в ModelSim, то это сработает.

Единственный способ добиться этого — проверить значение в начале описания поведения и установить для него значение '0', если оно не назначено?

Если я использую BIT вместо STD_LOGIC, все работает отлично.

Я бы опубликовал свой код, но я не хочу рисковать нарушениями академической честности, поскольку это для школьного проекта.


person Ryan McClure    schedule 09.05.2015    source источник
comment
Что-нибудь еще движет Q? Обратите внимание, что если начальное значение равно 0 и есть водитель, управляющий 'U', два значения разрешаются в 'U'. (И если вы этого не поняли, почитайте о функциях разрешения).   -  person user_1818839    schedule 09.05.2015
comment
Что ж, я переношу вывод q из компонента D-триггера в q, указанный в вопросе. Это то, что вы имеете в виду?   -  person Ryan McClure    schedule 09.05.2015
comment
Да, это твоя проблема. Вам нужно очистить «U» от триггера, либо сбросив его, либо установив «0» или «1».   -  person user_1818839    schedule 09.05.2015


Ответы (1)


Причина, по которой это работает для BIT, а не для STD_LOGIC, заключается в том, что BIT имеет два значения «1» и «0» (нет значения для представления неинициализированного), а STD_LOGIC имеет 9 значений, одно из которых «U», что является значением, которое используется для обозначения "это значение еще не установлено".

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

Если вам интересно, почему инициализация в вашем объявлении сигнала не работает, то это потому, что не все инструменты синтеза признают этот тип инициализации, и ModelSim является одним из таких инструментов. Когда вы собираетесь поместить это на FPGA, Quartus признает этот тип инициализации, но Lattice Diamond или Xilinx ISE могут не быть, но, поскольку большинство устройств снабжены POR (сброс при включении питания), если вы включаете условие сброса, q всегда будет инициализирован, поэтому это хорошая практика.

person Gipsy Danger    schedule 23.06.2015