《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 通信與網(wǎng)絡(luò) > 設(shè)計(jì)應(yīng)用 > 基于VHDL的異步FIFO設(shè)計(jì)
基于VHDL的異步FIFO設(shè)計(jì)
現(xiàn)代電子技術(shù)
李 輝,,王 暉 中國(guó)空空導(dǎo)彈研究院
摘要: 摘要:FIFO經(jīng)常應(yīng)用于從一個(gè)時(shí)鐘域傳輸數(shù)據(jù)到另一個(gè)異步時(shí)鐘域,。為解決異步FIFO設(shè)計(jì)過程中空滿標(biāo)志判斷難以及FPGA亞穩(wěn)態(tài)的問題,提出一種新穎的設(shè)計(jì)方案,,即利用格雷碼計(jì)數(shù)器(每次時(shí)鐘到來(lái)僅有1位發(fā)生改變)表示讀/寫
Abstract:
Key words :

摘要:FIFO經(jīng)常應(yīng)用于從一個(gè)時(shí)鐘域傳輸數(shù)據(jù)到另一個(gè)異步時(shí)鐘域,。為解決異步FIFO設(shè)計(jì)過程中空滿標(biāo)志判斷難以及FPGA亞穩(wěn)態(tài)的問題,,提出一種新穎的設(shè)計(jì)方案,即利用格雷碼計(jì)數(shù)器(每次時(shí)鐘到來(lái)僅有1位發(fā)生改變)表示讀/寫指針,,設(shè)計(jì)二級(jí)同步鏈為跨越不同時(shí)鐘域的讀/寫指針,以提供充足的穩(wěn)定時(shí)間,,并通過對(duì)比格雷碼指針產(chǎn)生空滿標(biāo)志位。該設(shè)計(jì)采用VHDL語(yǔ)言進(jìn)行設(shè)計(jì),利用ALTERA公司的FPGA得以實(shí)現(xiàn),。經(jīng)驗(yàn)證進(jìn)一步表明,模塊化的設(shè)計(jì)不僅避免了亞穩(wěn)態(tài)的產(chǎn)生,,增大平均無(wú)故障工作時(shí)間(MBTF),也使工作效率大為提升,。
關(guān)鍵詞:FIFO;異步,;亞穩(wěn)態(tài);格雷碼

    先進(jìn)先出緩存電路讀/寫(FIFO)在大規(guī)模邏輯設(shè)計(jì)中被廣泛應(yīng)用,,幾乎每個(gè)芯片都要涉及,同樣在空空導(dǎo)彈的數(shù)據(jù)傳輸體系中也得以大量應(yīng)用,。FIFO類型可以分為兩種,第一種為同步FIFO,,即讀/寫時(shí)鐘是同步的,這里的同步不僅僅是指讀/寫時(shí)鐘為同一個(gè)時(shí)鐘,,即屬于同一個(gè)時(shí)終域。當(dāng)讀/寫時(shí)鐘頻率為倍數(shù)關(guān)系,,即相位關(guān)系確定時(shí),也歸屬同步FIFO的范疇,。另一種為異步FIFO,,讀/寫時(shí)鐘頻率不成倍數(shù)關(guān)系或相位關(guān)系不確定,,即跨時(shí)鐘域。異步FIFO可以在不同的時(shí)鐘域之間快速方便地傳輸實(shí)時(shí)數(shù)據(jù),,因此在遙測(cè)數(shù)據(jù)傳輸中,異步FIFO實(shí)用性更好,。然而如何正確地產(chǎn)生空滿標(biāo)志以及如果解決亞穩(wěn)態(tài)問題是異步FIFO設(shè)計(jì)的難點(diǎn)。

1 FIFO結(jié)構(gòu)
    首先,典型的FIFO結(jié)構(gòu)框圖如圖1所示,。FIFO的數(shù)據(jù)存儲(chǔ)在具有獨(dú)立寫端口和讀端口的RAM中,。讀指針r0_pointer指向下一個(gè)將要讀取的位置,,寫指針wrpointer指向下一個(gè)將要寫入的位置,每1次寫操作后寫指針加1,,讀操作使讀指針加1,。狀態(tài)產(chǎn)生模塊中,full和empty表示FIFO讀/寫的臨界狀態(tài),。FIFO設(shè)計(jì)的關(guān)鍵是產(chǎn)生讀/寫地址和空滿標(biāo)志??諠M標(biāo)志是基于引起指針相等的操作,。如果是復(fù)位或者讀操作引起
讀/寫指針相等,,F(xiàn)IFO認(rèn)為是空,;如果原因是寫操作,,那么FIFO認(rèn)為是滿,。異步FIFO設(shè)計(jì)的難點(diǎn)是如何同步跨時(shí)鐘域的指針以及空滿標(biāo)志的產(chǎn)生,。

a.jpg



2 亞穩(wěn)態(tài)
    亞穩(wěn)態(tài)是當(dāng)信號(hào)在無(wú)關(guān)的電路中或異步時(shí)鐘域之間傳輸時(shí)導(dǎo)致FPGA系統(tǒng)失效的一種現(xiàn)象。包括FPGA在內(nèi)的所有數(shù)字器件的寄存器都定義了信號(hào)時(shí)序要求,,以保證每一個(gè)寄存器都能夠從輸入端獲取數(shù)據(jù)和在輸出端產(chǎn)生數(shù)據(jù),。為了確??煽康牟僮?,輸入信號(hào)必須在時(shí)鐘沿之前穩(wěn)定一段時(shí)間(寄存器建立時(shí)間tsu),并且在時(shí)鐘沿之后穩(wěn)定一段時(shí)間(寄存器保持時(shí)間th),,然后寄存器輸出經(jīng)過一個(gè)特定的時(shí)鐘到輸出延時(shí)后有效。滿足此要求寄存器才可以正確的在輸入端獲取數(shù)據(jù)在輸出端產(chǎn)生數(shù)據(jù),,否則輸出有可能是亞穩(wěn)態(tài),。在亞穩(wěn)態(tài)時(shí),寄存器的輸出電壓在高低電平之間搖擺,,即輸出將有可能是邏輯0(0 V)或者邏輯1(+5 V),,或者是介于0~5 V中間的某個(gè)值,。亞穩(wěn)態(tài)產(chǎn)生機(jī)制圖如圖2所示,當(dāng)建立時(shí)間或者保持時(shí)間不滿足時(shí)序要求時(shí)便會(huì)產(chǎn)生亞穩(wěn)態(tài),。

b.jpg


    在同步系統(tǒng)中,,輸入信號(hào)必須總是滿足寄存器時(shí)序要求,所以亞穩(wěn)態(tài)不會(huì)發(fā)生,。亞穩(wěn)態(tài)問題通常發(fā)生在當(dāng)一個(gè)信號(hào)在無(wú)關(guān)的線路中或異步時(shí)鐘域中傳輸,。一個(gè)寄存器進(jìn)入亞穩(wěn)態(tài)和從亞穩(wěn)態(tài)進(jìn)入穩(wěn)態(tài)的時(shí)間依賴于制造商的制造工藝和使用環(huán)境。大部分情況下,,寄存器會(huì)很快的進(jìn)入一個(gè)定義的穩(wěn)態(tài)中。在異步FIFO設(shè)計(jì)中就要避免亞穩(wěn)態(tài)的產(chǎn)生,。

3 解決問題的方法
3.1 同步寄存器
    當(dāng)信號(hào)在不相關(guān)或者異步時(shí)鐘域傳輸時(shí),,在新的時(shí)鐘域使用這個(gè)信號(hào)之前必須進(jìn)行同步,比如異步FIFO的讀指針被同步到寫時(shí)鐘域或?qū)懼羔槺煌降阶x時(shí)鐘域,。新時(shí)鐘域里的第一個(gè)寄存器的作用就是一個(gè)同步寄存器,。同步裝置中寄存器到寄存器路徑上的時(shí)序裕量可以為亞穩(wěn)態(tài)信號(hào)提供穩(wěn)定時(shí)間。由兩個(gè)寄存器組成的二級(jí)同步鏈如圖3所示,,它大大的提高了系統(tǒng)的平均無(wú)故障工作時(shí)間(MTBF),,減少了信號(hào)傳輸過程中亞穩(wěn)態(tài)問題的風(fēng)險(xiǎn)。此外,,可以通過三級(jí)同步進(jìn)一步增加MTBF值,,但在實(shí)際中很少需要。

c.jpg


3.2 格雷碼(Gray code)計(jì)數(shù)器
    設(shè)計(jì)異步FIFO的原則是安全可靠地把數(shù)據(jù)從一個(gè)時(shí)鐘域傳輸?shù)搅硪粋€(gè)時(shí)鐘域,。如果用一個(gè)相對(duì)于計(jì)數(shù)器時(shí)鐘是異步的時(shí)鐘來(lái)取樣計(jì)數(shù)器的值,,就要考慮計(jì)數(shù)器的每一位在哪個(gè)范圍內(nèi)變化,每一位都有機(jī)會(huì)同時(shí)發(fā)生變化,,比如從FFFF變化到0000,,這時(shí)每個(gè)單獨(dú)的位都處于亞穩(wěn)態(tài),。這種變化意味著讀數(shù)有可能是0000~FFFF之間的任意一個(gè)值,。這種情況下FIFO將無(wú)法正常工作,于是設(shè)計(jì)一個(gè)格雷碼來(lái)表示的計(jì)數(shù)器,,
因?yàn)楦窭状a是最小距離碼,,相鄰的碼元只有1位不同,它可以避免因延遲不一致而引起的毛刺現(xiàn)象,。
    d.jpg
    計(jì)數(shù)器由觸發(fā)器組和累加器組成,,處理格雷碼計(jì)數(shù)器的辦法為:將格雷碼轉(zhuǎn)換為二進(jìn)制碼元,然后加1,,再將它轉(zhuǎn)換回格雷碼并存儲(chǔ),,這是解決產(chǎn)生N位格雷碼算法棘手問題的一個(gè)辦法。異步FIFO的寫地址和讀地址由格雷碼計(jì)數(shù)器來(lái)實(shí)現(xiàn)計(jì)數(shù),,讀/寫指針均用格雷碼來(lái)表示,,格雷碼計(jì)數(shù)器指針原理如圖4所示,當(dāng)FIFO非空或者非滿時(shí),,讀指針或者寫指針實(shí)現(xiàn)加1操作。

e.jpg


3.3 一種新穎的設(shè)計(jì)方法產(chǎn)生空滿標(biāo)志
    空滿標(biāo)志位是通過比較讀/寫指針來(lái)判斷的,,空滿標(biāo)志的判斷方法:對(duì)于二進(jìn)制地址來(lái)說(shuō),,如果RAM大小為M,,那么它需要的地址位寬度為N=log2 M,。假設(shè)雙口RAM大小是8 B,所需尋址地址位寬度是3 b,。如果讀/寫指針均用3位來(lái)表示的話,,那么當(dāng)讀/寫指針相等時(shí),無(wú)法判別是讀時(shí)針追上了寫時(shí)針造成讀空還是寫時(shí)針追上了讀時(shí)針造成寫滿,,這樣就無(wú)法正確判斷空,、滿標(biāo)志。為了方便的區(qū)分空,、滿,,讀/寫指針各增加1位,取地址指針寬度為log2M+1,,尋址中沒有使用的最高位地址標(biāo)記為MSB,即讀/寫指針為N+1位,,尋址范圍為2n。表1為格雷碼表示的4位地址指針,。

f.jpg


    仔細(xì)觀察表1并分析數(shù)據(jù),,一種新穎的判斷空滿標(biāo)志的方法為:當(dāng)讀/寫指針的最高位(MSB)不相等且讀/寫指針的次高位不相等,,剩余的N-2位地址相等時(shí),此時(shí)寫指針追上了讀指針,,即寫指針比讀指針多轉(zhuǎn)一圈,,狀態(tài)模塊輸出滿標(biāo)志;當(dāng)讀/寫指針N+1位都相等時(shí),,狀態(tài)模塊輸出空標(biāo)志,。判斷滿標(biāo)志部分的VHDL代碼:
f.jpg
    h.jpg
3.4 異步FIFO總體設(shè)計(jì)
    通過時(shí)針比較產(chǎn)生的異步FIFO框圖如圖5所示。WCLK和RCLK分別為讀時(shí)鐘和寫時(shí)鐘,,wrst_n和rrst_n分別為讀/寫模塊的復(fù)位信號(hào),。  rdata為數(shù)據(jù)輸出端口,wdata為數(shù)據(jù)輸入端口,。異步FIFO通過讀/寫指針來(lái)尋址一個(gè)雙口RAM來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)的讀/寫,,雙口RAM的大小為2nB。讀指針被二級(jí)同步鏈到寫時(shí)鐘域,,然后與寫時(shí)針比較產(chǎn)生滿標(biāo)志,,讀指針產(chǎn)生讀地址raddress;寫時(shí)針被二級(jí)同步鏈同步到讀時(shí)鐘域,,然后與讀時(shí)鐘比較產(chǎn)生空標(biāo)志,,寫指針產(chǎn)生寫地址waddress。需要注意的是此異步FIFO設(shè)計(jì)中,,空滿標(biāo)志是保守的空滿標(biāo)志,,比如滿標(biāo)志,當(dāng)讀時(shí)針通過二級(jí)同步鏈同步到寫時(shí)鐘域且滿足滿標(biāo)志的條件時(shí),,寫指針停止加1操作,,而同步讀指針的過程中,讀時(shí)針則移動(dòng)到了其他的地址,,同樣的適合于空標(biāo)志,,當(dāng)輸出空,滿時(shí),,其實(shí)FIFO的真實(shí)狀態(tài)是還有空間沒被寫滿或者讀空,,這就是保守的空和滿,而這正保證了FIFO不會(huì)向上會(huì)向下溢出,,進(jìn)一步提高了FIFO工作的可靠性,。

i.jpg


    表2為平均無(wú)故障工作時(shí)間的對(duì)比,C1和C2依賴于器件工藝,。

j.jpg



4 結(jié)語(yǔ)
    一個(gè)高的平均無(wú)故障工作時(shí)間表明一個(gè)設(shè)計(jì)是優(yōu)秀的,,提高亞穩(wěn)態(tài)的平均無(wú)故障工作時(shí)間減少信號(hào)傳輸中導(dǎo)致亞穩(wěn)態(tài)問題的風(fēng)險(xiǎn)。本文通過研究FIFO的基本結(jié)構(gòu)以及FPGA亞穩(wěn)態(tài)的產(chǎn)生機(jī)理,,提出了利用二級(jí)同步鏈和格雷碼計(jì)數(shù)器指針解決了同步以及空滿狀態(tài)判斷的難題,,給出了VHDL軟件代碼,,且該設(shè)計(jì)已經(jīng)通過QuartusⅡ的時(shí)序仿真驗(yàn)證,作為獨(dú)立模塊可以應(yīng)用到需要異步時(shí)鐘域傳輸數(shù)據(jù)的電路中,,大大提高異步數(shù)據(jù)傳輸效率及平均無(wú)故障工作時(shí)間,。

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權(quán)禁止轉(zhuǎn)載,。