異步復(fù)位信號亞穩(wěn)態(tài)的原因:
復(fù)位結(jié)束也就是釋放的時刻恰在時鐘上升沿的建立時間和保持時間之間時無法決定現(xiàn)在的復(fù)位狀態(tài)是1還是0,造成亞穩(wěn)態(tài)。
下面是具體解釋:
在帶有復(fù)位端的D觸發(fā)器中,當reset信號“復(fù)位”有效時,它可以直接驅(qū)動最后一級的與非門,令Q端“異步”置位為“1”or“0”。這就是異步復(fù)位。當這個復(fù)位信號release時,Q的輸出由前一級的內(nèi)部輸出決定。
然而,由于復(fù)位信號不僅直接作用于最后一級門,而且也會做為前級電路的一個輸入信號,因此這個前一級的內(nèi)部輸出也受到復(fù)位信號的影響。前一級的內(nèi)部電路實際上是實現(xiàn)了一個“保持”的功能,即在時鐘沿跳變附近鎖住當時的輸入值,使得在時鐘變?yōu)楦唠娖綍r不再受輸入信號的影響。
對于這一個“維持”電路,在時鐘沿變化附近,如果“reset”信號有效,那么,就會鎖存住“reset”的值;如果reset信號釋放,那么這個“維持”電路會去鎖當時的D輸入端的數(shù)據(jù)。因此,如果reset信號的“釋放”發(fā)生在靠時鐘沿很近的時間點,那么這個“維持”電路就可能既沒有足夠時間“維持”住reset值,也沒有足夠時間“維持”住D輸入端的值,因此造成亞穩(wěn)態(tài),并通過最后一級與非門傳到Q端輸出。如果reset信號的“釋放”時間能夠晚一點點,也就是說,讓“維持”電路有足夠的時間去鎖住“reset”的值,那么,我們就可以肯定輸出為穩(wěn)定的“reset”狀態(tài)了。這一小段鎖住“reset”值所需要的時間,就是寄存器的removal time要求。
如圖第一個方框內(nèi)是異步復(fù)位和同步釋放電路。有兩個D觸發(fā)器構(gòu)成。第一級D觸發(fā)器的輸入時VCC,第二級觸發(fā)器輸出是可以異步復(fù)位,同步釋放后的復(fù)位信號。
利用前面兩級觸發(fā)器實現(xiàn)。特點:
第一級觸發(fā)器的數(shù)據(jù)端口是接電源,即高電平1’b1。
第一級觸發(fā)器的輸出,不能使用,因為仍存在亞穩(wěn)態(tài)的危險。兩級觸發(fā)器做同步,是非總線信號的最常見異步處理方法??偩€信號的異步處理方法,最常見的是異步fifo實現(xiàn)。
很多人只知道觸發(fā)器D端口來源是異步的話,會因為建立保持時間的時序違反而在觸發(fā)器Q端口產(chǎn)生亞穩(wěn)態(tài)。
但是不清楚,異步復(fù)位信號為什么會導(dǎo)致亞穩(wěn)態(tài)的產(chǎn)生。
首先,回顧理論教材里介紹的建立保持時間違反分析,教材一般都是拿沒有復(fù)位端口的D觸發(fā)器舉例。
然后,畫出帶有異步復(fù)位端口的D觸發(fā)器,下圖帶異步復(fù)位Rd,并帶有異步置位端口Sd。
由此得知,異步復(fù)位信號或者異步置位信號,跟數(shù)據(jù)端口D信號,沒有什么區(qū)別,都會存在建立保持時間的違反,從而時序沖突,引發(fā)輸出亞穩(wěn)態(tài)。
亞穩(wěn)態(tài),出現(xiàn)的問題或者麻煩,是在信號變化的時候,不能保證第一拍采樣的值是固定的。
如果信號穩(wěn)定,不會出現(xiàn)亞穩(wěn)態(tài)的。就是采樣后的跳變,時刻不確定,也許早,也許晚。
系統(tǒng)不希望這樣的未知狀態(tài)發(fā)生,系統(tǒng)希望知道在某一個時刻,后續(xù)邏輯需要的輸入信號,是穩(wěn)定值。
二級觸發(fā)器同步后,第二季觸發(fā)器的輸出基本上是穩(wěn)定值。后續(xù)邏輯根據(jù)穩(wěn)定值,會有穩(wěn)定的行為。這就是追求的系統(tǒng)穩(wěn)定性。
最好是系統(tǒng)一起復(fù)位釋放,但是時鐘域不同,不可能保證系統(tǒng)一起復(fù)位釋放。一般來說,系統(tǒng)復(fù)位釋放的順序,是需要保證的。否則系統(tǒng)就是不安全的。
舉個例子,系統(tǒng)啟動時,內(nèi)核讀取啟動指令,要powerdown某外設(shè);但是powerdown的邏輯要求外設(shè)和內(nèi)核沒有通信請求正在發(fā)生。此時,外設(shè)比內(nèi)核先釋放復(fù)位的情況(復(fù)位釋放的時刻,外設(shè)有可能已經(jīng)開始與內(nèi)核發(fā)生請求),與內(nèi)核比外設(shè)先釋放復(fù)位的情況(復(fù)位釋放的時刻,外設(shè)肯定與內(nèi)核沒有發(fā)生請求),是不一樣的,powerdown也許不能處理成功。
這也是異步復(fù)位信號需要同步釋放的原因,目的都是為了避免亞穩(wěn)態(tài)的產(chǎn)生。
第一級觸發(fā)器的輸出,永遠存在亞穩(wěn)態(tài)的可能。亞穩(wěn)態(tài),導(dǎo)致系統(tǒng)不會復(fù)位初始化到已知狀態(tài)。
當?shù)谝患売|發(fā)器采樣異步輸入之后,允許輸出出現(xiàn)的亞穩(wěn)態(tài)可以長達一個周期,在這個周期內(nèi),亞穩(wěn)態(tài)特性減弱。在第二個時鐘沿到來時,第二級同步器采樣,之后才把該信號傳遞到內(nèi)部邏輯中去。第二級輸出是穩(wěn)定且已被同步了的。如果在第二級采樣時保持時間不夠,第一級的輸出仍然處于很強的亞穩(wěn)態(tài),將會導(dǎo)致第二級同步器也進入亞穩(wěn)態(tài),但這種故障出現(xiàn)的概率比較小。
一般情況下,兩級同步器總體的故障概率是一級同步器故障概率的平方。在大部分的同步化設(shè)計中,兩級同步器足以消除所有可能的亞穩(wěn)態(tài)了。
基本D觸發(fā)器、同步D觸發(fā)器和異步D觸發(fā)器的Verilog描述
//基本D觸發(fā)器
module D_EF(Q,D,CLK)
input D,CLK;
output Q;
reg Q; //在always語句中被賦值的信號要聲明為reg類型 寄存器定義
always @ (posedge CLK) //上升沿,下降沿用negedge表示,^_^ 需要記憶
begin Q 《= D; end
endmodule
//帶異步清0、異步置1的D觸發(fā)器
module D_EF(q,qn,d,clk,set,reset)
input d,clk,set,reset;
output q,qn;
reg q,qn;//寄存器定義
always @ (posedge clk or negedge set or negedge reset)
begin
if(!reset) begin q《=0;qn《=1;end//異步清0,低有效
else if(!set) begin q《=1;qn《=1;end //異步置1,低有效
else begin q《=~d;qn《=~d;end
end
endmodule
//帶同步清0、同步置1的D觸發(fā)器
module D_EF(q,qn,d,clk,set,reset)
input d,clk,set,reset;
output q,qn;
reg q,qn;
always @ (posedge clk)
begin
if(reset) begin q《=0;qn《=1;end//同步清0,高有效
else if(set) begin q《=1;qn《=1;end //同步置1,高有效
else begin q《=~d;qn《=~d;end
end
endmodule
評論
查看更多