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