如果在VHDL中,如果合成器使用锁存器而不是触发器,那么当我们尝试合成不完整时,为什么会这样呢?
从数字/电路角度的解释将不胜感激。
答案 0 :(得分:1)
简短的回答:因为闩锁的行为与不完整IF的行为相匹配。没有注册。
if (A)
B = C;
如果条件A为真且C发生变化,则输出B立即跟随输入。如果A为假,则B保持其值。 IF语句的这种行为与闩锁的行为相对应。这样就生成了一个闩锁。
您无法使用寄存器生成此行为。
答案 1 :(得分:1)
问题的前提是错误的。该锁存器不是推论触发器而是推论得出。
每当信号经过时钟处理时,即使存在不完整的IF语句,也会推断出触发器。例如,以下代码推断出触发器:
process(clock) is
begin
if rising_edge(clock) then
if (A) then
B <= C;
end if;
end if;
end process;
仅当存在不完整的IF语句时,才在组合逻辑过程中推断锁存器。这是由于以下事实:不完整的if语句需要存储信息,而组合逻辑的简单元素(导线和门)则是不可能的。
答案 2 :(得分:0)
不幸的是,我无法回答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触发器
但是!它具有异步输入。
因此,基本上,您可以从if语句中创建触发器。