如果在VHDL中的综合过程中语句创建了闩锁,为什么不完整?

时间:2019-07-18 18:29:59

标签: vhdl synthesis digital flip-flop

如果在VHDL中,如果合成器使用锁存器而不是触发器,那么当我们尝试合成不完整时,为什么会这样呢?

从数字/电路角度的解释将不胜感激。

3 个答案:

答案 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触发器 Quartus RTL Viewer

但是!它具有异步输入。

因此,基本上,您可以从if语句中创建触发器。