如何修改此D-FF以进行通用设置/保持时间?

时间:2014-04-07 20:37:37

标签: generics vhdl flip-flop

我在下面编码了下面的负边缘触发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;

或类似的东西?

感谢您提供的所有帮助!

1 个答案:

答案 0 :(得分:2)

要检查保持时间,必须使用wait语句实现DFF。这允许您手动控制时间进度,以便在时钟边沿之后以及之前检查参数。一个非显而易见的&#34;技巧&#34;是使用d&#39;延迟创建一个具有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;