FPGA設計中的非同步復位 同步釋放思想

2022-07-03 10:57:09 字數 4309 閱讀 2279

1.乙個簡單的非同步復位例子:

module

test(

input

clk,

input

rst_n,

input

data_in,

output

regout

);always@(posedge clk or

negedge

rst_n)

if(!rst_n)

out

<= 0;  

else

out

<=data_in;

endmodule

綜合結果如下:

我們可以看到,fpga的暫存器都有乙個非同步清零端(clr),在非同步復位設計中,低電平有效的rst_n復位訊號就可以直接連在這個埠上。(如果是高有效的復位,綜合時會把它取反後接在這個埠上)

2.乙個同步復位的例子:

module

test(

input

clk,

input

rst_n,

input

data_in,

output

regout

);always@(posedge clk)

if(!rst_n)

out

<= 0;  

else

out

<=data_in;

endmodule

綜合結果如下:

我們可以看到,該電路中沒有用到暫存器的clr端,而是把rst_n復位訊號作為輸入邏輯的使能訊號,那麼這樣的同步復位勢必會額外增加fpga內部的資源消耗。

3.那麼,同步復位和非同步復位到底孰優孰劣?

實際上,同步復位和非同步復位各有千秋。

對於同步復位:

優點:只在時鐘上公升沿(或下降沿)判斷系統復位是否出現,降低了亞穩態的概率;

缺點:就是之前說過的,額外增加了資源消耗;

對於非同步復位,它的優缺點剛好和同步復位相反。這裡舉個例子來說明非同步復位帶來的亞穩態問題:

module

test(

input

clk,

input

rst_n,

input

a,

output

regc);

regb;

always@(posedge clk or

negedge

rst_n)

if(!rst_n) begin

b <= 1

'b0;

c <= 1

'b0;

endelse

begin

b <=a;

c <=b;

endendmodule

綜合結果如下:

正常情況下,clk的上公升沿c更新為b,b更新為a。一旦進入復位,b,c都清零;但是我們不能確定復位訊號rst_n會在什麼時候結束。如果結束於b_reg0和c_reg0的時間只外,那麼一切都會正常。但如果恰恰相反,會出現什麼情況呢?rst_n的上公升變化出現在了clk上公升的建立保持時間上,此時clk檢測到的rst_n的狀態就會是乙個亞穩態(是0是1不確定)。從**裡我們看到如果此時b_reg0和c_reg0認為rst_n為0,那麼依然保持復位清零,而如果認為rst_n為1,那麼就跳出復位。因為此時的rst_n的不確定性,就可能出現4種情況,即b_reg0和c_reg0都復位或者都跳出復位,再或者乙個復位乙個跳出復位。那麼後者就會造成了系統工作不同步的問題,在這個簡單的兩級非同步復位例項中這種危害表現的並不明顯,但是我們試想乙個大的工程專案裡眾多的暫存器出現如此情況又會是如何一番景象呢?

4.如何兼顧它們倆的優點,同時避免它們的缺點?

答案是:非同步復位,同步釋放!

module

test(

input

clk,

input

rst_n,

input

a,  

output

regc);

regb,rst_nr;

always@(posedge

clk)

rst_nr

<=rst_n;

always@(posedge clk or

negedge

rst_nr)

if(!rst_nr) begin

b <= 1

'b0;

c <= 1

'b0;

endelse

begin

b <=a;

c <=b;

endendmodule

綜合結果如下:

如此一來,既解決了同步復位的資源消耗問題,也解決了非同步復位的亞穩態問題。其根本思想,也是將非同步訊號同步化。

5.最終的改進型終極非同步復位、同步釋放電路

**如下:

module

test (

input

clk,

input

rst_n,

output

regrst_out

); reg

r1;

always@(posedge clk or

negedge rst_n)

if(!rst_n) begin

r1 <= 1

'b0;

rst_out <= 1

'b0;

endelse

begin

r1 <= 1

'b1; //這裡寫成1,而不寫成rst_n,是因為根據實際綜合效果來看,這樣做更節省資源,具體原因參考同步復位

rst_out <=r1;

end

//可選

//wire rst_o;

//assign rst_o = rst_out;

endmodule
綜合結果如下:(這個例子只是單純的復位電路,沒有功能電路

加上此復位電路以後,假設第一級d觸發器clk上公升沿時rst_n正好撤除,則d觸發器1輸出高電平「1」,此時第二級觸發器也會更新輸出,但是輸出值為前一級觸發器次clk來之前時的q1輸出狀態。顯然q1之前為低電平,顧第二級觸發器輸出rst_out保持復位低電平,直到下乙個clk來之後,才隨著變為高電平。即同步釋放。

只做一級觸發器來同步,效果如何?

第一級觸發器的輸出,永遠存在亞穩態的可能。亞穩態導致系統不會復位初始化到已知狀態。 

當第一級觸發器取樣非同步輸入之後,允許輸出出現的亞穩態可以長達乙個週期,在這個週期內,亞穩態特性減弱。在第二個時鐘沿到來時,第二級同步器取樣,之後才把該訊號傳遞到內部邏輯中去。第二級輸出是穩定且已被同步了的。如果在第二級取樣時保持時間不夠,第一級的輸出仍然處於很強的亞穩態,將會導致第二級同步器也進入亞穩態,但這種故障出現的概率比較小。

一般情況下,兩級同步器總體的故障概率是一級同步器故障概率的平方。在大部分的同步化設計中,兩級同步器足以消除所有可能的亞穩態了。

兩級觸發器做同步,是非匯流排訊號的最常見非同步處理方法。匯流排訊號的非同步處理方法,最常見的是非同步fifo實現。

6.那麼,到底什麼情況下需要做「非同步復位、同步釋放」處理?

答案:一般來說,同步系統,都使用非同步復位。這是因為同步復位的電路實現,比非同步復位的電路實現,要浪費更多電路資源。 

未在本模組時鐘域做過「非同步復位,同步釋放」處理的復位訊號,提供給本模組做非同步復位使用時,都需要做「非同步復位,同步釋放」處理。常見於系統內兩部件不在同一時鐘域的情況下。

工程實踐中,確實見過由於未做非同步復位的同步處理,而出現大概率系統宕機現象(復位的作用域是很大的)。

通常對非同步復位電路的時序分析稱為 恢復時間檢查和移除時間檢查

FPGA設計中的非同步復位 同步釋放思想

fpga設計中的非同步復位 同步釋放思想 1.乙個簡單的非同步復位例子 我們可以看到,fpga的暫存器都有乙個非同步清零端 clr 在非同步復位設計中,低電平有效的rst n復位訊號就可以直接連在這個埠上。如果是高有效的復位,綜合時會把它取反後接在這個埠上 2.乙個同步復位的例子 我們可以看到,該電...

fpga的非同步復位同步釋放操作

大多數的復位操作通常是直接將rst n訊號拉低或置高,直接進行復位。但是這樣會產生乙個很大的問題,如果復位操作位於資料取樣沿的setup或holdon時間內,會發生什麼?整個電路會出現亞穩態,可能導致復位失敗。此時,如果採用非同步復位,同步釋放的操作,就能避免亞穩態的出現。先上 module rst...

IC設計中同步復位和非同步復位

非同步復位 非同步復位,同步釋放 本文部分摘自 verilog程式設計藝術 同步復位和非同步復位是積體電路設計中兩種不同的訊號復位方式。長期以來,關於這兩者之間的優劣眾說紛紜,而兩者又都在各種電路中被大規模使用,無法明確的判斷出孰好孰壞。本文對同步復位和非同步復位的優缺點進行了分析,並對比了兩種復位...