摘 要: 異步FIFO是一種先進(jìn)先出電路,可以有效解決異步時鐘之間的數(shù)據(jù)傳遞,。通過分析異步FIFO設(shè)計(jì)中的難點(diǎn),,以降低電路中亞穩(wěn)態(tài)出現(xiàn)的概率為主要目的,提出了一種格雷碼計(jì)數(shù)器的技術(shù),,通過仿真驗(yàn)證,,有效地實(shí)現(xiàn)了異步FIFO控制器的設(shè)計(jì)。該設(shè)計(jì)將大大提高工作頻率和資源利用率,。
關(guān)鍵詞: 異步FIFO,;亞穩(wěn)態(tài);格雷碼計(jì)數(shù)器
隨著現(xiàn)代芯片設(shè)計(jì)規(guī)模的不斷擴(kuò)大,,集成電路越來越復(fù)雜,,一個系統(tǒng)中往往包含多個時鐘,如何設(shè)計(jì)異步時鐘之間的接口電路是多時鐘領(lǐng)域的關(guān)鍵問題,。異步FIFO(First In First Out)是一種先進(jìn)先出電路,,用來存儲,、緩沖在兩個異步時鐘之間的數(shù)據(jù)傳輸,使用異步FIFO可以在兩個不同的時鐘系統(tǒng)之間快速準(zhǔn)確地傳輸實(shí)時數(shù)據(jù),是用來解決異步時鐘接口電路的一個有效方案,。并且異步FIFO高速,、可靠性好,在網(wǎng)絡(luò)接口,、圖像處理等方面都得到了廣泛的應(yīng)用,。
1異步FIFO控制器的設(shè)計(jì)
1.1 異步FIFO時鐘域結(jié)構(gòu)設(shè)計(jì)
FIFO主要由FIFO控制器和RAM兩個部分組成。FIFO控制器最重要的功能就是產(chǎn)生RAM的讀寫地址以及相應(yīng)的使能信號,;產(chǎn)生FIFO的狀態(tài)標(biāo)志,,包括空(Empty)、滿(Full),、溢出(Underflow,,Overflow)以及其他根據(jù)設(shè)計(jì)需要產(chǎn)生的狀態(tài)標(biāo)志。異步FIFO由兩個時鐘域構(gòu)成:push clock domain(記為clk_push domain)和pop clock domain(記為clk_pop domain),。
所以異步FIFO可以劃分為下列時鐘域結(jié)構(gòu),,如圖1所示。
1.2 簡單計(jì)數(shù)器實(shí)現(xiàn)讀寫地址輸出結(jié)構(gòu)設(shè)計(jì)
由時鐘域結(jié)構(gòu)可知,,作為FIFO控制器,,最基本的就是要根據(jù)外部的輸入信號push和pop,產(chǎn)生對RAM訪問的讀寫地址,。FIFO控制器內(nèi)首先要實(shí)現(xiàn)對RAM的讀寫地址輸出,,所以FIFO控制器內(nèi)有一組基于clk_push domain的邏輯產(chǎn)生寫地址:push_addr,和一組基于clk_pop domain的邏輯產(chǎn)生讀地址:pop_addr,。然后對地址信息采用二進(jìn)制編碼,,每一次push操作,使push_addr增加1,,即指向下一個push操作的RAM空間,;每一次pop操作,使pop_addr增加1,,即指向下一個pop操作的RAM空間,。按照這種思路,異步FIFO控制器可進(jìn)一步細(xì)化為如圖2所示結(jié)構(gòu),。
1.3 異步FIFO控制器設(shè)計(jì)中的關(guān)鍵問題
所謂異步是指讀,、寫時鐘是完全獨(dú)立并且不一致的,或者不同頻率,,或者同頻但不同相,。讀地址和空標(biāo)志是由讀時鐘產(chǎn)生的,而寫地址和滿標(biāo)志則由寫時鐘產(chǎn)生,,當(dāng)要產(chǎn)生FIFO的空,、滿標(biāo)志時,,必須進(jìn)行讀寫地址的比較,地址線一般有多位,,如果直接采樣地址比較,,就會存在問題。寫地址的每一位在寫時鐘作用下,,跳變會不一致,,即產(chǎn)生毛刺,要過一段時間才能穩(wěn)定,。在未穩(wěn)定期內(nèi),,剛好讀時鐘進(jìn)行采樣寫地址,這時就會出現(xiàn)誤判斷和邏輯錯誤從而導(dǎo)致了亞穩(wěn)態(tài)的出現(xiàn),。一個好的FIFO設(shè)計(jì)的基本要求是:寫滿而不溢出,,讀空又不多讀,。
因而,,異步FIFO設(shè)計(jì)主要存在兩個關(guān)鍵問題:
(1)如何產(chǎn)生空,、滿等相應(yīng)的控制信號,;
(2)為了盡量降低電路中亞穩(wěn)態(tài)出現(xiàn)的概率,,如何同步從一個時鐘域傳送來的多位數(shù)據(jù)信號,。
1.3.1 異步FIFO控制器空滿標(biāo)志產(chǎn)生
地址輸出設(shè)計(jì)好后,接下來解決第一個關(guān)鍵問題,即異步FIFO的空滿狀態(tài)標(biāo)志,。
當(dāng)pop_addr追趕push_addr,,并且趕上,即pop_addr = push_addr時,,F(xiàn)IFO為空,,即置empty;當(dāng)push_addr追趕pop_addr,,并且趕上,,即push_addr = pop_addr時,F(xiàn)IFO為滿,,即置full,。
可以發(fā)現(xiàn),不論是empty還是full,pop_addr均與push_addr相等,因而暫時無法區(qū)分到底是empty還是full,。所以需要增加額外的邏輯加以區(qū)分,。
由于異步信號在使用前需要使用兩級觸發(fā)器同步才能在另一個時鐘域被使用,因而在clk_pop domain,,需要兩級觸發(fā)器來同步push_cnt,;在clk_push domain,,也需要兩級觸發(fā)器來同步pop_cnt。
在這里可以增加almost_full和almost_empty標(biāo)志判斷empty和full:在計(jì)數(shù)器的復(fù)位值都必須為0,,并且為二進(jìn)制編碼遞增的前提下,,當(dāng)FIFO內(nèi)數(shù)據(jù)少于某一預(yù)設(shè)值(低水線,low_waterlevel)時,,置位almost_empty,;當(dāng)FIFO內(nèi)數(shù)據(jù)多于某一預(yù)設(shè)值(高水線,high_waterlevel)時,,置位almost_full,。這時就很清楚,當(dāng)almost_empty有效,并且pop_addr = push_addr時,,F(xiàn)IFO為empty,;當(dāng)almost_full有效,并且pop_addr = push_addr時,,F(xiàn)IFO為full,。
此時,異步FIFO控制器可進(jìn)一步細(xì)化為如圖3所示結(jié)構(gòu),。
1.3.2 亞穩(wěn)態(tài)問題的存在及解決
在數(shù)字電路中,,觸發(fā)器需要滿足setup/hold的時間要求。當(dāng)一個信號被寄存器鎖存時,,如果信號與時鐘之間不能滿足這個要求,,Q端的值是不確定的,并且在一個未知的時刻會固定到高電平或低電平,,這個過程稱為亞穩(wěn)態(tài),。
亞穩(wěn)態(tài)必然會發(fā)生在異步FIFO中, 因?yàn)樵诋惒紽IFO中,,電路的外部輸入和內(nèi)部時鐘沒有任何時間關(guān)系,,因此存在setup/hold沖突是必然的,同時,,在電路內(nèi)部的兩個沒有關(guān)系的時鐘域之間的信號傳遞也會出現(xiàn)setup/hold沖突,。
雖然亞穩(wěn)態(tài)是不可避免的,但是通過對寫地址/讀地址用格雷碼可以將其降低到一個能夠接受的范圍之內(nèi)[1],。同步多個異步輸入信號出現(xiàn)亞穩(wěn)態(tài)的概率遠(yuǎn)遠(yuǎn)大于同步一個異步信號的概率,,所以對多個觸發(fā)器的輸出所組成的寫地址/讀地址需要采用格雷碼。由于格雷碼每次只有一個數(shù)據(jù)位變化,,因而采用格雷碼可以有效地減少亞穩(wěn)態(tài)的產(chǎn)生,。
按照這種思路,異步FIFO控制器可以設(shè)計(jì)為計(jì)數(shù)器采用Gray Code編碼,,然后被另一個時鐘域同步,,同時計(jì)數(shù)器必須按照0,、1、2,、3遞增的順序計(jì)數(shù),。于是先將Gray Code轉(zhuǎn)換為二進(jìn)制,然后對二進(jìn)制做加1運(yùn)算,,將計(jì)算結(jié)果再轉(zhuǎn)換回Gray Code,,然后被觸發(fā)器鎖存。所以,異步FIFO控制器的設(shè)計(jì)又可進(jìn)一步細(xì)化為如圖4所示結(jié)構(gòu),。
現(xiàn)在一個異步FIFO控制器已經(jīng)基本設(shè)計(jì)完成,。在圖上還剩overflow、underflow,、we三個信號,。在full時,對FIFO push就會產(chǎn)生overflow,;在empty時,,對FIFO pop就會產(chǎn)生underflow。特別值得注意的是,這時的push或pop都不應(yīng)該使計(jì)數(shù)器繼續(xù)翻轉(zhuǎn),,full后對FIFO的push操作FIFO控制器也不能輸出有效的對RAM的寫使能信號we,。這三個信號以及其他一些狀態(tài)標(biāo)志的具體實(shí)現(xiàn)可以根據(jù)實(shí)際應(yīng)用進(jìn)行設(shè)計(jì)。
2 用Modelsim仿真
在Modelsim SE上利用Verilog HDL對提出的方法進(jìn)行了仿真,,仿真波形如圖5所示。
從仿真時序圖知:
(1)復(fù)位后,,讀信號和寫信號均不使能(均置1),,由于存儲單元沒有數(shù)據(jù),產(chǎn)生讀空標(biāo)志,。
(2)將寫信號使能(置0),,寫入的數(shù)據(jù)與設(shè)計(jì)輸入的數(shù)據(jù)一致;將讀信號使能,,讀出來的數(shù)據(jù)順序和數(shù)值與寫入的數(shù)據(jù)一致,。
(3)將寫信號置1,在一定的時鐘下由預(yù)期設(shè)定的讀地址加1與寫地址相等時,,有讀空標(biāo)志產(chǎn)生,;接著將寫信號使能,將讀信號置1,,在一定的時鐘周期下由預(yù)期設(shè)定的寫地址加1與讀地址相等時,,有寫滿標(biāo)志產(chǎn)生。
(4)將讀寫時鐘使能,,數(shù)據(jù)的讀寫是正確的,,由于寫時鐘比讀時鐘快,,經(jīng)過一定的時鐘周期后,有寫滿標(biāo)志產(chǎn)生,;接下來,,由于寫滿不能再寫,故讀時鐘在讀使能信號下讀出數(shù)據(jù)時,,寫滿信號變?yōu)?,,接著寫滿信號1和0交替出現(xiàn)。
(5)系統(tǒng)復(fù)位后,,一個8位rd_cnt計(jì)數(shù)器清0,,在讀使能和沒有產(chǎn)生讀空標(biāo)志的條件下,在讀時鐘上升沿的到來,,rd_cnt計(jì)數(shù)器加1,,跟隨著rd_addr讀地址的變化,查看得知產(chǎn)生的讀地址變化符合預(yù)期設(shè)計(jì),;同樣,,系統(tǒng)復(fù)位后,一個8 bit wr_cnt計(jì)數(shù)器清0,,在寫使能和沒有產(chǎn)生寫滿標(biāo)志的條件下,,當(dāng)寫時鐘上升沿的到來時,wr_cnt計(jì)數(shù)器加1,,跟隨著wr_addr寫地址的變化,,查看得知產(chǎn)生的寫地址變化符合預(yù)期設(shè)計(jì)。
根據(jù)上述仿真波形分析,,可以看出所設(shè)計(jì)的FIFO控制器,,能滿足需要完成的功能。
參考文獻(xiàn)
[1] KANOOPOULOS,,HALLENBECK J J. A First-In,,F(xiàn)irstout memory for signal processing applications[J]. IEE Transactions on circuits and system,1986,,CAS-33(05):556-558.
[2] 吳自信,,張嗣忠.異步FIFO結(jié)構(gòu)及FPGA設(shè)計(jì)[J]. 單片機(jī)及嵌入式系統(tǒng)應(yīng)用,2003(8):24-26.
[3] CLIFFORD E. Simulation and synthesis techniques for asynchronous FIF0 design [J]. SNUG San Joes,,2001(05).
[4] 羅昊. 一種異步FIFO的設(shè)計(jì)方法[J]. 電子技術(shù)應(yīng)用,2004,30(8):70-71,74.
[5] 魏芳,,劉志軍,馬克杰. 基于Verilog HDL的異步FIFO設(shè)計(jì)與實(shí)現(xiàn)[J]. 電子技術(shù)應(yīng)用,,2006,32(7):97-99.
[6] 楊青山,,蔡敏. 基于多時鐘域的異步FIFO設(shè)計(jì)[J]. 中國集成電路, 2007(9):36-39.