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