Я почти всегда сталкиваюсь с этой проблемой в VHDL, и это, вероятно, связано с моим мышлением; поэтому я надеюсь, что кто-то может указать правильный способ думать об этом.
В любом случае, более чем часто, я начинаю нуждаться в переменной (или, скорее, в «регистре»), которая в основном копирует значение входного сигнала, если сигнал разрешения, скажем, низкий, и сохраняет его «последнее» значение если сигнал разрешения высокий. ( Теперь, когда я написал это, я вижу, что неявно, выборка здесь будет происходить при повышении фронта - переходе от низкого к высокому - сигнала разрешения; поскольку, пока разрешение активно, низкий уровень, то для любого маленькая дельта, изменение ввода распространяется на регистр, и поэтому «перезаписывает» значение, установленное из «предыдущего» времени дельты ).
Итак, моя первая попытка, как правило, самая простая - поместить что-то подобное в мой VHDL-файл:
wdata_reg <= wdata_in when (en_n = '0');
... что подразумевает разомкнутую / асинхронную схему - и хотя я получаю в результатах моделирования то, что ожидаю, синтезатор ISE WebPack xst
, например, barfs с:
WARNING:Xst:737 - Found 8-bit latch for signal <wdata_reg>. Latches may be generated from incomplete case or if statements. We do not recommend the use of latches in FPGA/CPLD designs, as they may lead to timing problems.
Опять же, я думаю, что то, что я только что описал (разогнанный / асинхронный регистр "выборки") - по определению, защелка? Так что я никогда не уверен, хочу ли я этого там или нет.
С другой стороны (если я правильно помню), я когда-то также пытался написать код, подобный этому в конечном автомате (так, с синхронизацией):
...
IF en_n = '0' THEN
wdata_reg <= wdata_in;
END IF;
...
... и, я полагаю, компилятор на это не жаловался (и работал как положено).
Итак, я полагаю, мой вопрос можно сформулировать так: всякий раз, когда мне нужно «сэмплировать» в регистр, всегда ли я должен делать это из конечного автомата (или синхронизированной схемы) - или есть альтернатива? Например, я могу попытаться обмануть « неполное ... if заявления », например:
wd_read_o <= d_io when (wrd_n = '0') else wd_read_o;
... (другими словами: ... еще назначьте себя себе) - но компилятор видит мой нуберизм и все равно выплевывает оле WARNING:Xst:737
:)
Я был бы признателен за некоторые советы о том, как думать об этом, поэтому я не сталкиваюсь с этой дилеммой каждый раз, когда мне нужна регистрация :) Ура!