Краткий ответ: потому что поведение защелки соответствует поведению неполной ЕСЛИ. А реестра нет.
if (A)
B = C;
Если условие A истинно, а C изменяется, выход B следует сразу же за входом. Если A ложно, B сохраняет его значение. Такое поведение оператора IF соответствует поведению защелки. Таким образом, защелка - это то, что генерируется.
Вы не можете сгенерировать такое поведение с помощью регистра.
Постановка вопроса неверна. Защелка не предполагается вместо триггера.
Триггеры выводятся каждый раз, когда сигнал проходит через тактовый процесс, даже с неполным оператором IF. Например, следующий код выводит триггер:
process(clock) is
begin
if rising_edge(clock) then
if (A) then
B <= C;
end if;
end if;
end process;
Защелки выводятся только в комбинаторных логических процессах, когда имеется неполный оператор IF. Это связано с тем, что неполный оператор if требует хранения информации, что невозможно с более простыми элементами комбинаторной логики (проводами и вентилями).
Регистры (и другая логика) выводятся (не создаются) из кода RTL. Создание экземпляра — это когда вы напрямую создаете экземпляр другого объекта. inst : entity work.dff port map (clk => clk, d=> d, q => q);
и т. д.
К сожалению, я не могу ответить на старый пердун (недостаточно репутации), так что технически короткий ответ вроде бы правильный.
Но в длинном ответе есть разные переменные: какой дизайн вы реализуете, какой инструмент вы используете и какая платформа является вашей целью.
Например. Quartus II 16.1, Cyclone V CSXFC6D6F31C6 такой код:
library ieee;
use ieee.std_logic_1164.all;
entity d_latch_test is
port
(
signal clk : in std_logic;
enable : in std_logic;
sr_in : in std_logic;
sr_out : out std_logic
);
end entity;
architecture rtl of d_latch_test is
begin
process (clk)
begin
if (rising_edge(clk)) then
if (enable = '1') then
sr_out <= sr_in;
end if;
end if;
end process;
end rtl;
Quartus Synthesis не скажет вам, что ваш код — защелка, но это D-триггер.
Но! Он имеет асинхронный ввод.
Таким образом, вы можете сделать триггер из оператора if.
IEEE Std 1076.6-2004 (синтез RTL, отозван) 6.2.1.1 Хранение, чувствительное к уровню, из процесса со списком чувствительности (или переменная) имеет явное назначение. б) Сигнал (или переменная) не имеет пути выполнения с <clock_edge> в качестве условия. в) Есть исполнения процесса, которые не выполняют явное назначение (через присвоение оператора) к сигналу (или переменной)». Присвоения удостоверений игнорируются. Обратите внимание на отсутствие края часов.