在基于FPGA的數(shù)字系統(tǒng)設(shè)計(jì)中,異步時(shí)序是指時(shí)序邏輯電路內(nèi)部寄存器的時(shí)鐘來自兩個(gè)及以上的時(shí)鐘源,如圖1所示,而且時(shí)鐘源之間沒有確定的相位關(guān)系。 相應(yīng)地,把信號從寄存器FF1傳輸?shù)郊拇嫫?FF2,稱為跨時(shí)鐘域傳輸 (Clock Domain Crossing,CDC),其中FF1稱為源寄存器,F(xiàn)F2稱為目的寄存器 。
圖1 異步時(shí)序電路示例
信號在跨時(shí)鐘域傳輸時(shí),由于源寄存器的時(shí)鐘和目的寄存器的時(shí)鐘之間相位沒有確定的相位關(guān)系,所以數(shù)據(jù)從源寄存器FF1發(fā)出后,有可能在任何時(shí)刻到達(dá)目的寄存器,因此無法保證能夠滿足目的寄存器FF2的建立時(shí)間和保持時(shí)間要求。 如果信號不能在目的寄存器的建立時(shí)間和保持時(shí)間定義的窗口內(nèi)保持穩(wěn)定,那么目的寄存器的輸出有可能進(jìn)入 非0非1 (介于VOHmin和VOLmax之間)的不確定狀態(tài),如圖2所示,這個(gè)狀態(tài)稱為亞穩(wěn)態(tài) (metastability)。 相應(yīng)的,把目的寄存器脫離亞穩(wěn)態(tài)進(jìn)入穩(wěn)態(tài)的時(shí)間稱為決斷時(shí)間 (resolution time),用tmet表示。 經(jīng)過決斷時(shí)間后,目的寄存器的輸出最終穩(wěn)定到0還是1是隨機(jī)的,與輸入信號沒有必然的關(guān)系。
圖2 時(shí)序違規(guī)導(dǎo)致亞穩(wěn)態(tài)
處于亞穩(wěn)態(tài)的寄存器在決斷時(shí)間前輸出電壓在高電平與低電平之間振蕩時(shí),可能會導(dǎo)致后續(xù)的數(shù)字部件作出不同的判斷,可能判斷為0、可能判斷為1,也可能進(jìn)入亞穩(wěn)態(tài),從而引發(fā)數(shù)字系統(tǒng)產(chǎn)生錯(cuò)誤。
除了信號的跨時(shí)鐘域傳輸外,異步時(shí)序還有另外兩種情況。
第一種情況是系統(tǒng)復(fù)位時(shí),無論是異步復(fù)位還是同步復(fù)位。
對于異步復(fù)位來說,復(fù)位信號如果不能在觸發(fā)器的恢復(fù)時(shí)間和撤除時(shí)間窗口內(nèi)保持穩(wěn)定,如圖3所示,那么就可能影響觸發(fā)器輸入數(shù)據(jù)的鎖存過程而產(chǎn)生亞穩(wěn)態(tài)。 觸發(fā)器的輸出在Tco后可能會進(jìn)入亞穩(wěn)態(tài),最終可能穩(wěn)定到0,也可能穩(wěn)定到1,從而導(dǎo)致系統(tǒng)發(fā)生錯(cuò)誤。
圖3 異步復(fù)位電路及時(shí)序圖
對于同步復(fù)位來說,當(dāng)輸入信號D為高電平時(shí),如果復(fù)位信號不能在觸發(fā)器的建立時(shí)間和保持時(shí)間定義的窗口內(nèi)保持穩(wěn)定,如圖4所示,同樣可能產(chǎn)生亞穩(wěn)態(tài)。
圖4 同步復(fù)位電路及時(shí)序圖
第二種情況是系統(tǒng)對外部信號的采集。
對于按鍵和外部中斷等輸入信號,由于信號的作用時(shí)間不受系統(tǒng)時(shí)鐘的控制,因此在采集過程中,外部信號可能在任何時(shí)刻發(fā)生變化,所以也無法保證滿足寄存器建立時(shí)間和保持時(shí)間的要求。
綜上分析,亞穩(wěn)態(tài)產(chǎn)生的原因是 :觸發(fā)器的輸入信號變化不滿足寄存器建立時(shí)間和保持時(shí)間的要求,或者復(fù)位信號不滿足觸發(fā)器恢復(fù)時(shí)間和撤除時(shí)間的要求。
亞穩(wěn)態(tài)是觸發(fā)器固有的特性。 在基于FPGA的數(shù)字系統(tǒng)設(shè)計(jì)中,主要應(yīng)用三種方法減小亞穩(wěn)態(tài)傳播的概率 :①引入同步器來減小單bit信號亞穩(wěn)態(tài)傳播的概率,實(shí)現(xiàn)異步信號與目的時(shí)鐘域的同步; ②應(yīng)用異步FIFO實(shí)現(xiàn)多bit數(shù)據(jù)的跨時(shí)域傳輸; ③應(yīng)用異步復(fù)位同步釋放信號改善純異步復(fù)位信號的特性,提高系統(tǒng)復(fù)位的可靠性。
下面分別講述這三種方法。
01單bit信號的跨時(shí)鐘域同步
單bit信號跨時(shí)鐘傳輸產(chǎn)生亞穩(wěn)態(tài)的原因是因?yàn)樾盘柵c目的時(shí)鐘不同步,導(dǎo)致信號不能滿足目的寄存器建立時(shí)間和保持時(shí)間的要求,從而導(dǎo)致寄存器不能輸出正確的邏輯值。
亞穩(wěn)態(tài)傳播的概率與采集延遲時(shí)間之間近似為指數(shù)關(guān)系。 延遲時(shí)間越長,亞穩(wěn)態(tài)傳播的概率越小。 對于單bit信號的采集,減小亞穩(wěn)態(tài)發(fā)生概率最簡單的方法是應(yīng)用由移位寄存器構(gòu)成的 兩級同步器(double-flop synchronizer)來延長信號的采集時(shí)間,如圖5所示。 其中同步器輸入的異步信號為 async_signal ,第一級完成觸發(fā)器的輸出為 reg1 ,第二級觸發(fā)器的輸出為同步信號 sync_out 。
圖5 兩級同步器
同步器在第一個(gè)時(shí)鐘脈沖作用后,第一級觸發(fā)器的輸出reg1可能會產(chǎn)生亞穩(wěn)態(tài),但是reg1有機(jī)會在被第二級觸發(fā)器鎖存之前穩(wěn)定下來,所以在第二個(gè)時(shí)鐘脈沖作用后,輸出的同步信號sync_out能夠保持穩(wěn)定。
需要注意的是,組合邏輯電路的輸出不能直接應(yīng)用同步器進(jìn)行同步。 這是因?yàn)榻M合電路的輸出可能存在競爭-冒險(xiǎn)現(xiàn)象,會增加同步器中第一級觸發(fā)器產(chǎn)生亞穩(wěn)態(tài)的概率,從而影響同步器輸出信號的可靠性。 所以,在跨時(shí)鐘域同步之前,還需要在源時(shí)鐘域先將組合電路的輸出信號鎖存后輸出,如圖5中所示,然后再進(jìn)行同步。
圖5所示的同步器適合于將慢時(shí)鐘域的單bit信號同步到快時(shí)鐘域,要求異步信號async_signal的脈沖寬度至少應(yīng)維持一個(gè)同步器的時(shí)鐘周期,才能保證信號在目的時(shí)鐘域被采集到,輸出同步信號sync_out的寬度取決于信號在目的時(shí)鐘域被采集到的次數(shù)。
同步器的級數(shù)以2~3級為宜。 因?yàn)榧墧?shù)越多,將導(dǎo)致異步信號同步到目的時(shí)鐘域的延遲時(shí)間越長,因此對異步信號的變化反應(yīng)越慢。 對于只關(guān)心信號邊沿跳變的應(yīng)用場合,還可以應(yīng)用同步器提取脈沖的邊沿。 描述信號邊沿檢測電路的Verilog HDL代碼參考如下:
module edge_detector (
input det_clk, // 時(shí)鐘,50MHz
input rst_n, // 復(fù)位信號,低電平有效
input x_signal, // 被測信號
output wire rising_edge, // 上升沿標(biāo)志,高電平有效
output wire fall_edge // 下降沿標(biāo)志,高電平有效
);
// 3級同步寄存器定義
reg [0:2] sync_reg;
// 同步移存過程
always @( posedge det_clk or negedge rst_n )
if ( !rst_n )
sync_reg <= 3'b000;
else
sync_reg[0:2] <= { x_signal, sync_reg[0:1] };
// 邊沿檢測邏輯
assign rising_edge = sync_reg[1] & ~sync_reg[2];
assign fall_edge = ~sync_reg[1] & sync_reg[2];
endmodule
02多bit數(shù)據(jù)的跨時(shí)鐘域傳輸
對于多bit數(shù)據(jù),普遍的方法是應(yīng)用圖6所示的異步FIFO實(shí)現(xiàn)跨時(shí)域傳輸。
圖6 跨時(shí)域異步FIFO結(jié)構(gòu)
應(yīng)用異步FIFO最關(guān)鍵的問題是如何判斷FIFO的狀態(tài),產(chǎn)生空/滿標(biāo)志。 因?yàn)楫惒紽IFO的讀/寫操作在不同的時(shí)鐘域,所以無法像同步FIFO那樣,通過統(tǒng)計(jì)存儲數(shù)據(jù)的個(gè)數(shù)來產(chǎn)生empty和full標(biāo)志。
1)異步FIFO空/滿的檢測方法
FIFO為空有兩種情況:①FIFO復(fù)位時(shí); ②當(dāng)讀指針rp追上了寫指針wp,讀/寫指針相同時(shí)。 FIFO已滿只有一種情況:當(dāng)寫指針wp多走了一圈, 折回來(wrapped around)追上了讀指針rp,讀/寫指針再次相同時(shí)。
綜上所述,F(xiàn)IFO為空和已滿時(shí)讀/寫指針都相同。 為了區(qū)分指針相同時(shí)FIFO為空還是已滿,需要在FIFO的讀/寫指針前再多加一個(gè)標(biāo)志位來區(qū)分寫指針是否比讀指針多寫了一圈。 所以,對于存儲深度為2^n的異步FIFO,讀/寫指針應(yīng)定義為n+1位 (標(biāo)志位+n位地址),即對于深度為8的異步FIFO,需要定義4位地址指針,取值為0000~0111和1000~1111,其中最高位為折回標(biāo)志,低3位為地址值。
添加了標(biāo)志位后,每當(dāng)讀/寫指針遞加并越過FIFO的最后一個(gè)存儲單元后,將讀/寫指針的最高位翻轉(zhuǎn),其余位回零。 因此,判斷異步FIFO空/滿的方法是:當(dāng)讀/寫指針的所有位均相同時(shí),說明FIFO為空; 當(dāng)讀/寫地址的最高位不同而其余均相同時(shí),說明寫指針比讀指針多走了一圈,說明FIFO已滿。
2)讀/寫指針的同步方法
由于異步FIFO的讀/寫在不同的時(shí)鐘域,所以還需要將讀/寫指針同步到另一個(gè)時(shí)鐘域與寫/讀指針進(jìn)行比較才能產(chǎn)生空/滿標(biāo)志。 但是,二進(jìn)制讀/寫指針不能直接同步到另一個(gè)時(shí)鐘域。 這是因?yàn)椋?dāng)n+1位二進(jìn)制讀/寫地址有多位同時(shí)發(fā)生變化(如地址從0111變化到1000)時(shí),如果直接應(yīng)用同步器進(jìn)行同步,則可能會因不同數(shù)位亞穩(wěn)態(tài)決斷時(shí)間的差異而導(dǎo)致同步后的指針值產(chǎn)生中間值而造成同步后的地址發(fā)生錯(cuò)誤。
為了解決這一問題, 一般的處理方法是,先將二進(jìn)制讀/寫指針值轉(zhuǎn)換為格雷碼后再進(jìn)行同步。 因?yàn)楦窭状a的相鄰碼之間只有一位發(fā)生變化,其余位不變,如表1所示,而不像二進(jìn)制地址那樣,存在多位同時(shí)發(fā)生變化的情況。 由于FIFO的讀/寫通過地址加1實(shí)現(xiàn)的,因而應(yīng)用格雷碼能夠有效地避免同步后的指針產(chǎn)生中間值而造成地址錯(cuò)誤。
表1 4位格雷碼與二進(jìn)制碼比較表
將讀/寫地址轉(zhuǎn)換為格雷碼后,能不能直接應(yīng)用同步后的格雷碼產(chǎn)生空/滿標(biāo)志呢? 下面再進(jìn)行分析。
深度為2^n的異步FIFO共有n+1位讀/寫指針。 設(shè)格雷碼寫指針用 wptr[n:0] 表示,讀指針用 rptr[n:0]表示,F(xiàn)IFO為空用rempty表示,為滿用wfull表示。
判斷FIFO是否為空比較簡單: 當(dāng)讀/寫指針值完全相同時(shí),無論用二進(jìn)制指針還是用格雷碼指針 。 因此,空標(biāo)志產(chǎn)生的Verilog代碼為
empty = ( rptr == wptr );
FIFO為滿時(shí)二進(jìn)制讀/寫指針的最高位不同而其余位相同。 從表1中的二進(jìn)制碼和格雷碼的對應(yīng)關(guān)系可以看出,F(xiàn)IFO為滿時(shí)格雷碼指針的最高位和次高位不同,其余位相同。 因此,基于格雷碼判斷FIFO已滿的Verilog代碼為
wfull = ( wptr[n:n-1] == ~rptr[n:n-1])&&( wptr[n-2:0] == rptr[n-2:0]);
3)跨時(shí)鐘域異步FIFO的工作原理
對于圖6所示的跨時(shí)鐘域異步FIFO,在 寫時(shí)鐘域(wclk)收到寫指令 (write instruction,簡寫為winc)時(shí),需要根據(jù)wfull標(biāo)志判斷FIFO是否已滿,因?yàn)镕IFO已滿時(shí)不能再寫。 在FIFO不滿的情況下,使寫允許信號wclken有效,將數(shù)據(jù)wdata寫入FIFO后寫地址(waddr)加1,同時(shí)將格雷碼寫指針(wptr)同步到讀時(shí)鐘域與格雷碼讀指針(rptr)進(jìn)行比較,產(chǎn)生rempty標(biāo)志 。 在讀時(shí)鐘域(rclk)收到讀指令(read instruction,簡寫為rinc)時(shí),需要根據(jù)rempty標(biāo)志判斷FIFO是否為空,因?yàn)镕IFO為空時(shí)不能再讀。 在FIFO非空的情況下,讀出數(shù)據(jù)rdata后讀地址 (raddr)加1,同時(shí)將格雷碼讀指針(rptr)同步到寫時(shí)鐘域與格雷碼寫指針(wptr)進(jìn)行比較,產(chǎn)生wfull標(biāo)志 。
需要注意的是,由于異步FIFO通過比較讀/寫指針產(chǎn)生空/滿標(biāo)志,而讀/寫指針屬于不同的時(shí)鐘域,所以在比較時(shí)需要將讀/寫指針經(jīng)過兩級同步器同步到另一個(gè)時(shí)鐘域,因此產(chǎn)生的滿/空標(biāo)志會延遲兩個(gè)時(shí)鐘周期。 如果在同步時(shí)間內(nèi)有新的數(shù)據(jù)寫入,則同步后的寫指針一定小于當(dāng)前實(shí)際的寫地址,所以判斷FIFO為空時(shí)實(shí)際上不一定為空,因此不會出現(xiàn)讀空的情況。 同樣的道理,如果在同步時(shí)間內(nèi)有數(shù)據(jù)讀出,則同步后的讀指針一定小于當(dāng)前的讀指針,所以判斷FIFO已滿時(shí)不一定真滿,因此不會出現(xiàn)寫滿的情況。 因此,異步FIFO空/滿標(biāo)志的延遲會導(dǎo)致空/滿的判斷更趨于保守,雖然會影響FIFO性能,但是不會出錯(cuò)。
03應(yīng)用同步釋放電路改善異步復(fù)位信號的特性
異步復(fù)位信號不受時(shí)鐘的控制,具有直接快速的優(yōu)點(diǎn)。 但是,當(dāng)異步復(fù)位信號的釋放時(shí)間不滿足觸發(fā)器的恢復(fù)時(shí)間和撤除時(shí)間要求時(shí),有可能產(chǎn)生亞穩(wěn)態(tài)。 改進(jìn)方法是應(yīng)用異步復(fù)位信號對系統(tǒng)內(nèi)部所有的寄存器復(fù)位后,釋放時(shí)再經(jīng)過時(shí)鐘脈沖進(jìn)行同步。 這樣做的好處是既能夠應(yīng)用異步復(fù)位信號對系統(tǒng)進(jìn)行快速復(fù)位,又避免了異步復(fù)位信號直接釋放時(shí)帶來的亞穩(wěn)態(tài)風(fēng)險(xiǎn)。
異步復(fù)位信號的同步釋放電路原理如圖7所示。 當(dāng)異步復(fù)位信號async_rst_n有效時(shí),能夠直接將兩個(gè)觸發(fā)器復(fù)位,因此第二個(gè)觸發(fā)器的輸出rstn_sync_out=0 ,當(dāng)復(fù)位信號async_rst_n釋放后,兩個(gè)觸發(fā)器的復(fù)位信號轉(zhuǎn)為無效,第一個(gè)觸發(fā)器輸入的高電平經(jīng)過兩個(gè)時(shí)鐘脈沖后才能使rstn_sync_out=1,因此第二個(gè)觸發(fā)器的輸出rstn_sync_ out具有異步復(fù)位同步釋放特性。 因此,應(yīng)用rstn_sync_out作為系統(tǒng)的全局復(fù)位信號時(shí),既能夠?qū)ο到y(tǒng)中的所有寄存器直接復(fù)位,又能夠避免了復(fù)位信號直接釋放時(shí)帶來的亞穩(wěn)態(tài)風(fēng)險(xiǎn)。
圖7 異步復(fù)位信號同步釋放原理電路
-
FPGA
+關(guān)注
關(guān)注
1643文章
21967瀏覽量
614222 -
寄存器
+關(guān)注
關(guān)注
31文章
5421瀏覽量
123384 -
觸發(fā)器
+關(guān)注
關(guān)注
14文章
2032瀏覽量
61886 -
亞穩(wěn)態(tài)
+關(guān)注
關(guān)注
0文章
47瀏覽量
13477 -
異步時(shí)序
+關(guān)注
關(guān)注
0文章
6瀏覽量
8683
發(fā)布評論請先 登錄
利用IDDR簡化亞穩(wěn)態(tài)方案
FPGA中亞穩(wěn)態(tài)——讓你無處可逃
簡談FPGA學(xué)習(xí)中亞穩(wěn)態(tài)現(xiàn)象
在FPGA復(fù)位電路中產(chǎn)生亞穩(wěn)態(tài)的原因
探尋FPGA中三種跨時(shí)鐘域處理方法
FPGA--中復(fù)位電路產(chǎn)生亞穩(wěn)態(tài)的原因
今日說“法”:讓FPGA設(shè)計(jì)中的亞穩(wěn)態(tài)“無處可逃”
FPGA系統(tǒng)中三種方式減少亞穩(wěn)態(tài)的產(chǎn)生

簡述FPGA中亞穩(wěn)態(tài)的產(chǎn)生機(jī)理及其消除方法

亞穩(wěn)態(tài)產(chǎn)生原因、危害及消除方法
什么是亞穩(wěn)態(tài)?如何克服亞穩(wěn)態(tài)?
FPGA系統(tǒng)中三種方式減少亞穩(wěn)態(tài)的產(chǎn)生
pwm產(chǎn)生的三種方法
FPGA設(shè)計(jì)中的亞穩(wěn)態(tài)解析

評論