一、復位電路
時序電路為雙穩態電路,因此必須要有復位訊號,而組合電路沒有儲存功能,因此不需要復位訊號
電路中的復位有兩種形式:
1.同步復位
敏感列表中只有時鐘訊號沒有復位訊號
2.非同步復位
敏感列表中不僅有時鐘而且有復位訊號
為避免在釋放時產生亞穩態問題,一般採用同步復位,非同步釋放的電路
二、同步復位,非同步釋放電路
verilog程式碼如下:
module Rst_gen ( input clk, input rst_async_n, output reg rst_sync_n ); reg rst_s1; always @(posedge clk or negedge rst_async_n) begin if(!rst_async_n) begin rst_s1 <= 1'b0; rst_sync_n <= 1'b0; end else begin rst_s1 <= 1'b1; rst_sync_n <= rst_s1; end end endmodule
電路圖如下:
非同步復位:復位訊號不受時鐘訊號影響,在任意時刻只要低電平就可以復位。在圖中第一個方框中,當rst_async_n有效時,第一個D觸發器輸出的為低電平,第二個D觸發器輸出的rst_sync_n也是低電平,第二個方框中的非同步復位埠有效,輸出被複位
同步釋放:讓復位訊號取消時必須和時鐘同步,即和時鐘同沿。在上圖中假如rst_async_n訊號撤銷時發生在時鐘上升沿,那麼不加第一個框中的電路可能發生亞穩態事件,但加上此電路後,假如rst_async_n在時鐘上升沿撤銷,那麼第一個D觸發器的輸出可能為高電平,可能為亞穩態,也可能為低電平,但此時第二級D觸發器不會立刻更新輸出的值,保持在之前第一級的輸出(即低電平),在下一個時鐘上升沿到來時,才隨之變為高電平(因為此時第一級的輸出已經恢復)
Q:為什麼圖中第一級的輸入是連線的電源而不是rst_async_n?
A:如果連線的是rst_async_n,則綜合出的電路圖如下:
如果連結的是電源,則電路圖如下:
顯然第二種方法好,因為復位訊號本身是高扇出訊號,採用第二種設計可以減少復位訊號的扇出數,同時直接連線電源也可以節省資源,保證電路效能良好
注意:即使復位訊號的脈衝小於一個時鐘週期,且在一個時鐘週期內完成了非同步復位,這種電路還是能正確捕捉復位訊號,並且輸出一個比時鐘週期長的復位訊號(圖中考慮了觸發器的延時)
如果第一級觸發器的復位時鐘偏移比第二級大,並且在時鐘上升沿附近才釋放復位訊號(這裡感覺圖畫的有問題),那麼在T1時刻第一級的輸出可能出現亞穩態、高電平或者低電平,但此時第二級的輸出已經復位,為第一級輸出復位時的訊號(低電平),在T2時刻由於前一級暫存器輸出不確定,因此第二級的輸出rst_o可能保持有效,也可能撤離,如果T2時刻rst_o還是為復位電平,那麼在T3時刻電路輸出的復位電平就一定會撤離
因此,這也就意味著該電路輸出的復位訊號在撤離時可能會有一個時鐘週期的偏差,可能造成時序混亂
解決:首先用兩級暫存器對復位訊號進行同步,得到根復位訊號後再用復位同步電路進行分發由於同步後的根復位訊號不會產生亞穩態問題,因此在分發根同步復位訊號後再次分發兩級暫存器,這樣分發後的子復位網路是相互獨立的,且扇出輸出比跟復位網路要小很多,
擴充套件:多時鐘域下的非同步復位同步釋放電路
1.非協調的復位撤銷
即使用每個時鐘搭建自己的復位同步器
程式碼如下:
module CLOCK_RESET( input rst_n, input aclk, input bclk, input cclk, output reg arst_n, output reg brst_n, output reg crst_n ); reg arst_n0,arst_n1; reg brst_n0,brst_n1; reg crst_n0,crst_n1; always @(posedge aclk or negedge rst_n) if(rst_n==0) begin arst_n0<=1'b1; arst_n1<=1'b0; arst_n<=1'b0; end else begin arst_n<=arst_n1; arst_n1<=arst_n0; end always @(posedge bclk or negedge rst_n) if(rst_n==0) begin brst_n0<=1'b1; brst_n1<=1'b0; brst_n<=1'b0; end else begin brst_n<=brst_n1; brst_n1<=brst_n0; end always @(posedge cclk or negedge rst_n) if(rst_n==0) begin crst_n0<=1'b1; crst_n1<=1'b0; crst_n<=1'b0; end else begin crst_n<=crst_n1; crst_n1<=crst_n0; end endmodule
2.順序協調的復位撤銷
當多個時鐘域對復位釋放有順序要求時,將復位同步器級聯起來就可以構成多個時鐘域按順序進行同步釋放
程式碼如下:
module CLOCK_RESET( input rst_n, input aclk, input bclk, input cclk, output reg arst_n, output reg brst_n, output reg crst_n ); reg arst_n0,arst_n1; reg brst_n0,brst_n1; reg crst_n0,crst_n1; always @(posedge aclk or negedge rst_n) if(rst_n==0) begin arst_n0<=1'b1; arst_n1<=1'b0; arst_n<=1'b0; end else begin arst_n<=arst_n1; arst_n1<=arst_n0; end always @(posedge bclk or negedge rst_n) if(rst_n==0) begin brst_n1<=1'b0; brst_n<=1'b0; end else begin brst_n<=brst_n1; brst_n1<=arst_n; end always @(posedge cclk or negedge rst_n) if(rst_n==0) begin crst_n1<=1'b0; crst_n<=1'b0; end else begin crst_n<=crst_n1; crst_n1<=brst_n; end endmodule
Reference:
深入理解復位---同步復位,非同步復位,非同步復位同步釋放(含多時鐘域)_畫出支援非同步復位dff的電路圖-CSDN部落格
數位電路復位訊號設計(非同步復位、同步釋放)筆記詳解_非同步復位同步釋放的高有效原理-CSDN部落格