什么是異步復(fù)位和同步釋放:
是指復(fù)位信號(hào)是異步有效的,即復(fù)位的發(fā)生與clk無(wú)關(guān)。后半句“同步釋放”是指復(fù)位信號(hào)的撤除也與clk無(wú)關(guān),但是復(fù)位信號(hào)是在下一個(gè)clk來(lái)到后起的作用(釋放)。
下面說(shuō)明一下如何實(shí)現(xiàn)異步復(fù)位和同步釋放的。
異步復(fù)位:顯而易見(jiàn),rst_async_n異步復(fù)位后,rst_sync_n將拉低,即實(shí)現(xiàn)異步復(fù)位。
同步釋放:這個(gè)是關(guān)鍵,看如何實(shí)現(xiàn)同步釋放,即當(dāng)復(fù)位信號(hào)rst_async_n撤除時(shí),由于雙緩沖電路(雙寄存器)的作用,rst_sync_n復(fù)位信號(hào)不會(huì)隨著rst_async_n的撤除而撤除。
假設(shè)rst_async_n撤除時(shí)發(fā)生在clk上升沿,如果不加此電路則可能發(fā)生亞穩(wěn)態(tài)事件,但是加上此電路以后,假設(shè)第一級(jí)D觸發(fā)器clk上升沿時(shí)rst_async_n正好撤除,則D觸發(fā)器1輸出高電平“1”,此時(shí)第二級(jí)觸發(fā)器也會(huì)更新輸出,但是輸出值為前一級(jí)觸發(fā)器clk來(lái)之前時(shí)的Q1輸出狀態(tài)。顯然Q1之前為低電平,顧第二級(jí)觸發(fā)器輸出保持復(fù)位低電平,直到下一個(gè)clk來(lái)之后,才隨著變?yōu)楦唠娖健<赐结尫拧?/p>
如圖第一個(gè)方框內(nèi)是異步復(fù)位和同步釋放電路。有兩個(gè)D觸發(fā)器構(gòu)成。第一級(jí)D觸發(fā)器的輸入時(shí)VCC,第二級(jí)觸發(fā)器輸出是可以異步復(fù)位,同步釋放后的復(fù)位信號(hào)。
電路目的:方式復(fù)位信號(hào)撤除時(shí)產(chǎn)生亞穩(wěn)態(tài)事件。
所謂異步復(fù)位和同步釋放,是指復(fù)位信號(hào)是異步有效的,即復(fù)位的發(fā)生與clk無(wú)關(guān)。后半句“同步釋放”是指復(fù)位信號(hào)的撤除(釋放)則與clk相關(guān),即同步的。
代碼實(shí)現(xiàn):
always @ (posedge clk, negedge rst_async_n)
if (!rst_async_n) begin
rst_s1 《= 1‘b0;
rst_s2 《= 1’b0;
end
else begin
rst_s1 《= 1‘b1;
rst_s2 《= rst_s1;
end
assign rst_sync_n = rst_s2;
endmodule
對(duì)于實(shí)際的實(shí)現(xiàn)TECH MAP視圖
其實(shí)異步復(fù)位的話,優(yōu)點(diǎn)就是可以直接用EDA工具綜合庫(kù)DFF的異步復(fù)位端,相對(duì)同步復(fù)位來(lái)說(shuō)又簡(jiǎn)單又省邏輯資源,但其致命缺點(diǎn)就是復(fù)位結(jié)束也就是釋放的時(shí)刻恰在時(shí)鐘上升沿的建立時(shí)間和保持時(shí)間之間時(shí)無(wú)法決定現(xiàn)在的復(fù)位狀態(tài)是1還是0,造成亞穩(wěn)態(tài)。
試想下,如果這樣的復(fù)位信號(hào)應(yīng)用在一個(gè)大的系統(tǒng)中,復(fù)位信號(hào)路徑到每一個(gè)模塊乃至到每一個(gè)寄存器的偏斜都會(huì)不同,如果恰在時(shí)鐘上升沿時(shí)刻附近必然引起諸多問(wèn)題。
因此最好全局復(fù)位信號(hào)送出之前做一個(gè)“異步復(fù)位,同步釋放”的處理。
下面是常見(jiàn)兩種方式:
方式一:(自己看來(lái)應(yīng)該是“異步復(fù)位同步化”)
always @ (posedge clk)
rst_nr 《= rst_n; //現(xiàn)將異步復(fù)位信號(hào)用同步時(shí)鐘打一拍
always @ (posedge clk or negedge rst_nr)
if(!rst_nr) b 《= 1‘b0;
else b 《= a;
方式二:(自己看來(lái)才是“異步復(fù)位,同步釋放”)
reg pllrst1,pllrst2;
wire pllrst;
always @(posedge clk or negedge rst_n)
if(!rst_n) begin pllrst1 《= 1’b1;
pllrst2 《= 1‘b1; end
else begin pllrst1 《= 1’b0;
pllrst2 《= pllrst1; end
assign pllrst = pllrst2; //鎖相環(huán)復(fù)位信號(hào)
評(píng)論
查看更多