摘 要: 為了滿足高速實時數(shù)據(jù)采集系統(tǒng)對所采集海量數(shù)據(jù)進行緩存的要求,通過研究FIFO的基本工作原理,利用FPGA和DDR2 SDRAM設(shè)計了一種高速大容量異步FIFO。使用Xilinx提供的存儲器接口生成器(MIG)實現(xiàn)FPGA與DDR2的存儲器接口,并結(jié)合片上FIFO和相應(yīng)的控制模塊完成FIFO的基本框架結(jié)構(gòu)。詳細(xì)介紹了各個組成模塊的功能和原理,并設(shè)計了專門的測試模塊。
關(guān)鍵詞: 高速大容量異步FIFO; MIG; FPGA; DDR2 SDRAM
異步FIFO作為數(shù)據(jù)緩存被廣泛應(yīng)用于高速實時數(shù)據(jù)采集、不同時鐘域之間的高性能數(shù)據(jù)傳輸以及多機處理等系統(tǒng)中[1]。如在視頻系統(tǒng)中用于視頻信號轉(zhuǎn)換、視頻分割和畫中畫電視[2]。在高速傳感信號實時檢測處理系統(tǒng)中用于數(shù)據(jù)緩存等。隨著微電子技術(shù)的發(fā)展,F(xiàn)IFO芯片也在向著高速、大容量、小體積、低成本的方向發(fā)展。特別是Xilinx FPGA 提供的FIFO IP核已經(jīng)能夠達到500 MHz的速率和4 MB的容量。這些都為FIFO的實際工程應(yīng)用提供了廣闊的空間。但是在某些價格敏感、要求海量數(shù)據(jù)緩存的高速系統(tǒng)中,出于價格和性能方面的考慮,大容量異步FIFO芯片并非這類設(shè)計的最佳選擇。FPGA具有工作速度高、可配置性強、靈活性好等突出優(yōu)點,使用Xilinx FPGA 提供的免費MIG IP核可以很容易實現(xiàn)FPGA與外部存儲器之間的接口,而DDR2 SDRAM具有單位空間存儲容量大、高數(shù)據(jù)帶寬、價格便宜等優(yōu)點。因此根據(jù)FIFO的基本原理,通過采用Xilinx FPGA器件和Micron公司的256MB DDR2 SDRAM MT4HTF3264HY-667設(shè)計并實現(xiàn)了一種異步FIFO。該FIFO具有價格相對便宜、高數(shù)據(jù)帶寬、容量大、數(shù)據(jù)位寬可以根據(jù)需要進行相應(yīng)靈活配置等特點,具有較高的工程實用價值。
1 大容量異步FIFO系統(tǒng)方案設(shè)計
設(shè)計主要由兩塊片上FIFO、兩塊數(shù)據(jù)位寬轉(zhuǎn)換模塊、FIFO控制器、DDR2 SDRAM控制器、時鐘模塊和外部的DDR2 SDRAM構(gòu)成[3]。其整體結(jié)構(gòu)框圖如圖1所示。
基本工作機理是當(dāng)WR_EN有效為高電平,輸入數(shù)據(jù)DIN[N:0]在WR_CLK的上升沿觸發(fā)下經(jīng)過“數(shù)據(jù)位寬轉(zhuǎn)換模塊1”之后輸出位寬為128 bit的數(shù)據(jù)寫入到位寬為128 bit,深度為2 K的“片上FIFO1”中。當(dāng)FIFO控制器檢測到“片上FIFO1”快滿時,開始讀取其中的數(shù)據(jù),按照地址順序遞增的方式通過DDR2 SDRAM控制器寫入到DDR2 SDRAM中,直到“片上FIFO1”被取空。當(dāng)FIFO控制器檢測到“片上FIFO2”快空時,通過DDR2 SDRAM控制器按照地址順序遞增讀取DDR2 SDRAM中的數(shù)據(jù),寫入到“片上FIFO2”中,直到“片上FIFO2”被寫滿為止。DDR2 SDRAM只有一組地址總線,而在該項設(shè)計中需要對DDR2 SDRAM進行獨立的讀寫操作。為此,在FIFO控制器中定義了兩組地址總線用于分別記錄讀寫操作地址,當(dāng)FIFO控制器處于寫DDR2 SDRAM狀態(tài)時,選通寫地址總線(wr_addr)與DDR2 SDRAM的地址總線(ddr2_addr)互聯(lián)。當(dāng)FIFO控制器處于讀DDR2 SDRAM狀態(tài)時,選通讀地址總線(rd_addr)與DDR2 SDRAM的地址總線(ddr2_addr)互聯(lián)。另外為了保證讀數(shù)據(jù)有效,在FIFO控制器中設(shè)計有相應(yīng)的限制語句,只有當(dāng)讀地址(rd_addr)小于寫地址(wr_addr)時,才允許讀DDR2 SDRAM中的數(shù)據(jù)。“片上FIFO2”的空滿標(biāo)志信號作為所設(shè)計的FIFO的空滿標(biāo)志信號。從外部看,該設(shè)計是一個具有標(biāo)準(zhǔn)接口的大容量異步FIFO,而不用關(guān)心其內(nèi)部操作。而且只需要對數(shù)據(jù)轉(zhuǎn)換模塊中的相關(guān)參數(shù)進行簡單的改動,便可以改變該大容量異步FIFO的位寬(THE WIDTH)。
2 高速大容量異步FIFO設(shè)計
如圖1所示,設(shè)計主要集中在FPGA部分,包括數(shù)據(jù)位寬轉(zhuǎn)換模塊、FIFO控制器、時鐘模塊、DDR2 SDRAM控制器設(shè)計以及片上FIFO的定制。
2.1 DDR2 SDRAM控制器設(shè)計
存儲器控制器需要對包括存儲器控制狀態(tài)機在內(nèi)的所有構(gòu)建模塊加以集成??刂破鳡顟B(tài)機必須按正確順序發(fā)出命令,同時還要考慮存儲器器件的時序要求。而且存儲器控制器狀態(tài)機因存儲器架構(gòu)(DDR、DDR2、QDRII、RLDRAM等)、組數(shù)(BANK)、數(shù)據(jù)總線寬度、存儲器器件的寬度和深度、組和行存取算法等變量的不同而異。因此,創(chuàng)建存儲器控制器是一項極其復(fù)雜、精細(xì)的任務(wù)。
使用MIG(Memory Interface Generation)軟件工具[4]可以生成一個完整的設(shè)計,減少了設(shè)計人員的工作量,簡化了系統(tǒng)設(shè)計。設(shè)計人員通過在MIG GUI中設(shè)置系統(tǒng)和存儲器參數(shù),整個過程不用一分鐘,MIG工具即可生成存儲控制器有關(guān)的RTL和UCF文件。MIG設(shè)計流程如圖2所示。
設(shè)計采用Xilinx提供的免費IP核 MIG2.3來設(shè)計DDR2 SDRAM控制器。所用FPGA為Virtex-5 FPGA XC5vlx110T。控制器原理框圖如圖3所示。
其中時鐘&復(fù)位模塊(Infrastructure)用于生成控制器所需要的各類時鐘和復(fù)位信號,它的輸入時鐘可根據(jù)用戶需求選擇單端或差分時鐘信號輸入。延時控制單元(Idelay_ctrl)用于同步校準(zhǔn)設(shè)計中的延時單元以減少功耗。狀態(tài)控制單元(Ctrl)是控制器中的最關(guān)鍵單元,它生成DDR2 存儲器接口和用戶接口所必需的所有控制信號。物理層控制單元(Phy_top)是設(shè)計的物理層接口的頂層模塊,它封裝了FPGA 與 DDR2 SDRAM的物理接口信號。用戶接口單元(Usr_top)作為設(shè)計中的用戶接口,用于接收和存儲用戶數(shù)據(jù)、命令和地址信息。最終將復(fù)雜的DDR2 SDRAM訪問操作封裝成簡單的讀寫兩種操作。設(shè)計采用的Micron DDR2 SDRAM SODIMM MT4HTF3264HY-667容量為256MB、帶寬5.3 GB/S、數(shù)據(jù)位寬64 bit、含10位列地址線、13位行地址線和2位BANK地址線。上述MIG控制器右側(cè)信號端口用于連接DDR2 SDRAM物理引腳,右側(cè)信號端口用于連接輸入時鐘和來自FIFO控制器的數(shù)據(jù)和控制信號線。這些端口類型和位寬剛好與所選定的MT4HTF3264HY-667相匹配。
2.2 片上FIFO設(shè)計
所設(shè)計的FIFO數(shù)據(jù)輸入/輸出端與外界的數(shù)據(jù)傳輸、FPGA與DDR2 SDRAM間的通信分別屬于不同的時鐘域,設(shè)計中通過采用兩塊小容量片上FIFO[5]作為緩沖來實現(xiàn)他們之間的跨時鐘域數(shù)據(jù)傳輸。根據(jù)所選定DDR2 SDRAM的性能參數(shù),兩塊片上FIFO的數(shù)據(jù)位寬設(shè)置為128 bit,深度1 kHz。
2.3 FIFO控制器設(shè)計
FIFO控制器用于控制兩塊片上FIFO與DDR2 SDRAM之間的數(shù)據(jù)通信,其狀態(tài)轉(zhuǎn)移圖如圖4所示。由于DDR2 SDRAM具有很高的數(shù)據(jù)帶寬,MT4HTF3264-667的帶寬為5.3 GB/S。遠(yuǎn)大于FIFO1輸入/輸出端的數(shù)據(jù)帶寬。所以FIFO控制器根據(jù)兩塊片上FIFO的數(shù)據(jù)量狀況,對DDR2 SDRAM總線進行分時復(fù)用。
該狀態(tài)機工作過程為:
(1)系統(tǒng)上電或復(fù)位后,狀態(tài)機進入空閑狀態(tài)(idle),在該狀態(tài)下輸入端片上FIFO1讀使能信號(rd_en_wrfifo)、輸出端片上FIFO2寫使能信號(wr_en_rdfifo),DDR2 SDRAM控制器的用戶地址FIFO使能信號(app_af_wren),用戶數(shù)據(jù)FIFO使能信號(app_wdf_wren)均無效。
(2)在空閑狀態(tài)下,當(dāng)檢測到輸入端片上FIFO1幾乎滿,并且DDR2 SDRAM控制器初始化完畢,控制器發(fā)送寫DDR2 SDRAM命令(cmd =3’b000)。將讀到的數(shù)據(jù)直接寫入DDR2 SDRAM由于DDR2 SDRAM控制器突發(fā)長度為4,地址總線按4累加。當(dāng)檢測到片上FIFO1被取空時,回到空閑狀態(tài)。
(3)在空閑狀態(tài),當(dāng)檢測到輸出端片上FIFO2幾乎空,并且沒有檢測到輸入端片上FIFO1幾乎滿時,開始讀DDR2 SDRAM中的數(shù)據(jù),并將讀出的數(shù)據(jù)寫入到輸出端片上FIFO2。待FIFO2寫滿后,回到空閑狀態(tài)。
2.4 時鐘模塊設(shè)計
控制器所需要的系統(tǒng)時鐘(sys_clk)和200 MHz時鐘(idly_clk_200)由外部33 MHz時鐘信號通過FPGA的全局時鐘網(wǎng)絡(luò)后,分別輸入到兩個定制好的DCM后輸出生成。
2.5 數(shù)據(jù)位寬轉(zhuǎn)換模塊設(shè)計
該模塊用于匹配N位的輸入/輸出數(shù)據(jù)位寬和兩個片上FIFO的128 bit數(shù)據(jù)位寬,實現(xiàn)所設(shè)計的大容量異步FIFO位寬可配置功能。輸入端數(shù)據(jù)位寬轉(zhuǎn)換模塊的基本工作機理是將在WR_CLK時鐘作用下連續(xù)輸入的128/N個數(shù)據(jù)按先后順序由高到低組成128 bit數(shù)據(jù)輸出到片上FIFO1的數(shù)據(jù)輸入端口,同時生成一個時鐘上升沿作為FIFO1的寫時鐘,將該128 bit寬數(shù)據(jù)寫入到片上FIFO1中。輸出端數(shù)據(jù)位寬轉(zhuǎn)換模塊將從片上FIFO2讀到的128 bit寬數(shù)據(jù)是由高到低依次拆分為128/N個N位寬數(shù)據(jù),并且在RD_CLK上升沿先后輸出這些數(shù)據(jù)。當(dāng)這些數(shù)據(jù)輸出完畢后,該模塊輸出一個上升沿脈沖作為輸出端片上FIFO2的讀時鐘信號,讀取下一個128 bit寬的數(shù)據(jù)。
3 實驗測試
為了測試系統(tǒng)的性能,設(shè)計了專門的測試系統(tǒng)對所設(shè)計的FIFO進行測試,如圖5所示。
基本工作機理是,在FPGA內(nèi)部定制一塊存有4KB已知數(shù)據(jù)的嵌入式ROM。該ROM在時鐘CLK和循環(huán)地址計數(shù)器的作用下輸出數(shù)據(jù)流,該數(shù)據(jù)流經(jīng)過待驗證的FIFO緩存后,通過串口發(fā)送到上位機上顯示。通過比較上位機接收到的數(shù)據(jù)與ROM中存儲的數(shù)據(jù)是否一致,便可以判斷系統(tǒng)設(shè)計是否正確。
分別對不同位寬的FIFO,通過改變ROM的時鐘CLK模擬生成FIFO的高低速率輸入數(shù)據(jù)流,進行反復(fù)的實驗測試,結(jié)果表明上位機上接收到的數(shù)據(jù)與ROM中存儲的數(shù)據(jù)是一致的。
參考文獻
[1] 金明,羅飛路,朱霞飛.FIFO芯片在高速系統(tǒng)中的應(yīng)用[J].電子技術(shù)應(yīng)用,1998,24(3):61-62.
[2] 郭照南,李儒峰.FIFO 芯片AL422B在視頻系統(tǒng)中的應(yīng)用[J].湖南工程學(xué)院學(xué)報, 2002,12(1):37-38.
[3] 徐欣,周舟,李楠,等.基于DDR2 SDRAM的高速大容量異步FIFO的設(shè)計與實現(xiàn)[J].中國測試,2009,35(6):34-37.
[4] Memory interface solutions user guide. http://www.xilinx.com/support/documentation/ip_documentation/ug086.pdf.
[5] LogiCORE? IP FIFO Generator v6.2. http://www.xilinx.com/support/documentation/ip_documentation/fifo_generator_ug175.pdf.