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