Я почти всегда сталкиваюсь с этой проблемой в VHDL, и это, вероятно, связано с моим образом мышления; так что я надеюсь, что кто-то сможет указать, как правильно думать об этом.
В любом случае, чаще, чем часто, мне нужна переменная (или, скорее, «регистр»), который в основном копировал бы значение входного сигнала, если сигнал разрешения, скажем, низкий - и сохранял бы его «последнее» значение. если разрешающий сигнал высокий. ( теперь, когда я написал это, я вижу, что неявно выборка здесь будет происходить при повышении фронта - переходе от низкого уровня к высокому - сигнала разрешения; поскольку пока параметр enable активен на низком уровне, тогда для любой небольшой дельты, изменение входа распространяется на регистр и, таким образом, «перезаписывает» значение, установленное из «предыдущего» дельта-времени ).
Итак, моя первая попытка обычно простейшая из возможных - поместить что-то вроде этого в мой файл VHDL:
wdata_reg <= wdata_in when (en_n = '0');
... что подразумевает не синхронизированную / асинхронную схему - и хотя я получаю результаты моделирования, которые я ожидаю , Синтезатор ISE WebPack xst
, например, barfs с:
ПРЕДУПРЕЖДЕНИЕ: Xst: 737 - обнаружена 8-битная защелка для сигнала
. Защелки могут быть сгенерированы из неполных операторов case или if. Мы не рекомендуем использовать защелки в конструкциях FPGA / CPLD, так как они могут привести к проблемам с синхронизацией.
Опять же, я предполагаю, что то, что я только что описал (не синхронизированный / асинхронный регистр выборки), по определению является защелкой? Так что я никогда не уверен, хочу я этого там или нет.
С другой стороны (если я правильно помню) я однажды тоже пытался написать такой код внутри конечного автомата (с синхронизацией):
...
IF en_n = '0' THEN
wdata_reg <= wdata_in;
END IF;
...
... и, я полагаю, компилятор на это не пожаловался (и все заработало, как ожидалось).
Итак, я думаю, мой вопрос можно было бы сформулировать так: всякий раз, когда мне нужно «выполнить выборку» в регистр, всегда ли я должен делать это из конечного автомата (или тактовой схемы) - или есть ли альтернатива? Например, я могу попытаться обмануть « неполные ... если операторы » следующим образом:
wd_read_o <= d_io when (wrd_n = '0') else wd_read_o;
... (другими словами: ... иначе присвоить себе самого себя) - но компилятор видит мою глупость и выплевывает старый ПРЕДУПРЕЖДЕНИЕ: Xst: 737
в любом случае :)
Я был бы признателен за некоторые советы, как думать об этом - поэтому я не сталкиваюсь с этой дилеммой каждый раз мне нужна регистрация :) Ура!