什么是異步復位和同步釋放:
是指復位信號是異步有效的,即復位的發生與clk無關。后半句“同步釋放”是指復位信號的撤除也與clk無關,但是復位信號是在下一個clk來到后起的作用(釋放)。
下面說明一下如何實現異步復位和同步釋放的。
異步復位:顯而易見,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來之后,才隨著變為高電平。即同步釋放。
如圖第一個方框內是異步復位和同步釋放電路。有兩個D觸發器構成。第一級D觸發器的輸入時VCC,第二級觸發器輸出是可以異步復位,同步釋放后的復位信號。
電路目的:方式復位信號撤除時產生亞穩態事件。
所謂異步復位和同步釋放,是指復位信號是異步有效的,即復位的發生與clk無關。后半句“同步釋放”是指復位信號的撤除(釋放)則與clk相關,即同步的。
代碼實現:
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
對于實際的實現TECH MAP視圖
其實異步復位的話,優點就是可以直接用EDA工具綜合庫DFF的異步復位端,相對同步復位來說又簡單又省邏輯資源,但其致命缺點就是復位結束也就是釋放的時刻恰在時鐘上升沿的建立時間和保持時間之間時無法決定現在的復位狀態是1還是0,造成亞穩態。
試想下,如果這樣的復位信號應用在一個大的系統中,復位信號路徑到每一個模塊乃至到每一個寄存器的偏斜都會不同,如果恰在時鐘上升沿時刻附近必然引起諸多問題。
因此最好全局復位信號送出之前做一個“異步復位,同步釋放”的處理。
下面是常見兩種方式:
方式一:(自己看來應該是“異步復位同步化”)
always @ (posedge clk)
rst_nr 《= rst_n; //現將異步復位信號用同步時鐘打一拍
always @ (posedge clk or negedge rst_nr)
if(!rst_nr) b 《= 1‘b0;
else b 《= a;
方式二:(自己看來才是“異步復位,同步釋放”)
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; //鎖相環復位信號
評論
查看更多