【问题标题】:Why do incomplete if statements create latches during synthesis in VHDL?为什么不完整的 if 语句在 VHDL 的综合过程中会创建锁存器?
【发布时间】:2019-07-18 18:29:59
【问题描述】:

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

非常感谢您从数字/电路的角度进行解释。

【问题讨论】:

  • IEEE Std 1076.6-2004(RTL 综合,已撤销) 6.2.1.1 带有敏感性列表的过程中的电平敏感存储以下适用: a) 信号(或变量)有明确的赋值。 b) 信号(或变量)没有以 作为条件的执行路径。 c) 有进程的执行没有对信号(或变量)执行显式赋值(通过赋值语句)。”身份分配被忽略。请注意缺少时钟边沿。

标签: vhdl synthesis digital flip-flop


【解决方案1】:

问题的前提是错误的。不推断锁存器而不是触发器。

每次信号通过时钟处理时都会推断出触发器,即使是不完整的 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 =&gt; clk, d=&gt; d, q =&gt; q);
【解决方案2】:

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

if (A)
   B = C;

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

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

【讨论】:

    【解决方案3】:

    很遗憾,我无法回复 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 语句中做一个触发器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-22
      相关资源
      最近更新 更多