摘 要: 提出了一種節(jié)能并可升級的異步FIFO的FPGA實現(xiàn)。此系統(tǒng)結(jié)構(gòu)利用FPGA內(nèi)自身的資源控制時鐘的暫停與恢復,實現(xiàn)了高能效、高工作頻率的數(shù)據(jù)傳輸。該系統(tǒng)在Xilinx的VC4VSX55芯片中實現(xiàn),實際可工作于高達100/153.6 MHz的讀/寫時鐘域。本文所提出的結(jié)構(gòu)不依賴于現(xiàn)有的IP核,基于此結(jié)構(gòu)易建立可升級的IP核。
關(guān)鍵詞: FIFO;FPGA;IP核
?
現(xiàn)代數(shù)字系統(tǒng)中,異步FIFO是一種被廣泛應用于跨時鐘域進行數(shù)據(jù)傳輸?shù)挠行Х绞健.惒紽IFO主要應用于兩種不同時鐘域的數(shù)據(jù)傳輸,這意味著數(shù)據(jù)的寫入在一個時鐘域,而數(shù)據(jù)的讀出卻在另一個時鐘域,兩個時鐘完全異步[1]。現(xiàn)代通信系統(tǒng)中,特別是在移動通信系統(tǒng)中,人們對于節(jié)能型的產(chǎn)品提出了更高的要求。隨著技術(shù)的發(fā)展,F(xiàn)PGA的技術(shù)、性能、穩(wěn)定性等指標已經(jīng)得到很大提高,同時FPGA廠商為不同的應用開發(fā)提供了各種IP核,大大減少了產(chǎn)品的開發(fā)周期,在各大FPGA廠商中,Xilinx的IP核應用比較廣泛。但其IP核卻沒有關(guān)于異步FIFO節(jié)能方面的設計。在文獻[2]中對于FIFO的設計有節(jié)能方面的改進,由于其主要應用于ASIC設計,對于FPGA中的應用并不完全適用。
本文提出了一種更加節(jié)能而且能應用于高速應用的FPGA設計,同時本文提出一種改進的格雷碼二進制碼轉(zhuǎn)換結(jié)構(gòu),在此基礎(chǔ)上利用Xilinx的FPGA芯片現(xiàn)有的數(shù)字時鐘管理模塊實現(xiàn)節(jié)能方面改進。本文所提出的結(jié)構(gòu)不依賴于現(xiàn)有的IP核,而且可以容易地建立自己的IP核。實際應用中,通過FPGA與DSP進行數(shù)據(jù)傳輸可工作于高達100/153.6 MHz讀/寫時鐘域。
1 FIFO的主要結(jié)構(gòu)
1.1 主要的FIFO結(jié)構(gòu)
在所有FIFO結(jié)構(gòu)中,首先要提到的是單時鐘域的同步FIFO,雖然同步FIFO在現(xiàn)在的實際應用中很少被使用,但是其結(jié)構(gòu)將有助于理解兩個時鐘域的異步FIFO的實現(xiàn)。主要有線性結(jié)構(gòu)的FIFO和線性可調(diào)結(jié)構(gòu)的FIFO[2]。其結(jié)構(gòu)圖如圖1。
?
?
線性可調(diào)FIFO只是在線性FIFO的基礎(chǔ)上增加了控制信號以便于容量擴展。從圖1中可以看出,無論線性的FIFO還是線性可調(diào)結(jié)構(gòu)的FIFO,都是由一些移位寄存器所組成,其主要優(yōu)點是結(jié)構(gòu)簡單容易實現(xiàn)。從數(shù)據(jù)的輸入到輸出這一過程看,數(shù)據(jù)都要經(jīng)過每個寄存器,當FIFO容量變大時,這類結(jié)構(gòu)的缺點也很突出,如數(shù)據(jù)從輸入到輸出的延時時間長,而且能耗比較大。
為了克服以上FIFO結(jié)構(gòu)的缺點,人們提出了很多改善的結(jié)構(gòu),其中有并行的FIFO、樹型FIFO、折疊型的FIFO[2]、環(huán)型結(jié)構(gòu)的FIFO[1]。在這些結(jié)構(gòu)中,由于環(huán)型的FIFO結(jié)構(gòu)設計相對容易而被廣泛采用。本文實現(xiàn)的是基于環(huán)型的FIFO結(jié)構(gòu),并在此基礎(chǔ)上進行了節(jié)能型的設計改進,使之應用于現(xiàn)代FPGA中。環(huán)型結(jié)構(gòu)的FIFO是一種雙時鐘域的FIFO結(jié)構(gòu),數(shù)據(jù)在不同的時鐘域中傳輸時需要考慮數(shù)據(jù)傳輸?shù)挠行?,同時必需克服數(shù)據(jù)在不同的時鐘中傳輸時而產(chǎn)生的亞穩(wěn)態(tài)。
1.2 亞穩(wěn)態(tài)
數(shù)據(jù)在傳輸?shù)倪^程中,接收寄存器收到變化的數(shù)據(jù)時,數(shù)據(jù)的改變發(fā)生在時鐘觸發(fā)沿而導致接受數(shù)據(jù)出現(xiàn)不穩(wěn)定的狀態(tài)[3]稱為亞穩(wěn)態(tài),如圖2上部分所示。因此在異步時鐘之間進行數(shù)據(jù)傳輸常常會用到同步單元。單字節(jié)同步單元比較簡單,而其常用的同步單元的結(jié)構(gòu)如圖2下半部分所示。在多位的跨時鐘域數(shù)據(jù)傳輸中,情況比單比特的數(shù)據(jù)傳輸復雜得多,由于存在多位數(shù)據(jù)同時變化的情況,為了提高數(shù)據(jù)傳輸?shù)姆€(wěn)定性,采用將二進制碼轉(zhuǎn)化為格雷碼[2]后傳輸。
2 主體結(jié)構(gòu)與具體實現(xiàn)
本文所采用的結(jié)構(gòu)是基于環(huán)型FIFO結(jié)構(gòu)[1],其整體結(jié)構(gòu)如圖3所示。在圖3中,總線用粗實線表示,其中總線上的數(shù)字(如m)表示總線位寬;控制線用虛線表示,輸入、輸出的信號(如FIFO空/滿信號)用細的實線表示,箭頭表示輸入/出方向。從圖3中可以清楚地看出,整個異步FIFO的結(jié)構(gòu)由讀/寫控制模塊、讀/寫同步模塊、讀/寫時鐘控制模塊以及雙口的RAM七個模塊組成。由于采用模塊化的設計結(jié)構(gòu),以上的結(jié)構(gòu)并不局限于具體的應用,可以很容易設計成實際應用需求的IP核,而且容易升級,相對于傳統(tǒng)的設計,增加的時鐘控制模塊能有效提高能效。
?
2.1 FIFO空/滿信號的產(chǎn)生
在異步FIFO的設計中,空/滿信號的產(chǎn)生是其主要的難點。當寫入數(shù)據(jù)時,寫信號指針追上讀信號指針的情況,意味著FIFO滿的狀態(tài)。同理在讀出數(shù)據(jù)時,讀地址指針追上寫地址指針的情況,意味著FIFO為空狀態(tài)。以上的分析可以得出,不能簡單通過讀地址指針等于寫地址指針來判定FIFO的空/滿狀態(tài)。有效的解決方法在文獻[1]、文獻[2]中都被采用。若FIFO的深度為N,則其讀/寫地址指針的寬度應為log2(N)位,讀/寫地址指針都增加一位,變?yōu)閘og2(N)+1位后,測試讀地址指針與寫地址指針,當兩者相等時,F(xiàn)IFO即為空狀態(tài)。而當FIFO讀地址指針與寫地址指針的最高有效位不同而其他有效位完全相同時,即為FIFO滿狀態(tài),這種循環(huán)的地址指針即是環(huán)型FIFO的由來。在本文的設計中,空/滿信號不僅用于指示FIFO的狀態(tài),還用于讀/寫時鐘的控制,從而達到節(jié)能的目地。
2.2 讀控制模塊
讀數(shù)據(jù)控制模塊主要功能是:根據(jù)數(shù)據(jù)的輸出及讀請求信號產(chǎn)生用于讀數(shù)據(jù)的控制信號、讀地址指針、FIFO空(empty)信號以及用于控制寫時鐘Wr_full信號(其具體功用在2.3中介紹)。當外部有數(shù)據(jù)讀出請求(Rd_req有效)且FIFO不為空時,使能FIFO的讀有效,F(xiàn)IFO輸出數(shù)據(jù),輸出數(shù)據(jù)完成后讀地址指針加1。其中空信號的產(chǎn)生采用2.1中的方法,其內(nèi)部實現(xiàn)的具體框圖如圖4所示。
在圖4中,讀控制邏輯單元主要用于產(chǎn)生讀使能信號,依據(jù)讀請求信號和FIFO的空(empty)信號產(chǎn)生讀使能。當有讀請求并且FIFO不為空時,讀使能有效,同時使地址指針加1。讀地址計數(shù)器即是一個二進制的計數(shù)器,產(chǎn)生輸入雙口RAM的讀地址指針。由于讀地址指針要傳輸?shù)綄懣刂颇K,而兩模塊處于不同的時鐘域,為了使數(shù)據(jù)有效傳輸?shù)綄憰r鐘域,采用先將讀地址指針表示的二進制數(shù)轉(zhuǎn)化為格雷碼(具體實現(xiàn)參見文獻[2])后再傳輸。
2.2.1 同步模塊的實現(xiàn)
由于實際應用于系統(tǒng)中時鐘頻率較高,為了達到穩(wěn)定,選擇了流水線的同步器單元。在圖2的基礎(chǔ)上增加寄存器的位寬。為了使系統(tǒng)的穩(wěn)定性增強,采用三級流水線的結(jié)構(gòu),當然,也可以根據(jù)自己實際的需要而增減流水線級數(shù)。
2.2.2 格雷碼二進制碼轉(zhuǎn)化
為了應用環(huán)型指針區(qū)別FIFO的空/滿信號,需要將傳輸過來用格雷碼表示的寫地址指針轉(zhuǎn)化為二進制碼,格雷碼到二進制碼轉(zhuǎn)化的公式如式(1)。設格雷碼表示的數(shù)據(jù)與二進制碼有n位,格雷碼表示為:gn-1gn-2…g0,相應二進制碼表示為:bn-1bn-2…b0。轉(zhuǎn)化公式為:
式(1)中所示的加代表無進位的加法,實現(xiàn)中使用“異或門”即可。但是,完全按照式(1)來實現(xiàn)存在缺點,從式(1)中可以看出,其為一個遞推式,最先計算出最高有效位bn-1,最后計算出b0,一次轉(zhuǎn)化完成需要經(jīng)過n-1個“異或門”的延時,當位數(shù)據(jù)位增加時,這將成為系統(tǒng)的運行瓶頸。在高速系統(tǒng)中表現(xiàn)的特別突出。提出一種改進的轉(zhuǎn)化單元。將式(1)轉(zhuǎn)化為式(2),如下所示:
可以看出,一次轉(zhuǎn)化只需要一個“異或門”的延時即可完成,但這種結(jié)構(gòu)不適合FPGA中實現(xiàn)。在基本的門電路中,當門電路的扇入數(shù)據(jù)達到或者超過5時,延時將變得很大,而且大的扇入門電路的實現(xiàn)變得不現(xiàn)實且相當耗資源。將“異或門”的扇入數(shù)據(jù)限制在4以內(nèi)(包括4個)。從“異或門”的規(guī)律中可以得出,任何變量與邏輯“0”異或,是其本身,而與“1”異或,是其相反變量。將待轉(zhuǎn)化的數(shù)據(jù)分為四位一組,第一組為(b3…b0),較高的位(如b7…b4)依此細分下去……最高的4位采用如式(2)中進行轉(zhuǎn)化,較低的4位如(bn-4…bn-7)采用如圖5的方式轉(zhuǎn)化……這種方式的轉(zhuǎn)化器相對于式(1)實現(xiàn)來說,在不增加門電路資源消耗的基礎(chǔ)上,能明顯提高轉(zhuǎn)化速度。
?
2.2.3 相等判決單元
相等判決單元是一個二進制數(shù)比較器,當且僅當讀/寫地址指針完全相等時,給出空信號有效,否則空信號無效。
2.2.4 Rd_full信號產(chǎn)生單元
Rd_full信號產(chǎn)生單元的結(jié)構(gòu)與FIFO滿(full)產(chǎn)生單元的結(jié)構(gòu)相同,Rd_full信號是full信號在讀時鐘域中的一個復制信號,用于寫時鐘控制。在時鐘控制單元將詳細介紹其功能。
2.3 寫控制模塊
寫控制模塊的實現(xiàn)與讀模塊相似,由與讀模塊相應的單元組成。只是FIFO滿(full)時的產(chǎn)生邏輯為當讀地址指針與寫地址指針最高有效位不同,而其他位均完全相同時,滿信號有效。另一不同點體現(xiàn)在Wr_empty信號的產(chǎn)生上,Wr_empty只是FIFO為空(empty)信號時在寫時鐘域中的一個復制信號,用于讀時鐘的控制。
2.4 讀時鐘控制模塊
從以上的介紹中可以看出,各個模塊的工作統(tǒng)一由時鐘來管理,在高速的數(shù)字系統(tǒng)中,高速也將帶來高的能耗。筆者從實際工作中觀察發(fā)現(xiàn),F(xiàn)IFO的工作是需要調(diào)配的,只有在DSP需要數(shù)據(jù)時,才需要FIFO處于工作狀態(tài),而在DSP兩次需求之間,大量的時間中FIFO是處于空閑狀態(tài)(這樣的情形也符合大多數(shù)的實際應用)??梢猿浞掷眠@段空閑,讓FIFO既能在正常工作時高速而穩(wěn)定地工作,同時在空閑時能盡可能降低能耗。時鐘控制模塊即能達到此目的。在空閑時,將FIFO的讀/寫時鐘停止,使空閑的模塊處于“休眠”狀態(tài)。但在正常工作時,時鐘能照常管理各個模塊。采用Virtex-4芯片內(nèi)部自帶的時鐘管理模塊(Digital Clock Manager-DCM)[4]來實現(xiàn)。Virtex-4芯片中的DCM提供強大的時鐘管理功能,包括:時鐘去抖動、頻率合成、移相及動態(tài)時鐘配置。
應用中,主要利用其時鐘去抖動和動態(tài)時鐘配置兩項功能。在讀時鐘控制模塊中,當檢測到FIFO為空且Wr_empty同時有效時(如同時為高電平),通過DCM即可暫停讀時鐘。此時FIFO模塊中的所有讀組件將會停止運行。此時若寫入數(shù)據(jù),由于Wr_empty處在寫時鐘域中,寫時鐘的控制下,Wr_empty將不會有效(變?yōu)榈碗娖剑?,此時通過DCM喚醒讀時鐘,可以正常讀出數(shù)據(jù),同理可以控制寫時鐘的暫停與恢復。按照以上的原理設計,用Xilinx ISE 10.1仿真后,得到的仿真波形如圖6。clk_in為輸入時鐘,clk_out為經(jīng)過控制的時鐘,而clk0_out是不經(jīng)過控制的輸出時鐘。從圖中可以看出,當使能信號為有效(低電平)時,clk_out沒有時鐘輸出,而當使能信號無效時,clk_out時鐘正常恢復??梢酝ㄟ^將Wr_empty與empty經(jīng)過“與非”后接到讀時鐘clk_en端即可。
?
2.5 寫時鐘控制模塊
寫時鐘控制模塊與讀時鐘控制模塊原理完全相同,只是輸入控制控制信號為Rd_full與full信號。
2.6 雙口RAM
雙口RAM的實現(xiàn)采用Xilinx的Virtex-4系列FPGA內(nèi)部現(xiàn)有的資源,通過利用Virtex-4系列芯片中豐富的Block RAM資源,利用原語例化即可生成適合于實際應用需求的雙口RAM,參見文獻[4]。
3 整體仿真結(jié)果
本方案的實現(xiàn)在Xilinx的ISE10.1上綜合,仿真后得到如圖7所示整體仿真波形。仿真中,為了便于查看結(jié)果,將實際受到控制的讀/寫模塊的時鐘引出,分別標記為o_wr_clk,o_rd_clk。由于截圖的限制,只能在圖中顯示FIFO滿的情況??盏那闆r類似。
?
參考文獻
[1] CLIFFORD E.Cummings.Simulation and Synthesis Techniques for Asynchronous.Sunburst Design,Inc 2002.
[2] RYNA W A,YU Zhi Yi,MICHAEL J M,et al.A scalable?dual-clock FIFO for data transfers beteween arbitray and?haltable clock domains.IEEE,2007,15(10).
[3] MICHAEL D C.Advanced-Digital design with the verilog? HDL.publishing house of electronics industry,2004.
[4] Xilinx.Virtex-4 User Guide(UG70 V2.0).www.xilinx.com.2007,1.