無論同步還是異步復位,在對觸發器時序進行分析的時候,都要考慮復位端與時鐘的相位關系。 對于同步復位,復位信號可以理解為一個普通的數據信號,它只有在時鐘的跳變沿才會其作用,一般只要復位信號持續時間大于一個時鐘周期,就可以保證正確復位。 對于異步復位,復位可以在任何時候發生,表面上看跟時鐘沒有關系,但真實情況是異步復位也需考慮時鐘跳變沿,因為時鐘沿變化和異步復位都可以引起Q端數據變化,如果異步復位信號跟時鐘在一定時間間隔內發生變化,Q值將無法確定,即亞穩態現象。這個時候既是異步復位信號持續時間再長都沒有辦法,因為不定態已經傳遞下去。 一下資料來自網絡-冰凌霄注 1. 一、特點: 同步復位:顧名思義,同步復位就是指復位信號只有在時鐘上升沿到來時,才能有效。否則,無法完成對系統的復位工作。用Verilog描述如下: always @ (posedge clk) begin if (!Rst_n) ... end 異步復位:它是指無論時鐘沿是否到來,只要復位信號有效,就對系統進行復位。用Verilog描述如下: always @ (posedge clk or negedge Rst_n) begin if (!Rst_n) ... end 二、各自的優缺點: 1、總的來說,同步復位的優點大概有3條: a、有利于仿真器的仿真。 b、可以使所設計的系統成為100%的同步時序電路,這便大大有利于時序分析,而且綜合出來的fmax一般較高。 c、因為他只有在時鐘有效電平到來時才有效,所以可以濾除高于時鐘頻率的毛刺。他的缺點也有不少,主要有以下幾條: a、復位信號的有效時長必須大于時鐘周期,才能真正被系統識別并完成復位任務。同時還要考慮,諸如:clkskew,組合邏輯路徑延時,復位延時等因素。 b、由于大多數的邏輯器件的目標庫內的DFF都只有異步復位端口,所以,倘若采用同步復位的話,綜合器就會在寄存器的數據輸入端口插入組合邏輯,這樣就會耗費較多的邏輯資源。 2、對于異步復位來說,他的優點也有三條,都是相對應的 a、大多數目標器件庫的dff都有異步復位端口,因此采用異步復位可以節省資源。 b、設計相對簡單。 c、異步復位信號識別方便,而且可以很方便的使用FPGA的全局復位端口GSR。 缺點: a、在復位信號釋放(release)的時候容易出現問題。具體就是說:倘若復位釋放時恰恰在時鐘有效沿附近,就很容易使寄存器輸出出現亞穩態,從而導致亞穩態。 b、復位信號容易受到毛刺的影響。 三、總結: 所以說,一般都推薦使用異步復位,同步釋放的方式,而且復位信號低電平有效。這樣就可以兩全其美了。
2:推薦的復位方式
所謂推薦的復位方式就是上文中所說的:“異步復位,同步釋放”。這就結合了雙方面的優點,很好的克服了異步復位的缺點(因為異步復位的問題主要出現在復位信號釋放的時候,具體原因可見上文)。 其實做起來也并不難,我推薦一種我經常使用的方式吧:那就是在異步復位鍵后加上一個所謂的“resetsynchronizer”,這樣就可以使異步復位信號同步化,然后,再用經過處理的復位信號去作用系統,就可以保證比較穩定了。resetsychronizer的Verilog代碼如下: module Reset_Synchronizer (output reg rst_n, input clk,asyncrst_n); reg rff1; always @ (posedge clk , negedge asyncrst_n)begin if(!asyncrst_n) {rst_n,rff1} <= 2'b0; else {rst_n,rff1} <={rff1,1'b1}; end endmodule 大家可以看到,這就是一個dff,異步復位信號直接接在它的異步復位端口上(低電平有效),然后數據輸入端rff1一直為高電平‘1’。倘若異步復位信號有效的話,觸發器就會復位,輸出為低,從而復位后繼系統。但是,又由于這屬于時鐘沿觸發,當復位信號釋放時,觸發器的輸出要延遲一個時鐘周期才能恢復成‘1’,因此使得復位信號的釋放與時鐘沿同步化。 此外,還有一種方法更為直接,就是直接在異步復位信號后加一個D觸發器,然后用D觸發器的輸出作為后級系統的復位信號,也能達到相同的效果。這里就不多說了。
3:多時鐘系統中復位的處理方法)
這是一個很實際的問題,因為在較大型的系統中,一個時鐘驅動信號顯然不能滿足要求,一定會根據系統的要求用多個同源時鐘(當然也可以是非同源了)去驅動系統的不同部分。那么在這樣的多時鐘系統中,復位鍵怎么設置?它的穩定與否直接關系到了整個系統的穩定性,因此要格外注意(在我看來,復位信號在同步時序系統中的地位和時鐘信號一樣重要)。下面就說一下具體的處理方法,當然所遵循的原則就仍應該是上文的“異步復位,同步釋放”: 1.non-coordinated resetremoval:顧名思義,就是同一個系統中的多個同源時鐘域的復位信號,由彼此獨立的“resetsynchronizer”驅動。當異步復位信號有效時,各時鐘域同時復位,但是復位釋放的時間由各自的驅動時鐘決定,也是就說:時鐘快的先釋放,時鐘慢的后釋放,但是各復位信號之間沒有先后關系。
2.sequence coordinated resetremoval:這是相對于上述方式來說的,也就是說各時鐘域的復位信號彼此相關,各個部分系統雖然也同時復位,但是卻分級釋放。而分級的順序可由各個“resetsynchronizer”的級聯方式決定。可以先復位前級,再復位后級,也可以反過來。反正方式很靈活,需要根據實際需要而定。由于圖片上傳問題,我只能用程序表示了,大家湊或看吧,哈哈 例子:三級復位系統,系統中的時鐘分別為1M,2M,11M: 第一級Reset_Sychronizer程序: module Reset_Synchronizer (output reg rst_n, input clk, asyncrst_n); reg rff1; always @ (posedge clk , negedge asyncrst_n) begin if(!asyncrst_n) {rst_n,rff1} <= 2'b0; else {rst_n,rff1}<= {rff1,1'b1}; end endmodule
第2,3級的Reset_Sychronizer程序: module Reset_Synchronizer2 (output reg rst_n, input clk, asyncrst_n,d); reg rff1;
always @ (posedge clk , negedge asyncrst_n)begin if (!asyncrst_n) {rst_n,rff1}<= 2'b0; else{rst_n,rff1} <= {rff1,d}; end endmodule 頂層模塊的源程序: include "Reset_Synchronizer.v" include "Reset_Synchronizer2.v" module AsynRstTree_Trans ( input Clk1M,Clk2M,Clk11M,SysRst_n, outputSysRst1M_n,SysRst2M_n,SysRst11M_n ); Reset_SynchronizerRst1M(.clk(Clk1M),. asyncrst_n(SysRst_n),.rst_n(SysRst1M_n)); Reset_Synchronizer2Rst2M(.clk(Clk2M),.d(SysRst1M_n),.asyncrst_n(SysRst_n),.rst_n(SysRst2M_n)); Reset_Synchronizer2Rst11M(.clk(Clk11M),.d(SysRst2M_n),.asyncrst_n(SysRst_n),.rst_n(SysRst11M_n)); endmodule
|