我在下面编码了下面的负边缘触发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;
或类似的东西?
感谢您提供的所有帮助!
答案 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;