2014-02-10 34 views
1

我沒有用VHDL太多的經驗,所以原諒我,如果這是愚蠢無聊的問題,但我找不到合適的答案會產生錯誤的結果。我的代碼在這裏有點簡化。VHDL邏輯當使用頻率較高

process (sys_clk, reset): 

    begin 
    if reset = '0' then 
    -- reseting code 
    elsif rising_edge(sys_clk) then 
     if data_ready = '1' and old_data_ready = '0' then -- rising edge of asynchronous sig 
      -- update few registers, and assigning values to few signals 
     elsif error_occured = '1' and old_error_occurred = '0' then 
      -- update few registers, and assigning values to few signals (same registers and signal as above) 
     end if; 
     old_data_ready <= data_ready; 
     old_error_occured <= error_occured; 
    end if; 

    end process; 

信號保存時間比sys_clk的週期長得多,但它不知道多長時間。它有所不同。這些IF產生兩個(每個)寄存器和一個AND電路。我相信你知道這一點。 這工作,但非常糟糕。往往是錯誤。所以我用兩個過程做了特殊的項目。一個在data_ready的上升沿有效,另一個在error_occured上有效。但我可以用它來增加和減少分開的計數器。我用它來驗證我的代碼的問題是,有時這種上升沿檢測不起作用。 sys_clk是27MHz,我使用相同的頻率製作了更大的項目,並且運行良好。但是這種方式沒有檢測到異步信號的上升沿。所以我把頻率降低到100kHz,因爲我不需要更高的頻率。這解決了我的問題。

但只是出於好奇,什麼是測試異步信號的上升沿時,一些這些信號的影響相同的寄存器和設備需要工作在更高頻率的最好方法?

我使用Altera的Quartus II和Cyclone II FPGA。

回答

2

如果您對信號進行採樣是真正異步的,你必須處理亞穩態的問題。如果data_ready信號恰好在sys_clk的上升沿處於亞穩狀態,則old_data_ready和第一個if語句可能會看到不同版本的data_ready。此外,你有一個異步重置。如果在data_ready發生變化時準確釋放復位信號,則可能會導致data_ready在您的系統中採樣到不同的值。模擬器不會顯示亞穩態問題,因爲代碼在邏輯上是正確的。

爲了避免這些問題,有內的模塊之間的異步復位,但同步。 另外,同步來自不同時鐘域的信號。同步器是一對緊密放置在一起的觸發器。當信號通過FF時,任何亞穩態問題都會在達到邏輯之前得到解決。計算平均故障間隔時間(MTBF)由於FPGA中的亞穩態而有一個公式。我不會背誦它,但基本上說,使用這種簡單的方法可以將MTBF從幾秒鐘減少到幾十億年。

VHDL同步:您的模塊中

process(clk, rst) is 
begin 
    if(rising_edge(clk)) then 
    if(rst = '0') then 
     data_ready_s1 <= '0'; 
     data_ready_s2 <= '0'; 
    else 
     data_ready_s1 <= data_ready; 
     data_ready_s2 <= data_ready_s1; 
    end if; 
    end if; 
end process; 

使用data_ready_s2。 然後你限制在UCF文件中的觸發器之間的路徑:

TIMEGRP "FF_s1" = FFS("*_s1") FFS("*_s1<*>"); 
TIMEGRP "FF_s2" = FFS("*_s2") FFS("*_s2<*>"); 
TIMESPEC TS_SYNC = FROM "FF_s1" TO "FF_s2" 2 ns DATAPATHONLY; 
+0

@Marko:一開始,先確定是亞穩態的問題,通過簡單地將同步觸發器兩個'data_ready'和'error_occured'。有關該主題的更多信息,請參見[Wikipedia Metastability in electronics](https://en.wikipedia.org/wiki/Metastability_in_electronics)和相關外部鏈接。 –

+0

謝謝你們兩位。我在哪裏可以找到如何在VHDL中實現同步觸發器(以及如何在電路圖中查找)?你有什麼建議嗎? – Marko

+0

@Marko我編輯我的帖子用一個例子 – ni9e