2013-12-19 24 views
0

當靈敏度列表中包含信號時,每次信號變化時都會執行該過程。例如,設置時間是進程中異步信號的問題嗎?

-- State Memory 
-- Synchronous Reset 
process (clk) 
begin 
    if (rst = '1') then 
     p_state <= initialization; 
    elsif (rising_edge(clk)) then 
     p_state <= n_state; 
    end if; 
end process; 

但是,如果rst被包括在靈敏度列表中,則它變爲異步復位。現在我的問題是,當第一個被斷言時。該過程被執行。但是第一個信號是否已經穩定,第一個信號的值是'1'?

+0

您可以請審查和澄清你的問題;我無法弄清楚你正在問什麼。 BTS。上面的代碼會給你一個關於靈敏度列表中缺少信號「rst」和「initialization」的綜合警告。 –

回答

0

通常,VHDL用於描述register transfer level的設計。在這個抽象層次上,建立和保持時間被忽略。由於會議建立和保持時間往往更多地是設計的物理佈局的函數,而不是邏輯,所以在驗證設計邏輯時這種假設通常是合理的。

當您編寫VHDL process具有不完整靈敏度列表的模塊時,由於綜合工具通常會忽略靈敏度列表,因此您會冒險模擬和綜合之間的差異。其結果是,你真的有兩個選擇:

-- Asynchronous Reset 
process (clk, rst) 
begin 
    if (rst = '1') then 
     p_state <= (others => '0'); 
    elsif (rising_edge(clk)) then 
     p_state <= n_state; 
    end if; 
end process; 

-- Synchronous Reset 
process (clk) 
begin 
    if (rising_edge(clk)) then 
     if (rst = '1') then 
      p_state <= (others => '0'); 
     else 
      p_state <= n_state; 
     end if; 
    end if; 
end process; 

你不應該執行使用異步復位模式,然後略去敏感列表rst同步復位。

+0

上面的「異步復位」示例缺少靈敏度列表中的「初始化」。此外,具有取決於外部信號的異步復位值可能會在某些FPGA技術中出現問題。 –

+0

@MortenZdk好的......我沒有注意到重置沒有使用一個常量值。 – godel9

+1

@MortenZdk我假設'初始化'不是一個信號,而是復位後開始的狀態。 – zennehoy

2

您的示例不是同步重置。

這是異步復位的無效實現,因爲rst在進程敏感性列表中缺失。在仿真中,它可能看起來像是同步重置,但綜合忽略了靈敏度列表併合成異步重置。

我假設initialization是一個定義的狀態,而不是一個信號,否則你在那裏有另一個問題(復位值應該總是恆定的,而不依賴於另一個信號)。

0

如果我正確理解你的問題,你所關心的觸發器的設置時間(和,因此,也保持時間)。這些時間是指數據輸入,而不是復位輸入,這是防止亞穩態和實現正確的數據存儲所必需的。

同步復位強制輸出爲零,而不管其他任何信號如何,在觸發器的晶體管級覆蓋任何數據或時鐘相關信息。