为什么不完整的 if 语句会在 VHDL 中的综合过程中创建锁存器?

Why do incomplete if statements create latches during synthesis in VHDL?

为什么当我们尝试在 VHDL 中合成不完整的 if 语句时,合成器使用锁存器而不是触发器?

如果能从digital/circuit的角度进行解释,我们将不胜感激。

简短回答:因为锁存器的行为与不完整 IF 的行为相匹配。寄存器没有。

if (A)
   B = C;

如果条件 A 为真且 C 发生变化,则输出 B 立即跟随输入。如果 A 为假,B 保持它的价值。 IF 语句的这种行为对应于锁存器的行为。因此产生了一个锁存器。

您不能使用寄存器生成此行为。

题目前提错误。不会推断闩锁而不是 flip-flop。

Flip-flops 每次信号通过计时过程时都会被推断出来,即使 IF 语句不完整也是如此。例如,以下代码推断 flip-flop:

process(clock) is
begin
   if rising_edge(clock) then
      if (A) then
         B <= C;
      end if;
   end if;
end process;

仅当存在不完整的 IF 语句时,才会在组合逻辑过程中推断锁存器。这是因为不完整的 if 语句需要存储信息,而组合逻辑的更简单元素(连线和门)则无法做到这一点。

不幸的是,我无法回答 oldfart(声誉不够),所以从技术上讲,简短的回答是正确的。

但是,长答案有不同的变量:你实现什么样的设计,你使用什么工具,你的目标是什么平台。

例如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-flip-flop

但是!它具有异步输入。

所以基本上你可以从 if-statement 做一个 flip-flop。