1

我在下面编写了以下下降沿触发的 D-FF:

ENTITY d_ff IS
PORT (d, cl : IN BIT; q, qbar : INOUT BIT);
END d_ff;

ARCHITECTURE dataflow of d_ff IS

BEGIN
  PROCESS (clk)
  IF (clk = '0' AND clk'EVENT)
    q <= d;
  ELSE
  q <= q;
 END IF;
 END dataflow;

我的问题是,如果我想修改此代码以包含通用设置/保持时间(分别为 8 和 5 ns),我该怎么做?我知道我应该在实体中添加 GENERIC 语句,但我将如何在条件下使用它们?我能不能说这样的话:

If (d'STABLE(hold))
q <= d AFTER setup;

或者类似的东西?

感谢您提供的所有帮助!

4

1 回答 1

2

要检查保持时间,您必须使用等待语句来实现 DFF。这使您可以手动控制时间进度,以在时钟沿之后和之前检查参数。一个不明显的“技巧”是使用 d'delayed 创建具有 delta 周期延迟的新信号,这使我们能够避免从 d 上的任何同时转换而是从 d 上的先前转换测量保持稳定属性。

我已将 Clock-to-Q 参数作为一个独立的泛型分开,因为这通常与保持时间不同。另请注意,此技术不适用于负保持或设置时间,因此我使用delay_length.

library ieee;
use ieee.std_logic_1164.all;

entity dff is
  generic (
    Tsu  : delay_length := 8 ns; -- Setup
    Thld : delay_length := 5 ns; -- Hold
    Tcq  : delay_length := 6 ns  -- Clock to Q delay
  );
  port (
    clock, d : in std_logic;
    q : out std_logic
  );
end entity;

architecture behavior of dff is
begin

  process
  begin
    assert Tcq >= Thld report "Tcq must be >= Thld" severity failure;

    wait until falling_edge(clock);
    if d'stable(Tsu) then
      wait for Thld;
      if d'delayed'stable(Thld) then
        q <= d after Tcq - Thld;
      else -- Hold violation
        report "Hold violation" severity warning;
        q <= 'X' after Tcq - Thld;
      end if;
    else -- Setup violation
      report "Setup violation" severity warning;
      q <= 'X' after Tcq;
    end if;

  end process;
end architecture;
于 2014-04-10T19:45:13.440 回答