摘 要: 異步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)、滿(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訪問(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ě)地址和滿標(biāo)志則由寫(xiě)時(shí)鐘產(chǎn)生,當(dāng)要產(chǎn)生FIFO的空、滿標(biāo)志時(shí),必須進(jìn)行讀寫(xiě)地址的比較,地址線一般有多位,如果直接采樣地址比較,就會(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ě)滿而不溢出,讀空又不多讀。
因而,異步FIFO設(shè)計(jì)主要存在兩個(gè)關(guān)鍵問(wèn)題:
?。?)如何產(chǎn)生空、滿等相應(yīng)的控制信號(hào);
?。?)為了盡量降低電路中亞穩(wěn)態(tài)出現(xiàn)的概率,如何同步從一個(gè)時(shí)鐘域傳送來(lái)的多位數(shù)據(jù)信號(hào)。
1.3.1 異步FIFO控制器空滿標(biāo)志產(chǎn)生
地址輸出設(shè)計(jì)好后,接下來(lái)解決第一個(gè)關(guān)鍵問(wèn)題,即異步FIFO的空滿狀態(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為滿,即置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è)值(低水線,low_waterlevel)時(shí),置位almost_empty;當(dāng)FIFO內(nèi)數(shù)據(jù)多于某一預(yù)設(shè)值(高水線,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ā)器需要滿足setup/hold的時(shí)間要求。當(dāng)一個(gè)信號(hào)被寄存器鎖存時(shí),如果信號(hào)與時(shí)鐘之間不能滿足這個(gè)要求,Q端的值是不確定的,并且在一個(gè)未知的時(shí)刻會(huì)固定到高電平或低電平,這個(gè)過(guò)程稱為亞穩(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ě)滿標(biāo)志產(chǎn)生。
(4)將讀寫(xiě)時(shí)鐘使能,數(shù)據(jù)的讀寫(xiě)是正確的,由于寫(xiě)時(shí)鐘比讀時(shí)鐘快,經(jīng)過(guò)一定的時(shí)鐘周期后,有寫(xiě)滿標(biāo)志產(chǎn)生;接下來(lái),由于寫(xiě)滿不能再寫(xiě),故讀時(shí)鐘在讀使能信號(hào)下讀出數(shù)據(jù)時(shí),寫(xiě)滿信號(hào)變?yōu)?,接著寫(xiě)滿信號(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ě)滿標(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控制器,能滿足需要完成的功能。
參考文獻(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.