孫冬雪 ,王竹剛
(1.中國(guó)科學(xué)院國(guó)家空間科學(xué)中心,北京100190;2.中國(guó)科學(xué)院大學(xué)計(jì)算機(jī)與控制學(xué)院,北京100190)
數(shù)據(jù)緩存在大數(shù)據(jù)實(shí)時(shí)采集系統(tǒng)中起著至關(guān)重要的作用。它具有多種實(shí)現(xiàn)方式:異步FIFO以先入先出的讀寫規(guī)則,不需要對(duì)讀寫地址進(jìn)行操作、讀寫時(shí)鐘獨(dú)立等優(yōu)點(diǎn)廣泛應(yīng)用于跨時(shí)鐘域的數(shù)據(jù)采集傳輸系統(tǒng)中[1]。但是由于常見FPGA的片上FIFO容量大部分為MB等級(jí),很難滿足對(duì)大數(shù)據(jù)緩存的要求,同時(shí)FIFO地址由內(nèi)部地址指針控制,不能由地址線決定讀取地址,可移植性差。DDR3 SDRAM(Double DataRateSynchronousDynamicRandom Access Memory)的內(nèi)存容量已經(jīng)達(dá)到GB等級(jí),完全可以對(duì)大量數(shù)據(jù)同時(shí)緩存,因此受到工程人員的青睞,但是由于DDR3不能直接像FIFO一樣通過識(shí)別外界設(shè)置的讀寫使能來(lái)完成對(duì)數(shù)據(jù)的緩存,而是需要自己設(shè)計(jì)一個(gè)操作復(fù)雜的讀寫操作控制模塊,這樣加大了設(shè)計(jì)人員的開發(fā)時(shí)間和成本[2]。本設(shè)計(jì)基于以上所述,把FIFO和DDR3 SDRAM的優(yōu)點(diǎn)結(jié)合起來(lái),設(shè)計(jì)了一種大容量異步FIFO數(shù)據(jù)緩存系統(tǒng)。它可以直接通過識(shí)別外界的操作使能完成對(duì)大量數(shù)據(jù)的緩存,操作簡(jiǎn)單、速率快,可以用于大量數(shù)據(jù)實(shí)時(shí)采集系統(tǒng)中。
雙倍速率同步動(dòng)態(tài)隨機(jī)存儲(chǔ)器(DDR3 SDRAM)可以同時(shí)在時(shí)鐘的上升沿和下降沿傳輸數(shù)據(jù)[3],其傳輸速率在不改變時(shí)鐘頻率的情況下是SDRAM的兩倍。本設(shè)計(jì)基于KC705評(píng)估板,DDR3采用Micron公司的MT8JTF12864HZ-DDR3內(nèi)存條,它內(nèi)部配置有8個(gè)BANK,能夠以8n預(yù)取結(jié)構(gòu)獲得高速操作,同時(shí)它采用先進(jìn)的同步電路,讀、寫數(shù)據(jù)、命令和CPU同步又相互獨(dú)立完成,8個(gè)BANK對(duì)應(yīng)3根BANK地址選擇線,行地址線復(fù)用14根、列地址線復(fù)用10根,通過8組數(shù)據(jù)線(DQ0-DQ7)來(lái)完成對(duì)外的通信,因此每個(gè)內(nèi)存芯片的容量為8*2^3*2^14*2^10=128 MB,該內(nèi)存條由8片同樣的內(nèi)存芯片構(gòu)成,則內(nèi)存條的容量為1 GB。將內(nèi)存條的突發(fā)長(zhǎng)度設(shè)置為8,每顆芯片含8根數(shù)據(jù)線(DQ0-DQ7),8片芯片放在一起,則每次讀寫操作的數(shù)據(jù)位寬為512位,大大提高了DDR3的讀寫效率[4]。
本設(shè)計(jì)由DDR3 SDRAM控制模塊、外部的DDR3 SDRAM、兩片F(xiàn)IFO、FIFO控制模塊和時(shí)鐘復(fù)位模塊構(gòu)成。其總體框圖如圖1所示。
本設(shè)計(jì)采用分包傳輸,一包傳輸32*512 b=16 kb=2 KB數(shù)據(jù)。外界提供異步FIFO的寫使能將數(shù)據(jù)輸入到WR_FIFO中等待,當(dāng)WR_FIFO的剩余數(shù)據(jù)量達(dá)到2KB且DDR3準(zhǔn)備好時(shí),將WR_FIFO的讀使拉高,數(shù)據(jù)便被傳輸?shù)紻DR3中,當(dāng)寫入DDR3的數(shù)據(jù)達(dá)到2KB時(shí),轉(zhuǎn)向讀DDR3狀態(tài),即RD_FIFO的寫使能為1,將數(shù)據(jù)傳輸?shù)絉D_FIFO中。當(dāng)收到用戶的讀請(qǐng)求后將數(shù)據(jù)從RD_FIFO讀出,循環(huán)進(jìn)行,就可以用DDR3模擬FIFO完成對(duì)數(shù)據(jù)的緩存。對(duì)于用戶來(lái)講,本設(shè)計(jì)是一個(gè)標(biāo)準(zhǔn)的大容量FIFO,用戶可以直接根據(jù)自己的需求像FIFO一樣對(duì)外部接口進(jìn)行操作,不用關(guān)心其內(nèi)部組成原理。
圖1 系統(tǒng)總體框圖
設(shè)計(jì)使用MIG核user design里的RTL來(lái)建立工程,首先在MIG核的GUI圖形界面選擇MT8JTF1 2864 Hz芯片、將DDR3的工作時(shí)鐘設(shè)置為800 MHz、輸入時(shí)鐘設(shè)置為200 MHz、再對(duì)應(yīng)開發(fā)版手冊(cè)填好管腳約束等參數(shù)[5],即可生成DDR3 SDRAM控制器??刂破鞣庋b了用戶邏輯到存儲(chǔ)器邏輯的轉(zhuǎn)換,我們只需要根據(jù)MIG核用戶接口協(xié)議編寫用戶邏輯,根據(jù)自己的需求產(chǎn)生讀寫命令、地址、數(shù)據(jù)信息[6],DDR3 SDRAM控制模塊的工作流程如圖2所示。
圖2 控制模塊工作流程
DDR3 SDRAM控制模塊用來(lái)產(chǎn)生讀寫DDR3 SDRAM的命令和數(shù)據(jù)存儲(chǔ)的地址。整個(gè)設(shè)計(jì)依據(jù)DDR3提供的APP協(xié)議進(jìn)行編寫,在正常操作之前,DDR3 SDRAM必須要以預(yù)定義的方式上電和初始化。從外界輸入200M的差分輸入時(shí)鐘,MIG產(chǎn)生DDR3的工作時(shí)鐘800M,和整個(gè)系統(tǒng)的工作時(shí)鐘200MHz[7]。將KC705的SW4作為復(fù)位信號(hào)經(jīng)過DDR3產(chǎn)生的rst作為整個(gè)系統(tǒng)的復(fù)位信號(hào),所有模塊均采用高電平復(fù)位[8]。設(shè)計(jì)將控制器的200 M系統(tǒng)時(shí)鐘經(jīng)過MIG IP核中的鎖相環(huán)倍頻到800 M作為控制器的主時(shí)鐘頻率,由于DDR3能夠在時(shí)鐘的上下沿都傳輸數(shù)據(jù),因此,其傳輸速度達(dá)到1600 M/S[9],數(shù)據(jù)寬度為64 bit。
設(shè)計(jì)中采用兩個(gè)小容量片上FIFO來(lái)解決整個(gè)數(shù)據(jù)傳輸過程由于讀寫時(shí)鐘不同所帶來(lái)的亞穩(wěn)態(tài)問題[10]。片上FIFO采用Xilinx FPGA的異步FIFO標(biāo)準(zhǔn)IP來(lái)實(shí)現(xiàn)。WR_FIFO的讀數(shù)據(jù)位寬設(shè)置為512 bit,RD_FIFO的寫數(shù)據(jù)位寬設(shè)置為512 bit。它們的數(shù)據(jù)深度均設(shè)置為512。WR_FIFO的復(fù)位信號(hào)和用戶控制邏輯模塊相同,即高電平復(fù)位,低電平工作,它的寫時(shí)鐘和外部采集數(shù)據(jù)的時(shí)鐘相同,讀時(shí)鐘和DDR3的用戶時(shí)鐘相同;它的讀使能由用戶控制邏輯模塊控制(當(dāng)DDR3準(zhǔn)備好,即初始化成功、app_rdy和app_wdf_rdy均為1、且WR_FIFO內(nèi)部剩余數(shù)據(jù)量達(dá)到2KB),其內(nèi)部剩余數(shù)據(jù)量由rd_data_count提供。RD_FIFO的工作原理和WR_FIFO的工作原理類似,寫時(shí)鐘和DDR3的用戶時(shí)鐘相同,讀時(shí)鐘對(duì)應(yīng)外部時(shí)鐘,同理它的寫使能也由用戶控制邏輯模塊控制,當(dāng)狀態(tài)機(jī)跳轉(zhuǎn)到讀時(shí),將RD_FIFO的寫使能拉高。
為了證明所設(shè)計(jì)的DDR3控制模塊和FIFO緩存系統(tǒng)能正常工作,將設(shè)計(jì)生成的比特流文件下載到開發(fā)板進(jìn)行測(cè)試。本次測(cè)試基于Vivado 2016.2,為了便于分析,采用Xilinx提供的片上調(diào)試工具Chipscope[11]來(lái)監(jiān)測(cè)讀寫命令、數(shù)據(jù)等信號(hào),和MIG時(shí)序以及寫入數(shù)據(jù)作比較。
DDR3 SDRAM控制模塊測(cè)試的基本原理:將由32個(gè)地址低16位組成的512bit數(shù)據(jù)作為寫入數(shù)據(jù)輸入到DDR3 SDRAM控制模塊,采用寫計(jì)數(shù)器計(jì)存進(jìn)去的數(shù)據(jù)個(gè)數(shù),當(dāng)計(jì)到32個(gè)(2 kB)時(shí)等待20個(gè)時(shí)鐘轉(zhuǎn)向讀DDR3狀態(tài),同理再用讀計(jì)數(shù)器計(jì)讀出來(lái)的數(shù)據(jù)個(gè)數(shù),到32個(gè)以后等待20個(gè)時(shí)鐘再轉(zhuǎn)向?qū)慏DR3狀態(tài),循環(huán)讀寫,實(shí)現(xiàn)對(duì)DDR3 SDRAM控制模塊的測(cè)試。
1)用Chipscope監(jiān)測(cè)到的寫DDR3波形如圖3所示。
圖3 控制模塊寫時(shí)序
上圖中:phy_init_done(app_ini)的值一直為 1,說明初始化成功;app_rdy和app_wdf_rdy是內(nèi)存條的輸出信號(hào),app_rdy表示硬件已經(jīng)準(zhǔn)備好,可以接收控制模塊輸出的命令操作,只有當(dāng)它拉高的時(shí)候,地址app_addr才是有效的;app_wdf_rdy是ddr內(nèi)部寫FIFO滿對(duì)應(yīng)的信號(hào),當(dāng)它為0時(shí),說明寫FIFO已滿,寫入數(shù)據(jù)無(wú)效,只有為1時(shí),app_wdf_data才是有效的,因?yàn)楸敬卧O(shè)計(jì)每包僅處理32組,寫FIFO不會(huì)滿,所以此信號(hào)一直為1;app_en、app_cmd、app_addr在時(shí)序上和app_rdy相對(duì)應(yīng),app_cmd是讀寫控制命令信號(hào),用來(lái)控制數(shù)據(jù)寫入還是數(shù)據(jù)讀出,當(dāng)為3’b000時(shí)說明當(dāng)前在進(jìn)行寫操作,當(dāng)為3’b001時(shí)說明當(dāng)前進(jìn)行的是讀操作,在本模塊中讀寫命令中間的等待時(shí)間 ,將 app_cmd賦值為 3’b111;app_addr(ddr_addr)由app_rdy控制用來(lái)控制寫操作地址,當(dāng)app_rdy拉低時(shí),地址無(wú)效,所以它對(duì)應(yīng)的地址應(yīng)該如圖3所示延時(shí)一個(gè)周期,DDR3的地址按照結(jié)構(gòu)從高位到低位分別是Rank+Bank+Row+Column,由于本設(shè)計(jì)采用的DDR3的突發(fā)長(zhǎng)度BL=8,寫地址值以8為單位連續(xù)增加,將app_addr的初地址賦值為0,則app_addr低4位將如圖3一直在0和8交替循環(huán);app_en是操作地址的使能信號(hào),上圖它一直拉高說明app_addr有效[12-14];本次測(cè)試將由32個(gè)地址低16位組成的512 bit數(shù)據(jù)非阻塞賦值給app_wdf_data作為寫入數(shù)據(jù),則某一地址的數(shù)據(jù)由32個(gè)比自己地址低16位小1的512 bit數(shù)據(jù)組成,和圖3對(duì)比可知寫入的數(shù)據(jù)正確;app_wdf_wren是寫入數(shù)據(jù)的接口使能信號(hào),只有在它拉高的情況下app_wdf_data才是有效的;app_wdf_end保持和app_wdf_wren相同即可;每個(gè)控制周期對(duì)應(yīng)一組突發(fā)數(shù)據(jù)(512bit),則每寫入一次數(shù)據(jù)就要給出一個(gè)app_wdf_wren[12,15]。將圖3和MIG的寫時(shí)序圖對(duì)比,可知此控制模塊寫設(shè)計(jì)滿足DDR3寫時(shí)序要求即寫模塊設(shè)計(jì)正確。
2)用Chipscope監(jiān)測(cè)到的讀DDR3波形如圖4所示。
圖4 控制模塊讀時(shí)序
上圖中:phy_init_done的值一直為1,說明初始化完成;app_cmd=3’b001,表示當(dāng)前進(jìn)行讀操作;app_addr(ddr_addr)用來(lái)操作讀地址,只有在app_rdy和app_en都拉高的情況下地址才是有效的。從圖4可知:在給出讀地址和讀命令,隔一段時(shí)間才收到DDR3發(fā)出來(lái)的讀數(shù)據(jù),因?yàn)樵贒DR內(nèi)核里,地址、命令和讀數(shù)據(jù)是兩套不同的系統(tǒng),DDR需要反應(yīng)時(shí)間,所以讀數(shù)據(jù)會(huì)相對(duì)讀命令有所延遲。app_rd_data則是讀數(shù)據(jù)接口,app_rd_data_valid拉高表示app_rd_data有效[16]。從上圖可知讀出來(lái)的這一包數(shù)據(jù)的最后一個(gè)數(shù)和這一包寫進(jìn)去的最后一個(gè)數(shù)完全一致,再和讀地址對(duì)比發(fā)現(xiàn)某一地址讀出來(lái)的數(shù)據(jù)由32個(gè)比地址低16位小1的512 bit數(shù)據(jù)組成,和寫數(shù)據(jù)完全對(duì)應(yīng),證明該控制模塊能夠正確的對(duì)DDR3 SDRAM進(jìn)行讀寫操作。將圖4和MIG的讀時(shí)序圖對(duì)比,可知此控制模塊設(shè)計(jì)滿足DDR3寫時(shí)序要求,驗(yàn)證了此模塊的正確性。
該緩存設(shè)計(jì)對(duì)用戶來(lái)說是一個(gè)標(biāo)準(zhǔn)的大容量FIFO,用戶只需要提供存儲(chǔ)的數(shù)據(jù)、使能信號(hào)、時(shí)鐘、位寬,不用關(guān)心其內(nèi)部操作。為了測(cè)試該系統(tǒng)的性能,采用如圖5所示框架進(jìn)行驗(yàn)證。
圖5 測(cè)試系統(tǒng)框圖
上圖基本的工作原理:在FPGA內(nèi)部通過邏輯產(chǎn)生存儲(chǔ)數(shù)據(jù)流,將他們通過待測(cè)試的異步FIFO系統(tǒng)緩存后,將輸出數(shù)據(jù)流用Chipscope監(jiān)測(cè),通過改變FIFO的時(shí)鐘和相應(yīng)輸入輸出數(shù)據(jù)寬度,便可實(shí)現(xiàn)此系統(tǒng)在不同時(shí)鐘域下的高速數(shù)據(jù)傳輸,通過比較Chipscope顯示的數(shù)據(jù)和邏輯產(chǎn)生的數(shù)據(jù)是否一致,便可以判斷系統(tǒng)設(shè)計(jì)是否正確。
分別用邏輯產(chǎn)生不同位寬的模擬輸入數(shù)據(jù),對(duì)應(yīng)不同的測(cè)試時(shí)鐘。通過待測(cè)試的緩存系統(tǒng),多次實(shí)驗(yàn)證明:Chipscope顯示的數(shù)據(jù)和邏輯產(chǎn)生的數(shù)據(jù)一致,此系統(tǒng)設(shè)計(jì)正確。
本設(shè)計(jì)由硬件描述語(yǔ)言verilog編寫完成,它結(jié)合了DDR3和FIFO的優(yōu)點(diǎn),操作簡(jiǎn)單、容量大、移植方便,又可以完成數(shù)據(jù)的跨時(shí)鐘域傳輸,實(shí)用性高、可繼承性好。通過VivadoChipscope對(duì)異步FIFO系統(tǒng)調(diào)試,驗(yàn)證了本設(shè)計(jì)的正確性。經(jīng)過測(cè)試,本設(shè)計(jì)實(shí)現(xiàn)了最高480M的數(shù)據(jù)傳輸率,64~512位的總線寬度,容量最大為1 GB,可以用來(lái)緩存高速實(shí)時(shí)采集系統(tǒng)所采集的數(shù)據(jù)。
參考文獻(xiàn):
[1]馬其琪,鮑愛達(dá).基于DDR3 SDRAM的高速大容量數(shù)據(jù)緩存設(shè)計(jì)[J].計(jì)算機(jī)測(cè)量與控制,2015(9):3112-3113,3118.
[2]丁寧,馬游春,秦麗.基于FPGA的DDR3-SDRAM控制器用戶接口設(shè)計(jì)[J].科學(xué)技術(shù)與工程,2014(17):225-229.
[3]張劍.一種基于FPGA的Virtual FIFO控制器的設(shè)計(jì)與實(shí)現(xiàn)[C]//中國(guó)計(jì)算機(jī)學(xué)會(huì).第十八屆計(jì)算機(jī)工程與工藝年會(huì)暨第四屆微處理器技術(shù)論壇論文集,中國(guó)計(jì)算機(jī)學(xué)會(huì),2014:7.
[4]楊金宙,徐東明,王艷.基于FPGA的高速數(shù)據(jù)采集系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].中國(guó)集成電路,2017(Z1):20-23,34.
[5]張剛,賈建超,趙龍.基于FPGA的DDR3 SDRAM控制器設(shè)計(jì)及實(shí)現(xiàn)[J].電子科技,2014(1):70-73.
[6]宗凱.基于FPGA的DDR3控制器設(shè)計(jì)[J].電子測(cè)量技術(shù),2017(1):118-122.
[7]王紅兵,強(qiáng)景,周珍龍.Xilinx MIG IP核的研究及大容量數(shù)據(jù)緩沖區(qū)的實(shí)現(xiàn)[J].電子產(chǎn)品世界,2016(8):43-46.
[8]KC705 Evaluation Board for the Kintex-7 FPGA ug810(v1.0)[EB/OL].[2014-03-21].http://www.xilinx.com/warranty.htm.
[9]潘一飛,余海.基于FPGA的DDR3用戶接口設(shè)計(jì)[J].電子制作,2013(15):9-10,16.
[10]李玉發(fā),孫靖國(guó),李濤.一種高速大容量異步FIFO的實(shí)現(xiàn)方法[J].航空計(jì)算技術(shù),2015(5):114-116,120.
[11]ChipScope Pro Logic Analyzer tool[EB/OL].[2014-02-17].http://www.xilinx.com/tools/cspro.htm.
[12]7 Series FPGAs Memory Interface Solutions[EB/OL].[2014-02-11].http://www.xilinx.com.
[13]余壯志.基于FPGA的多通道高頻信號(hào)采集和存儲(chǔ)研究[D].湘潭:湘潭大學(xué),2015.
[14]劉杰,賽景波.基于DDR2SDRAM乒乓雙緩沖的高速數(shù)據(jù)收發(fā)系統(tǒng)設(shè)計(jì)[J].電子器件,2015(3):650-654.
[15]李鵬.高速大容量存儲(chǔ)器的控制器設(shè)計(jì)與驗(yàn)證[D].西安:西安電子科技大學(xué),2015.
[16]李元兵,姚遠(yuǎn)程,秦明偉.DDR3-SDRAM控制器設(shè)計(jì)及FPGA實(shí)現(xiàn)[J].自動(dòng)化儀表,2016(8):5-7,12.