同步復(fù)位和異步復(fù)位的比較
發(fā)布日期:2024-05-06
點(diǎn)擊次數(shù):144
無論同步還是異步復(fù)位,在對(duì)觸發(fā)器時(shí)序進(jìn)行分析的時(shí)候,都要考慮復(fù)位端與時(shí)鐘的相位關(guān)系。
對(duì)于同步復(fù)位,復(fù)位信號(hào)可以理解為一個(gè)普通的數(shù)據(jù)信號(hào),它只有在時(shí)鐘的跳變沿才會(huì)其作用,一般只要復(fù)位信號(hào)持續(xù)時(shí)間大于一個(gè)時(shí)鐘周期,就可以保證正確復(fù)位。
對(duì)于異步復(fù)位,復(fù)位可以在任何時(shí)候發(fā)生,表面上看跟時(shí)鐘沒有關(guān)系,但真實(shí)情況是異步復(fù)位也需考慮時(shí)鐘跳變沿,因?yàn)闀r(shí)鐘沿變化和異步復(fù)位都可以引起Q端數(shù)據(jù)變化,如果異步復(fù)位信號(hào)跟時(shí)鐘在一定時(shí)間間隔內(nèi)發(fā)生變化,Q值將無法確定,即亞穩(wěn)態(tài)現(xiàn)象。這個(gè)時(shí)候既是異步復(fù)位信號(hào)持續(xù)時(shí)間再長(zhǎng)都沒有辦法,因?yàn)椴欢☉B(tài)已經(jīng)傳遞下去。
一下資料來自網(wǎng)絡(luò)-冰凌霄注
1.
一、特點(diǎn):
同步復(fù)位:顧名思義,同步復(fù)位就是指復(fù)位信號(hào)只有在時(shí)鐘上升沿到來時(shí),才能有效。否則,無法完成對(duì)系統(tǒng)的復(fù)位工作。用Verilog描述如下:
always @ (posedge clk) begin
if (!Rst_n)
...
end
異步復(fù)位:它是指無論時(shí)鐘沿是否到來,只要復(fù)位信號(hào)有效,就對(duì)系統(tǒng)進(jìn)行復(fù)位。用Verilog描述如下:
always @ (posedge clk or negedge Rst_n) begin
if (!Rst_n)
...
end
二、各自的優(yōu)缺點(diǎn):
1、總的來說,同步復(fù)位的優(yōu)點(diǎn)大概有3條:
a、有利于仿真器的仿真。
b、可以使所設(shè)計(jì)的系統(tǒng)成為100%的同步時(shí)序電路,這便大大有利于時(shí)序分析,而且綜合出來的fmax一般較高。
c、因?yàn)樗挥性跁r(shí)鐘有效電平到來時(shí)才有效,所以可以濾除高于時(shí)鐘頻率的毛刺。他的缺點(diǎn)也有不少,主要有以下幾條:
a、復(fù)位信號(hào)的有效時(shí)長(zhǎng)必須大于時(shí)鐘周期,才能真正被系統(tǒng)識(shí)別并完成復(fù)位任務(wù)。同時(shí)還要考慮,諸如:clk skew,組合邏輯路徑延時(shí),復(fù)位延時(shí)等因素。
b、由于大多數(shù)的邏輯器件的目標(biāo)庫(kù)內(nèi)的DFF都只有異步復(fù)位端口,所以,倘若采用同步復(fù)位的話,綜合器就會(huì)在寄存器的數(shù)據(jù)輸入端口插入組合邏輯,這樣就會(huì)耗費(fèi)較多的邏輯資源。
2、對(duì)于異步復(fù)位來說,他的優(yōu)點(diǎn)也有三條,都是相對(duì)應(yīng)的
a、大多數(shù)目標(biāo)器件庫(kù)的dff都有異步復(fù)位端口,因此采用異步復(fù)位可以節(jié)省資源。
b、設(shè)計(jì)相對(duì)簡(jiǎn)單。
c、異步復(fù)位信號(hào)識(shí)別方便,而且可以很方便的使用FPGA的全局復(fù)位端口GSR。
缺點(diǎn):
a、在復(fù)位信號(hào)釋放(release)的時(shí)候容易出現(xiàn)問題。具體就是說:倘若復(fù)位釋放時(shí)恰恰在時(shí)鐘有效沿附近,就很容易使寄存器輸出出現(xiàn)亞穩(wěn)態(tài),從而導(dǎo)致亞穩(wěn)態(tài)。
b、復(fù)位信號(hào)容易受到毛刺的影響。
三、總結(jié):
所以說,一般都推薦使用異步復(fù)位,同步釋放的方式,而且復(fù)位信號(hào)低電平有效。這樣就可以兩全其美了。
2:推薦的復(fù)位方式
所謂推薦的復(fù)位方式就是上文中所說的:“異步復(fù)位,同步釋放”。這就結(jié)合了雙方面的優(yōu)點(diǎn),很好的克服了異步復(fù)位的缺點(diǎn)(因?yàn)楫惒綇?fù)位的問題主要出現(xiàn)在復(fù)位信號(hào)釋放的時(shí)候,具體原因可見上文)。
其實(shí)做起來也并不難,我推薦一種我經(jīng)常使用的方式吧:那就是在異步復(fù)位鍵后加上一個(gè)所謂的“reset synchronizer”,這樣就可以使異步復(fù)位信號(hào)同步化,然后,再用經(jīng)過處理的復(fù)位信號(hào)去作用系統(tǒng),就可以保證比較穩(wěn)定了。reset sychronizer的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
大家可以看到,這就是一個(gè)dff,異步復(fù)位信號(hào)直接接在它的異步復(fù)位端口上(低電平有效),然后數(shù)據(jù)輸入端rff1一直為高電平‘1’。倘若異步復(fù)位信號(hào)有效的話,觸發(fā)器就會(huì)復(fù)位,輸出為低,從而復(fù)位后繼系統(tǒng)。但是,又由于這屬于時(shí)鐘沿觸發(fā),當(dāng)復(fù)位信號(hào)釋放時(shí),觸發(fā)器的輸出要延遲一個(gè)時(shí)鐘周期才能恢復(fù)成‘1’,因此使得復(fù)位信號(hào)的釋放與時(shí)鐘沿同步化。 此外,還有一種方法更為直接,就是直接在異步復(fù)位信號(hào)后加一個(gè)D觸發(fā)器,然后用D觸發(fā)器的輸出作為后級(jí)系統(tǒng)的復(fù)位信號(hào),也能達(dá)到相同的效果。這里就不多說了。
3:多時(shí)鐘系統(tǒng)中復(fù)位的處理方法)
這是一個(gè)很實(shí)際的問題,因?yàn)樵谳^大型的系統(tǒng)中,一個(gè)時(shí)鐘驅(qū)動(dòng)信號(hào)顯然不能滿足要求,一定會(huì)根據(jù)系統(tǒng)的要求用多個(gè)同源時(shí)鐘(當(dāng)然也可以是非同源了)去驅(qū)動(dòng)系統(tǒng)的不同部分。那么在這樣的多時(shí)鐘系統(tǒng)中,復(fù)位鍵怎么設(shè)置?它的穩(wěn)定與否直接關(guān)系到了整個(gè)系統(tǒng)的穩(wěn)定性,因此要格外注意(在我看來,復(fù)位信號(hào)在同步時(shí)序系統(tǒng)中的地位和時(shí)鐘信號(hào)一樣重要)。下面就說一下具體的處理方法,當(dāng)然所遵循的原則就仍應(yīng)該是上文的“異步復(fù)位,同步釋放”:
1.non-coordinated reset removal:顧名思義,就是同一個(gè)系統(tǒng)中的多個(gè)同源時(shí)鐘域的復(fù)位信號(hào),由彼此獨(dú)立的“reset synchronizer”驅(qū)動(dòng)。當(dāng)異步復(fù)位信號(hào)有效時(shí),各時(shí)鐘域同時(shí)復(fù)位,但是復(fù)位釋放的時(shí)間由各自的驅(qū)動(dòng)時(shí)鐘決定,也是就說:時(shí)鐘快的先釋放,時(shí)鐘慢的后釋放,但是各復(fù)位信號(hào)之間沒有先后關(guān)系。
2.sequence coordinated reset removal:這是相對(duì)于上述方式來說的,也就是說各時(shí)鐘域的復(fù)位信號(hào)彼此相關(guān),各個(gè)部分系統(tǒng)雖然也同時(shí)復(fù)位,但是卻分級(jí)釋放。而分級(jí)的順序可由各個(gè)“reset synchronizer”的級(jí)聯(lián)方式?jīng)Q定??梢韵葟?fù)位前級(jí),再?gòu)?fù)位后級(jí),也可以反過來。反正方式很靈活,需要根據(jù)實(shí)際需要而定。由于圖片上傳問題,我只能用程序表示了,大家湊或看吧,哈哈
例子:三級(jí)復(fù)位系統(tǒng),系統(tǒng)中的時(shí)鐘分別為1M,2M,11M:
第一級(jí)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級(jí)的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,
output SysRst1M_n,SysRst2M_n,SysRst11M_n
);
Reset_Synchronizer Rst1M(.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
免責(zé)聲明: 本文章轉(zhuǎn)自其它平臺(tái),并不代表本站觀點(diǎn)及立場(chǎng)。若有侵權(quán)或異議,請(qǐng)聯(lián)系我們刪除。謝謝! |