2014-04-07 29 views
1

我已經編寫了以下負邊沿觸發低於d-FF:(分別比如說8和5納秒)如何修改通用設置/保持時間的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; 

我的問題是,如果我想修改此代碼,包括通用的建立/保持時間,我該怎麼做?我知道我應該在實體中添加GENERIC語句,但是如何在條件中使用它們?難道我不能這樣說:

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

或類似的東西?

感謝您提供的任何和所有幫助!

回答

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; 
+0

謝謝!說得通。我不確定分離條件是否是最好的解決方案,但是你已經說服了我。乾杯! –

相關問題