《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 可編程邏輯 > 設(shè)計(jì)應(yīng)用 > 基于FPGA與DDR2 SDRAM的大容量異步FIFO緩存設(shè)計(jì)
基于FPGA與DDR2 SDRAM的大容量異步FIFO緩存設(shè)計(jì)
來(lái)源:微型機(jī)與應(yīng)用2011年第4期
庾志衡1,,葉俊明2,,鄧迪文3
(1. 桂林電子科技大學(xué) 電子工程與自動(dòng)化學(xué)院,廣西 桂林 541004; 2. 桂林電子科技大學(xué)
摘要: 為了滿足高速實(shí)時(shí)數(shù)據(jù)采集系統(tǒng)對(duì)所采集海量數(shù)據(jù)進(jìn)行緩存的要求,,通過(guò)研究FIFO的基本工作原理,,利用FPGA和DDR2 SDRAM設(shè)計(jì)了一種高速大容量異步FIFO,。使用Xilinx提供的存儲(chǔ)器接口生成器(MIG)實(shí)現(xiàn)FPGA與DDR2的存儲(chǔ)器接口,,并結(jié)合片上FIFO和相應(yīng)的控制模塊完成FIFO的基本框架結(jié)構(gòu),。詳細(xì)介紹了各個(gè)組成模塊的功能和原理,并設(shè)計(jì)了專(zhuān)門(mén)的測(cè)試模塊,。
Abstract:
Key words :

摘  要: 為了滿足高速實(shí)時(shí)數(shù)據(jù)采集系統(tǒng)對(duì)所采集海量數(shù)據(jù)進(jìn)行緩存的要求,,通過(guò)研究FIFO的基本工作原理,利用FPGADDR2 SDRAM設(shè)計(jì)了一種高速大容量異步FIFO,。使用Xilinx提供的存儲(chǔ)器接口生成器(MIG)實(shí)現(xiàn)FPGA與DDR2的存儲(chǔ)器接口,,并結(jié)合片上FIFO和相應(yīng)的控制模塊完成FIFO的基本框架結(jié)構(gòu),。詳細(xì)介紹了各個(gè)組成模塊的功能和原理,,并設(shè)計(jì)了專(zhuān)門(mén)的測(cè)試模塊。
關(guān)鍵詞: 高速大容量異步FIFO; MIG,; FPGA,; DDR2 SDRAM

 異步FIFO作為數(shù)據(jù)緩存被廣泛應(yīng)用于高速實(shí)時(shí)數(shù)據(jù)采集、不同時(shí)鐘域之間的高性能數(shù)據(jù)傳輸以及多機(jī)處理等系統(tǒng)中[1],。如在視頻系統(tǒng)中用于視頻信號(hào)轉(zhuǎn)換,、視頻分割和畫(huà)中畫(huà)電視[2]。在高速傳感信號(hào)實(shí)時(shí)檢測(cè)處理系統(tǒng)中用于數(shù)據(jù)緩存等,。隨著微電子技術(shù)的發(fā)展,,F(xiàn)IFO芯片也在向著高速、大容量,、小體積,、低成本的方向發(fā)展。特別是Xilinx FPGA 提供的FIFO IP核已經(jīng)能夠達(dá)到500 MHz的速率和4 MB的容量,。這些都為FIFO的實(shí)際工程應(yīng)用提供了廣闊的空間,。但是在某些價(jià)格敏感、要求海量數(shù)據(jù)緩存的高速系統(tǒng)中,,出于價(jià)格和性能方面的考慮,,大容量異步FIFO芯片并非這類(lèi)設(shè)計(jì)的最佳選擇。FPGA具有工作速度高,、可配置性強(qiáng),、靈活性好等突出優(yōu)點(diǎn),使用Xilinx FPGA 提供的免費(fèi)MIG IP核可以很容易實(shí)現(xiàn)FPGA與外部存儲(chǔ)器之間的接口,,而DDR2 SDRAM具有單位空間存儲(chǔ)容量大,、高數(shù)據(jù)帶寬、價(jià)格便宜等優(yōu)點(diǎn),。因此根據(jù)FIFO的基本原理,,通過(guò)采用Xilinx FPGA器件和Micron公司的256MB DDR2 SDRAM MT4HTF3264HY-667設(shè)計(jì)并實(shí)現(xiàn)了一種異步FIFO。該FIFO具有價(jià)格相對(duì)便宜,、高數(shù)據(jù)帶寬,、容量大、數(shù)據(jù)位寬可以根據(jù)需要進(jìn)行相應(yīng)靈活配置等特點(diǎn),,具有較高的工程實(shí)用價(jià)值,。
1 大容量異步FIFO系統(tǒng)方案設(shè)計(jì)
    設(shè)計(jì)主要由兩塊片上FIFO、兩塊數(shù)據(jù)位寬轉(zhuǎn)換模塊,、FIFO控制器,、DDR2 SDRAM控制器、時(shí)鐘模塊和外部的DDR2 SDRAM構(gòu)成[3],。其整體結(jié)構(gòu)框圖如圖1所示,。

    基本工作機(jī)理是當(dāng)WR_EN有效為高電平,,輸入數(shù)據(jù)DIN[N:0]在WR_CLK的上升沿觸發(fā)下經(jīng)過(guò)“數(shù)據(jù)位寬轉(zhuǎn)換模塊1”之后輸出位寬為128 bit的數(shù)據(jù)寫(xiě)入到位寬為128 bit,深度為2 K的“片上FIFO1”中,。當(dāng)FIFO控制器檢測(cè)到“片上FIFO1”快滿時(shí),,開(kāi)始讀取其中的數(shù)據(jù),按照地址順序遞增的方式通過(guò)DDR2 SDRAM控制器寫(xiě)入到DDR2 SDRAM中,,直到“片上FIFO1”被取空,。當(dāng)FIFO控制器檢測(cè)到“片上FIFO2”快空時(shí),通過(guò)DDR2 SDRAM控制器按照地址順序遞增讀取DDR2 SDRAM中的數(shù)據(jù),,寫(xiě)入到“片上FIFO2”中,,直到“片上FIFO2”被寫(xiě)滿為止。DDR2 SDRAM只有一組地址總線,,而在該項(xiàng)設(shè)計(jì)中需要對(duì)DDR2 SDRAM進(jìn)行獨(dú)立的讀寫(xiě)操作,。為此,在FIFO控制器中定義了兩組地址總線用于分別記錄讀寫(xiě)操作地址,,當(dāng)FIFO控制器處于寫(xiě)DDR2 SDRAM狀態(tài)時(shí),,選通寫(xiě)地址總線(wr_addr)與DDR2 SDRAM的地址總線(ddr2_addr)互聯(lián)。當(dāng)FIFO控制器處于讀DDR2 SDRAM狀態(tài)時(shí),,選通讀地址總線(rd_addr)與DDR2 SDRAM的地址總線(ddr2_addr)互聯(lián),。另外為了保證讀數(shù)據(jù)有效,在FIFO控制器中設(shè)計(jì)有相應(yīng)的限制語(yǔ)句,,只有當(dāng)讀地址(rd_addr)小于寫(xiě)地址(wr_addr)時(shí),,才允許讀DDR2 SDRAM中的數(shù)據(jù)。“片上FIFO2”的空滿標(biāo)志信號(hào)作為所設(shè)計(jì)的FIFO的空滿標(biāo)志信號(hào),。從外部看,,該設(shè)計(jì)是一個(gè)具有標(biāo)準(zhǔn)接口的大容量異步FIFO,而不用關(guān)心其內(nèi)部操作,。而且只需要對(duì)數(shù)據(jù)轉(zhuǎn)換模塊中的相關(guān)參數(shù)進(jìn)行簡(jiǎn)單的改動(dòng),,便可以改變?cè)摯笕萘慨惒紽IFO的位寬(THE WIDTH)。
2 高速大容量異步FIFO設(shè)計(jì)
    如圖1所示,,設(shè)計(jì)主要集中在FPGA部分,,包括數(shù)據(jù)位寬轉(zhuǎn)換模塊、FIFO控制器,、時(shí)鐘模塊,、DDR2 SDRAM控制器設(shè)計(jì)以及片上FIFO的定制。
2.1 DDR2 SDRAM控制器設(shè)計(jì)
    存儲(chǔ)器控制器需要對(duì)包括存儲(chǔ)器控制狀態(tài)機(jī)在內(nèi)的所有構(gòu)建模塊加以集成,??刂破鳡顟B(tài)機(jī)必須按正確順序發(fā)出命令,同時(shí)還要考慮存儲(chǔ)器器件的時(shí)序要求,。而且存儲(chǔ)器控制器狀態(tài)機(jī)因存儲(chǔ)器架構(gòu)(DDR,、DDR2,、QDRII、RLDRAM等),、組數(shù)(BANK)、數(shù)據(jù)總線寬度,、存儲(chǔ)器器件的寬度和深度,、組和行存取算法等變量的不同而異。因此,,創(chuàng)建存儲(chǔ)器控制器是一項(xiàng)極其復(fù)雜,、精細(xì)的任務(wù)。
    使用MIG(Memory Interface Generation)軟件工具[4]可以生成一個(gè)完整的設(shè)計(jì),,減少了設(shè)計(jì)人員的工作量,,簡(jiǎn)化了系統(tǒng)設(shè)計(jì)。設(shè)計(jì)人員通過(guò)在MIG GUI中設(shè)置系統(tǒng)和存儲(chǔ)器參數(shù),,整個(gè)過(guò)程不用一分鐘,,MIG工具即可生成存儲(chǔ)控制器有關(guān)的RTL和UCF文件。MIG設(shè)計(jì)流程如圖2所示,。

    設(shè)計(jì)采用Xilinx提供的免費(fèi)IP核 MIG2.3來(lái)設(shè)計(jì)DDR2 SDRAM控制器,。所用FPGA為Virtex-5  FPGA XC5vlx110T??刂破髟砜驁D如圖3所示,。

    其中時(shí)鐘&復(fù)位模塊(Infrastructure)用于生成控制器所需要的各類(lèi)時(shí)鐘和復(fù)位信號(hào),它的輸入時(shí)鐘可根據(jù)用戶需求選擇單端或差分時(shí)鐘信號(hào)輸入,。延時(shí)控制單元(Idelay_ctrl)用于同步校準(zhǔn)設(shè)計(jì)中的延時(shí)單元以減少功耗,。狀態(tài)控制單元(Ctrl)是控制器中的最關(guān)鍵單元,它生成DDR2 存儲(chǔ)器接口和用戶接口所必需的所有控制信號(hào),。物理層控制單元(Phy_top)是設(shè)計(jì)的物理層接口的頂層模塊,,它封裝了FPGA 與 DDR2 SDRAM的物理接口信號(hào)。用戶接口單元(Usr_top)作為設(shè)計(jì)中的用戶接口,,用于接收和存儲(chǔ)用戶數(shù)據(jù),、命令和地址信息。最終將復(fù)雜的DDR2 SDRAM訪問(wèn)操作封裝成簡(jiǎn)單的讀寫(xiě)兩種操作,。設(shè)計(jì)采用的Micron DDR2 SDRAM SODIMM MT4HTF3264HY-667容量為256MB,、帶寬5.3 GB/S、數(shù)據(jù)位寬64 bit,、含10位列地址線,、13位行地址線和2位BANK地址線。上述MIG控制器右側(cè)信號(hào)端口用于連接DDR2 SDRAM物理引腳,,右側(cè)信號(hào)端口用于連接輸入時(shí)鐘和來(lái)自FIFO控制器的數(shù)據(jù)和控制信號(hào)線,。這些端口類(lèi)型和位寬剛好與所選定的MT4HTF3264HY-667相匹配,。
2.2 片上FIFO設(shè)計(jì)
    所設(shè)計(jì)的FIFO數(shù)據(jù)輸入/輸出端與外界的數(shù)據(jù)傳輸、FPGA與DDR2 SDRAM間的通信分別屬于不同的時(shí)鐘域,,設(shè)計(jì)中通過(guò)采用兩塊小容量片上FIFO[5]作為緩沖來(lái)實(shí)現(xiàn)他們之間的跨時(shí)鐘域數(shù)據(jù)傳輸,。根據(jù)所選定DDR2 SDRAM的性能參數(shù),兩塊片上FIFO的數(shù)據(jù)位寬設(shè)置為128 bit,,深度1 kHz,。
2.3 FIFO控制器設(shè)計(jì)
    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ù)量狀況,,對(duì)DDR2 SDRAM總線進(jìn)行分時(shí)復(fù)用。

    該狀態(tài)機(jī)工作過(guò)程為:
    (1)系統(tǒng)上電或復(fù)位后,,狀態(tài)機(jī)進(jìn)入空閑狀態(tài)(idle),,在該狀態(tài)下輸入端片上FIFO1讀使能信號(hào)(rd_en_wrfifo)、輸出端片上FIFO2寫(xiě)使能信號(hào)(wr_en_rdfifo),,DDR2 SDRAM控制器的用戶地址FIFO使能信號(hào)(app_af_wren),,用戶數(shù)據(jù)FIFO使能信號(hào)(app_wdf_wren)均無(wú)效。
    (2)在空閑狀態(tài)下,,當(dāng)檢測(cè)到輸入端片上FIFO1幾乎滿,,并且DDR2 SDRAM控制器初始化完畢,控制器發(fā)送寫(xiě)DDR2 SDRAM命令(cmd =3’b000),。將讀到的數(shù)據(jù)直接寫(xiě)入DDR2 SDRAM由于DDR2 SDRAM控制器突發(fā)長(zhǎng)度為4,,地址總線按4累加。當(dāng)檢測(cè)到片上FIFO1被取空時(shí),,回到空閑狀態(tài),。
    (3)在空閑狀態(tài),當(dāng)檢測(cè)到輸出端片上FIFO2幾乎空,,并且沒(méi)有檢測(cè)到輸入端片上FIFO1幾乎滿時(shí),,開(kāi)始讀DDR2 SDRAM中的數(shù)據(jù),并將讀出的數(shù)據(jù)寫(xiě)入到輸出端片上FIFO2,。待FIFO2寫(xiě)滿后,,回到空閑狀態(tài)。
2.4 時(shí)鐘模塊設(shè)計(jì)
    控制器所需要的系統(tǒng)時(shí)鐘(sys_clk)和200 MHz時(shí)鐘(idly_clk_200)由外部33  MHz時(shí)鐘信號(hào)通過(guò)FPGA的全局時(shí)鐘網(wǎng)絡(luò)后,,分別輸入到兩個(gè)定制好的DCM后輸出生成,。
2.5 數(shù)據(jù)位寬轉(zhuǎn)換模塊設(shè)計(jì)
    該模塊用于匹配N(xiāo)位的輸入/輸出數(shù)據(jù)位寬和兩個(gè)片上FIFO的128 bit數(shù)據(jù)位寬,實(shí)現(xiàn)所設(shè)計(jì)的大容量異步FIFO位寬可配置功能。輸入端數(shù)據(jù)位寬轉(zhuǎn)換模塊的基本工作機(jī)理是將在WR_CLK時(shí)鐘作用下連續(xù)輸入的128/N個(gè)數(shù)據(jù)按先后順序由高到低組成128 bit數(shù)據(jù)輸出到片上FIFO1的數(shù)據(jù)輸入端口,,同時(shí)生成一個(gè)時(shí)鐘上升沿作為FIFO1的寫(xiě)時(shí)鐘,,將該128 bit寬數(shù)據(jù)寫(xiě)入到片上FIFO1中。輸出端數(shù)據(jù)位寬轉(zhuǎn)換模塊將從片上FIFO2讀到的128 bit寬數(shù)據(jù)是由高到低依次拆分為128/N個(gè)N位寬數(shù)據(jù),,并且在RD_CLK上升沿先后輸出這些數(shù)據(jù),。當(dāng)這些數(shù)據(jù)輸出完畢后,該模塊輸出一個(gè)上升沿脈沖作為輸出端片上FIFO2的讀時(shí)鐘信號(hào),,讀取下一個(gè)128 bit寬的數(shù)據(jù),。
3 實(shí)驗(yàn)測(cè)試
    為了測(cè)試系統(tǒng)的性能,設(shè)計(jì)了專(zhuān)門(mén)的測(cè)試系統(tǒng)對(duì)所設(shè)計(jì)的FIFO進(jìn)行測(cè)試,,如圖5所示,。

    基本工作機(jī)理是,,在FPGA內(nèi)部定制一塊存有4KB已知數(shù)據(jù)的嵌入式ROM,。該ROM在時(shí)鐘CLK和循環(huán)地址計(jì)數(shù)器的作用下輸出數(shù)據(jù)流,該數(shù)據(jù)流經(jīng)過(guò)待驗(yàn)證的FIFO緩存后,,通過(guò)串口發(fā)送到上位機(jī)上顯示,。通過(guò)比較上位機(jī)接收到的數(shù)據(jù)與ROM中存儲(chǔ)的數(shù)據(jù)是否一致,便可以判斷系統(tǒng)設(shè)計(jì)是否正確,。
    分別對(duì)不同位寬的FIFO,,通過(guò)改變ROM的時(shí)鐘CLK模擬生成FIFO的高低速率輸入數(shù)據(jù)流,進(jìn)行反復(fù)的實(shí)驗(yàn)測(cè)試,,結(jié)果表明上位機(jī)上接收到的數(shù)據(jù)與ROM中存儲(chǔ)的數(shù)據(jù)是一致的,。
參考文獻(xiàn)
[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é)報(bào),, 2002,12(1):37-38.
[3] 徐欣,周舟,李楠,等.基于DDR2 SDRAM的高速大容量異步FIFO的設(shè)計(jì)與實(shí)現(xiàn)[J].中國(guó)測(cè)試,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.

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