一般來說,同步系統,都使用異步復位。這是因為同步復位的電路實現,比異步復位的電路實現,要浪費更多電路資源。
工程實踐中,確實見過由於未做異步復位的同步處理,而出現大概率系統死機現象(復位的作用域是很大的)。
一、異步復位不安全的原因
1.什么是異步復位
在帶有復位端的D觸發器中,當reset信號“復位”有效時,它可以直接驅動最后一級的與非門,令Q端“異步”置位為“1”or“0”。這就是異步復位。
當這個復位信號release時,Q的輸出由前一級的內部輸出決定(D端口)。
2.復位信號的恢復時間T( recovery time ):
原本有效的復位信號釋放(對於低電平有效的復位信號指上升沿),與緊跟其后的第一個時鍾上升沿之間的最小時間。
這個時間的意義是,如果保證不了這個最小恢復時間,也就是說這個異步控制信號的解除與“下個時鍾沿”離得太近(但在這個時鍾沿之前),沒有給寄存器留有足夠時間來恢復至正常狀態,那么就不能保證“下個時鍾沿”能正常作用,也就是說這個“時鍾沿”可能會失效。
3.復位信號的移除時間T(recovery time):
時鍾信號的上升沿,與緊跟其后異步復位信號從有效到無效的最小時間。
這個時間的意義是,如果保證不了這個去除時間,也就是說這個異步控制信號的解除與“有效時鍾沿”離得太近(但在這個時鍾沿之后),那么就不能保證有效地屏蔽這個“時鍾沿”,也就是說這個“時鍾沿”可能會起作用。
4.恢復與移除時間的意義
如果你想讓某個時鍾沿起作用,那么你就應該在“恢復時間”之前是異步控制信號變無效,如果你想讓某個時鍾沿不起作用,那么你就應該在“去除時間”過后使控制信號變無效。如果你的控制信號在這兩種情況之間,那么就沒法確定時鍾沿是否起作用或不起作用了,也就是說可能會造成寄存器處於不確定的狀態。而這些情況是應該避免的。所以在復位信號的處理上,要遵守恢復時間和去除時間。
如下圖異步復位時序所示,為復位電路復位時序圖。如果異步復位信號的撤銷時間在Trecovery(恢復時間)和Tremoval(移除時間)之內,那勢必造成亞穩態的產生,輸出在時鍾邊沿的Tco后會產生振盪,振盪時間為Tmet(決斷時間),最終穩定到“0”或者“1”,就會可能造成復位失敗。
5.總結
異步復位信號亞穩態的原因
復位結束也就是釋放的時刻,恰在時鍾上升沿的建立時間和保持時間之間時,無法決定現在的復位狀態是1還是0,造成亞穩態。
二、推薦異步復位同步釋放
1.電路結構
異步復位:顯而易見,rst_async_n異步復位后,rst_sync_n將拉低,即實現異步復位。
同步釋放:這個是關鍵,看如何實現同步釋放,即當復位信號rst_async_n撤除時,由於雙緩沖電路(雙寄存器)的作用,rst_sync_n復位信號不會隨着rst_async_n的撤除而撤除。
假設rst_async_n撤除時發生在clk上升沿,如果不加此電路則可能發生亞穩態事件,但是加上此電路以后,假設第一級D觸發器clk上升沿時rst_async_n正好撤除,則D觸發器1輸出高電平“1”,此時第二級觸發器也會更新輸出,但是輸出值為前一級觸發器clk來之前時的Q1輸出狀態。顯然Q1之前為低電平,因此第二級觸發器輸出保持復位低電平,直到下一個clk來之后,才隨着變為高電平。即同步釋放。
2.代碼實現
1 module reset_gen ( output rst_sync_n, input clk, rst_async_n); 2 reg rst_s1, rst_s2; 3 wire rst_sync_n ; 4 5 always @ (posedge clk, posedge rst_async_n) 6 if (rst_async_n) 7 begin 8 rst_s1 <= 1'b0; 9 rst_s2 <= 1'b0; 10 end 11 else 12 begin 13 rst_s1 <= 1'b1; 14 rst_s2 <= rst_s1; 15 end 16 17 assign rst_sync_n = rst_s2; //注意這里的rst_sync_n才是我們真正對系統輸出的復位信號 18 19 endmodule