为什么不完整的 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。
为什么当我们尝试在 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。