《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 可編程邏輯 > 設(shè)計應(yīng)用 > 異步FIFO控制器的設(shè)計
異步FIFO控制器的設(shè)計
來源:微型機與應(yīng)用2012年第4期
鄔春學(xué),華 樂
(上海理工大學(xué) 光電信息與計算機工程學(xué)院,上海200093)
摘要: 異步FIFO是一種先進先出電路,可以有效解決異步時鐘之間的數(shù)據(jù)傳遞。通過分析異步FIFO設(shè)計中的難點,以降低電路中亞穩(wěn)態(tài)出現(xiàn)的概率為主要目的,提出了一種格雷碼計數(shù)器的技術(shù),通過仿真驗證,有效地實現(xiàn)了異步FIFO控制器的設(shè)計。該設(shè)計將大大提高工作頻率和資源利用率。
Abstract:
Key words :

摘   要: 異步FIFO是一種先進先出電路,可以有效解決異步時鐘之間的數(shù)據(jù)傳遞。通過分析異步FIFO設(shè)計中的難點,以降低電路中亞穩(wěn)態(tài)出現(xiàn)的概率為主要目的,提出了一種格雷碼計數(shù)器的技術(shù),通過仿真驗證,有效地實現(xiàn)了異步FIFO控制器的設(shè)計。該設(shè)計將大大提高工作頻率和資源利用率。
關(guān)鍵詞: 異步FIFO;亞穩(wěn)態(tài);格雷碼計數(shù)器

    隨著現(xiàn)代芯片設(shè)計規(guī)模的不斷擴大,集成電路越來越復(fù)雜,一個系統(tǒng)中往往包含多個時鐘,如何設(shè)計異步時鐘之間的接口電路是多時鐘領(lǐng)域的關(guān)鍵問題。異步FIFO(First In First Out)是一種先進先出電路,用來存儲、緩沖在兩個異步時鐘之間的數(shù)據(jù)傳輸,使用異步FIFO可以在兩個不同的時鐘系統(tǒng)之間快速準(zhǔn)確地傳輸實時數(shù)據(jù),是用來解決異步時鐘接口電路的一個有效方案。并且異步FIFO高速、可靠性好,在網(wǎng)絡(luò)接口、圖像處理等方面都得到了廣泛的應(yīng)用。
1異步FIFO控制器的設(shè)計
1.1 異步FIFO時鐘域結(jié)構(gòu)設(shè)計

  FIFO主要由FIFO控制器和RAM兩個部分組成。FIFO控制器最重要的功能就是產(chǎn)生RAM的讀寫地址以及相應(yīng)的使能信號;產(chǎn)生FIFO的狀態(tài)標(biāo)志,包括空(Empty)、滿(Full)、溢出(Underflow,Overflow)以及其他根據(jù)設(shè)計需要產(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 簡單計數(shù)器實現(xiàn)讀寫地址輸出結(jié)構(gòu)設(shè)計
 由時鐘域結(jié)構(gòu)可知,作為FIFO控制器,最基本的就是要根據(jù)外部的輸入信號push和pop,產(chǎn)生對RAM訪問的讀寫地址。FIFO控制器內(nèi)首先要實現(xiàn)對RAM的讀寫地址輸出,所以FIFO控制器內(nèi)有一組基于clk_push domain的邏輯產(chǎn)生寫地址:push_addr,和一組基于clk_pop domain的邏輯產(chǎn)生讀地址:pop_addr。然后對地址信息采用二進制編碼,每一次push操作,使push_addr增加1,即指向下一個push操作的RAM空間;每一次pop操作,使pop_addr增加1,即指向下一個pop操作的RAM空間。按照這種思路,異步FIFO控制器可進一步細(xì)化為如圖2所示結(jié)構(gòu)。

 

 

1.3 異步FIFO控制器設(shè)計中的關(guān)鍵問題
    所謂異步是指讀、寫時鐘是完全獨立并且不一致的,或者不同頻率,或者同頻但不同相。讀地址和空標(biāo)志是由讀時鐘產(chǎn)生的,而寫地址和滿標(biāo)志則由寫時鐘產(chǎn)生,當(dāng)要產(chǎn)生FIFO的空、滿標(biāo)志時,必須進行讀寫地址的比較,地址線一般有多位,如果直接采樣地址比較,就會存在問題。寫地址的每一位在寫時鐘作用下,跳變會不一致,即產(chǎn)生毛刺,要過一段時間才能穩(wěn)定。在未穩(wěn)定期內(nèi),剛好讀時鐘進行采樣寫地址,這時就會出現(xiàn)誤判斷和邏輯錯誤從而導(dǎo)致了亞穩(wěn)態(tài)的出現(xiàn)。一個好的FIFO設(shè)計的基本要求是:寫滿而不溢出,讀空又不多讀。
    因而,異步FIFO設(shè)計主要存在兩個關(guān)鍵問題:
 (1)如何產(chǎn)生空、滿等相應(yīng)的控制信號;
?。?)為了盡量降低電路中亞穩(wěn)態(tài)出現(xiàn)的概率,如何同步從一個時鐘域傳送來的多位數(shù)據(jù)信號。
1.3.1 異步FIFO控制器空滿標(biāo)志產(chǎn)生
 地址輸出設(shè)計好后,接下來解決第一個關(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:在計數(shù)器的復(fù)位值都必須為0,并且為二進制編碼遞增的前提下,當(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控制器可進一步細(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中, 因為在異步FIFO中,電路的外部輸入和內(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)的概率遠遠大于同步一個異步信號的概率,所以對多個觸發(fā)器的輸出所組成的寫地址/讀地址需要采用格雷碼。由于格雷碼每次只有一個數(shù)據(jù)位變化,因而采用格雷碼可以有效地減少亞穩(wěn)態(tài)的產(chǎn)生。
     按照這種思路,異步FIFO控制器可以設(shè)計為計數(shù)器采用Gray Code編碼,然后被另一個時鐘域同步,同時計數(shù)器必須按照0、1、2、3遞增的順序計數(shù)。于是先將Gray Code轉(zhuǎn)換為二進制,然后對二進制做加1運算,將計算結(jié)果再轉(zhuǎn)換回Gray Code,然后被觸發(fā)器鎖存。所以,異步FIFO控制器的設(shè)計又可進一步細(xì)化為如圖4所示結(jié)構(gòu)。

    現(xiàn)在一個異步FIFO控制器已經(jīng)基本設(shè)計完成。在圖上還剩overflow、underflow、we三個信號。在full時,對FIFO push就會產(chǎn)生overflow;在empty時,對FIFO pop就會產(chǎn)生underflow。特別值得注意的是,這時的push或pop都不應(yīng)該使計數(shù)器繼續(xù)翻轉(zhuǎn),full后對FIFO的push操作FIFO控制器也不能輸出有效的對RAM的寫使能信號we。這三個信號以及其他一些狀態(tài)標(biāo)志的具體實現(xiàn)可以根據(jù)實際應(yīng)用進行設(shè)計。
2 用Modelsim仿真
    在Modelsim SE上利用Verilog HDL對提出的方法進行了仿真,仿真波形如圖5所示。

    從仿真時序圖知:
    (1)復(fù)位后,讀信號和寫信號均不使能(均置1),由于存儲單元沒有數(shù)據(jù),產(chǎn)生讀空標(biāo)志。
    (2)將寫信號使能(置0),寫入的數(shù)據(jù)與設(shè)計輸入的數(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計數(shù)器清0,在讀使能和沒有產(chǎn)生讀空標(biāo)志的條件下,在讀時鐘上升沿的到來,rd_cnt計數(shù)器加1,跟隨著rd_addr讀地址的變化,查看得知產(chǎn)生的讀地址變化符合預(yù)期設(shè)計;同樣,系統(tǒng)復(fù)位后,一個8 bit wr_cnt計數(shù)器清0,在寫使能和沒有產(chǎn)生寫滿標(biāo)志的條件下,當(dāng)寫時鐘上升沿的到來時,wr_cnt計數(shù)器加1,跟隨著wr_addr寫地址的變化,查看得知產(chǎn)生的寫地址變化符合預(yù)期設(shè)計。
    根據(jù)上述仿真波形分析,可以看出所設(shè)計的FIFO控制器,能滿足需要完成的功能。
參考文獻
[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]. 單片機及嵌入式系統(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]. 電子技術(shù)應(yīng)用,2004,30(8):70-71,74.
[5] 魏芳,劉志軍,馬克杰. 基于Verilog HDL的異步FIFO設(shè)計與實現(xiàn)[J]. 電子技術(shù)應(yīng)用,2006,32(7):97-99.
[6] 楊青山,蔡敏. 基于多時鐘域的異步FIFO設(shè)計[J]. 中國集成電路, 2007(9):36-39.

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