«Разблокированная» выборка и защелки в VHDL

Я почти всегда сталкиваюсь с этой проблемой в 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 в любом случае :)

Я был бы признателен за некоторые советы, как думать об этом - поэтому я не сталкиваюсь с этой дилеммой каждый раз мне нужна регистрация :) Ура!

5
задан sdaau 1 November 2011 в 19:12
поделиться