Прежде всего, два фрагмента кода, которые вы представляете, даже не эквивалентны в симуляторе, потому что когда ENABLE
и RESET
оба равны 1
по фронту тактовой частоты, первый фрагмент приводит к DOUT
, являющемуся 00000000
, тогда как во втором он оценивается как DIN
.
У меня сложилось впечатление, что списки чувствительности (часть в скобках после process
) игнорируются при синтезе Xilinx Vivado. Я считаю их пережитком тех времен, когда инструменты моделирования не могли позволить себе определить, какие переменные следует отслеживать, чтобы определить, когда следует обновлять переменные. Я не знаю, что с ними делают другие инструменты синтеза.
В любом случае, вы указали ENABLE
в своем списке чувствительности, что означает, что вы хотите оценить операторы процесса, если ENABLE
изменит значение. Все операторы if оцениваются как ложные, если только не происходит повышение тактовых импульсов. Поэтому для моделирования достаточно одного CLK
в списке чувствительности.
С учетом всего сказанного, вам следует ограничить свой код форматами, которые явно рекомендованы поставщиком средства синтеза . Инструменты синтеза могут реализовать только подмножество всего, что вы можете написать в VHDL. Для Vivado вы можете найти предложенную структуру кода в руководстве по синтезу (Это для Vivado 2017.3). На странице 71 вы увидите, что они рекомендуют шлепанцы в форме:
process(clk) is
begin
if rising_edge(clk) then
if clr = '1' then
dout <= "00000000";
elsif ce = '1' then
dout <= d_in;
end if;
end if;
end process;
Конечно, вы можете переименовывать переменные по мере необходимости. На странице 69 вы также увидите, что Xilinx рекомендует использовать синхронные реализации (помещая все внутри оператора if rising_edge
) над асинхронными реализациями. В руководстве есть гораздо больше, например, о том, как записывать сдвиговые регистры или ОЗУ, с которыми вам следует ознакомиться, если вы хотите написать код, синтезируемый с помощью Vivado. Другие поставщики имеют аналогичную документацию с рекомендуемым кодом.