唐 瑞,葉李萍,王經(jīng)坤,姚遠(yuǎn)程
(1.西南科技大學(xué)信息工程學(xué)院,四川 綿陽(yáng) 621010;2.西華師范大學(xué)商學(xué)院,四川 南充 637000)
第三代雙倍數(shù)據(jù)傳輸速率同步動(dòng)態(tài)隨機(jī)存儲(chǔ)器(double-data-rate three synchronous dynamic random access memory,DDR3 SDRAM)自面世以來(lái),以其相對(duì)于DDR2更高的運(yùn)行效能與更低的電壓功耗等優(yōu)勢(shì),迅速在諸多領(lǐng)域中取代了DDR2,成為新一代高速、大容量數(shù)據(jù)緩存器中的較好選擇[1]。通常Xilinx官方提供的DDR3 IP核中默認(rèn)只有一套讀寫(xiě)通道,讀寫(xiě)共用同一套地址[2]。本設(shè)計(jì)是在DDR3上,切割出兩套獨(dú)立讀寫(xiě)通道,基于時(shí)分復(fù)用(time division multiplexing,TDM)原則,使每一套讀寫(xiě)接口互不影響。在第一套接口中向DDR3寫(xiě)入數(shù)據(jù)的同時(shí),該設(shè)計(jì)實(shí)現(xiàn)了向第二套接口中寫(xiě)入或者讀出數(shù)據(jù),增強(qiáng)了DDR3的靈活性,提高了DDR3的使用效率。
隨著高速圖像處理技術(shù)的飛速發(fā)展,在實(shí)現(xiàn)圖像算法的過(guò)程中,往往需要實(shí)時(shí)處理大量的數(shù)據(jù),所以必須采用高速數(shù)據(jù)緩存器DDR3作為實(shí)時(shí)數(shù)據(jù)緩存工具。目前,各大FPGA廠商都提供了對(duì)DDR3讀寫(xiě)控制的IP核。但該IP核僅支持一套讀寫(xiě)接口[3],無(wú)法同時(shí)進(jìn)行讀寫(xiě)。這是由于DDR3本身的特性所決定的。為了彌補(bǔ)這一缺點(diǎn),需要設(shè)計(jì)一種從用戶接口到DDR3的橋接電路。該電路使用時(shí)分復(fù)用的設(shè)計(jì)理念,能充分提高DDR3的讀寫(xiě)效率;同時(shí),結(jié)合外部的緩存器先入先出隊(duì)列(first input first output,FIFO),可同時(shí)實(shí)現(xiàn)對(duì)DDR3的讀寫(xiě)操作。
本文使用Xilinx公司提供的IP核,生成控制DDR3的控制器核(memory interface generator,MIG),并與用戶接口[4]。本設(shè)計(jì)在該控制器的基礎(chǔ)上,通過(guò)時(shí)分復(fù)用原則,將一套不獨(dú)立的讀寫(xiě)通道搭建為雙獨(dú)立的讀寫(xiě)通道,能滿足用戶同時(shí)讀寫(xiě)的要求。
整個(gè)硬件模塊分為4大部分:用戶接口模塊,時(shí)分復(fù)用橋接電路模塊,Xilinx公司所提供的DDR3控制器以及DDR3芯片。其中,用戶接口模塊作為面向用戶的接口,包含兩套獨(dú)立的讀寫(xiě)接口。此模塊是發(fā)起讀寫(xiě)操作的源頭。時(shí)分復(fù)用橋接電路模塊可實(shí)現(xiàn)雙讀寫(xiě)端口向單讀寫(xiě)端口的轉(zhuǎn)換。此模塊內(nèi)部包含4個(gè)FIFO,用于DDR3讀寫(xiě)雙通道的數(shù)據(jù)臨時(shí)緩存。DDR3控制器由IP核MIG生成,能完成對(duì)DDR3寫(xiě)入數(shù)據(jù)和讀出數(shù)據(jù)的操作,是DDR3的主要控制器,但其僅有一套非獨(dú)立讀寫(xiě)通道。DDR3高速數(shù)據(jù)緩存器屬于外部硬件器件,可實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)功能。整個(gè)系統(tǒng)硬件設(shè)計(jì)結(jié)構(gòu)如圖1所示。
圖1 系統(tǒng)硬件設(shè)計(jì)結(jié)構(gòu)圖Fig.1 Structure of system hardware design
用戶接口包括兩套獨(dú)立的讀寫(xiě)接口port1和port2,可實(shí)現(xiàn)用戶數(shù)據(jù)、用戶配置信息與橋接電路模塊之間的交互。在每套讀寫(xiě)接口中均有配置端口和數(shù)據(jù)端口。配置端口包括用戶需要讀(寫(xiě))的數(shù)據(jù)長(zhǎng)度,讀(寫(xiě))操作的起始地址,讀(寫(xiě))命令信號(hào)的觸發(fā),讀(寫(xiě))操作完成反饋信號(hào);數(shù)據(jù)端口包括寫(xiě)入的數(shù)據(jù)信號(hào),寫(xiě)入數(shù)據(jù)有效信號(hào),讀出數(shù)據(jù)有效信號(hào)與讀出的數(shù)據(jù)信號(hào)。port1與port2兩套讀寫(xiě)接口完全一致,皆包含以上信息。本設(shè)計(jì)所采用的同步時(shí)鐘是由DDR3控制器核輸出的用戶時(shí)鐘。該同步時(shí)鐘為200 MHz。
2.3.1時(shí)分復(fù)用狀態(tài)機(jī)設(shè)計(jì)
本文采取時(shí)分復(fù)用的思想,通過(guò)數(shù)據(jù)切換器,使兩套讀寫(xiě)接口分時(shí)地與DDR3控制器接口相連接。每組讀寫(xiě)接口負(fù)責(zé)讀和寫(xiě)兩種任務(wù)。所以,總的狀態(tài)可以分為4種:port1寫(xiě)數(shù)據(jù)任務(wù),port1讀數(shù)據(jù)任務(wù),port2寫(xiě)數(shù)據(jù)任務(wù),port2讀數(shù)據(jù)任務(wù)。由用戶接口模塊配置的指令決定執(zhí)行哪些指令。用戶可以同時(shí)下達(dá)多個(gè)指令任務(wù),由時(shí)分復(fù)用輪循機(jī)制輪流執(zhí)行任務(wù),以達(dá)到同時(shí)讀寫(xiě)的效果[5]。
為了讓4個(gè)任務(wù)在執(zhí)行時(shí)避免因建立沖突而相互獨(dú)立,需要定義4個(gè)狀態(tài)。每個(gè)狀態(tài)對(duì)應(yīng)執(zhí)行一個(gè)任務(wù)。狀態(tài)機(jī)在空閑狀態(tài)中經(jīng)過(guò)條件判斷結(jié)構(gòu),確定跳轉(zhuǎn)到用戶下達(dá)的任務(wù)狀態(tài);進(jìn)入任務(wù)狀態(tài)后,開(kāi)始任務(wù)執(zhí)行計(jì)時(shí);任務(wù)計(jì)時(shí)計(jì)滿后,無(wú)論該任務(wù)是否執(zhí)行完畢,都通過(guò)一個(gè)額外的結(jié)束狀態(tài)跳轉(zhuǎn)到空閑狀態(tài),以完成循環(huán)。時(shí)分復(fù)用狀態(tài)機(jī)設(shè)計(jì)如圖2所示。
圖2 時(shí)分復(fù)用狀態(tài)機(jī)設(shè)計(jì)圖Fig.2 Design of the TDM state machine
圖2中,IDEL為空閑狀態(tài)。在該狀態(tài)中,可實(shí)現(xiàn)4種任務(wù)命令檢測(cè),并對(duì)用戶已下達(dá)的多個(gè)任務(wù)指令進(jìn)行執(zhí)行順序的劃分。任務(wù)執(zhí)行順序的劃分采用了1個(gè)2 bit位寬的單向計(jì)數(shù)器flag來(lái)實(shí)現(xiàn)。flag值為1,對(duì)應(yīng)port1寫(xiě)數(shù)據(jù)任務(wù);flag值為2,對(duì)應(yīng)port1讀數(shù)據(jù)任務(wù);flag值為3,對(duì)應(yīng)port2寫(xiě)數(shù)據(jù)任務(wù);flag值為0,對(duì)應(yīng)port2讀數(shù)據(jù)任務(wù)。規(guī)定flag在任務(wù)執(zhí)行計(jì)時(shí)滿8個(gè)時(shí)鐘周期之后,不管任務(wù)是否完成,都跳轉(zhuǎn)到空閑狀態(tài),flag自動(dòng)單向加1。flag的不同值代表著對(duì)不同任務(wù)指令情況進(jìn)行檢測(cè)。當(dāng)flag為1時(shí),若檢測(cè)到用戶下達(dá)過(guò)port1寫(xiě)數(shù)據(jù)任務(wù),而此時(shí)又是在port1寫(xiě)狀態(tài)中,則執(zhí)行該任務(wù);若沒(méi)有檢測(cè)到用戶下達(dá)過(guò)port1寫(xiě)數(shù)據(jù)任務(wù),則返回,flag自動(dòng)單向加1,并進(jìn)行下一個(gè)任務(wù)狀態(tài)檢測(cè)[6]。
2.3.2實(shí)現(xiàn)時(shí)間片的劃分
用戶下達(dá)的不同指令任務(wù)信息會(huì)存儲(chǔ)在不同的對(duì)應(yīng)寄存器中。當(dāng)上電復(fù)位時(shí),該寄存器值為0。當(dāng)用戶發(fā)送讀(寫(xiě))指令任務(wù)(上升沿脈沖觸發(fā))時(shí),該寄存器值置1,完成任務(wù)下達(dá)。當(dāng)任務(wù)執(zhí)行一段時(shí)間后,如通過(guò)地址長(zhǎng)度檢測(cè)到該任務(wù)被執(zhí)行完成,則該命令寄存器被清零,完成任務(wù)。
為了實(shí)現(xiàn)用戶發(fā)布的指令任務(wù)能同時(shí)進(jìn)行,設(shè)計(jì)中若單個(gè)任務(wù)耗時(shí)長(zhǎng)于8個(gè)時(shí)鐘單位,則該任務(wù)不能被一次性執(zhí)行完畢,而是采用任務(wù)執(zhí)行計(jì)時(shí)的機(jī)制。通過(guò)定義一個(gè)任務(wù)執(zhí)行時(shí)間計(jì)數(shù)器,無(wú)論任務(wù)是否執(zhí)行完畢,只要該計(jì)數(shù)器達(dá)到閾值,便立即跳出執(zhí)行狀態(tài)并回到IDEL,flag加1,自動(dòng)檢測(cè)執(zhí)行其他隊(duì)列任務(wù)。這樣使用輪循的時(shí)分復(fù)用機(jī)制,能滿足同時(shí)讀寫(xiě)的目標(biāo)。該過(guò)程完成了對(duì)DDR3執(zhí)行各種任務(wù)時(shí)間片的切分。設(shè)計(jì)中所設(shè)置的兩組接口讀寫(xiě)數(shù)據(jù)任務(wù)定時(shí)閾值為8個(gè)時(shí)鐘周期,同步時(shí)鐘為200 MHz[7]。
在經(jīng)過(guò)多次循環(huán)后,用戶發(fā)布的所有任務(wù)被執(zhí)行完畢。在此過(guò)程中,讀寫(xiě)數(shù)據(jù)個(gè)數(shù)計(jì)數(shù)器對(duì)任務(wù)中讀寫(xiě)的數(shù)據(jù)總量進(jìn)行計(jì)數(shù)。系統(tǒng)每讀寫(xiě)一個(gè)數(shù)據(jù),則與任務(wù)相對(duì)應(yīng)的讀寫(xiě)數(shù)據(jù)個(gè)數(shù)計(jì)數(shù)器便累加一次。當(dāng)累計(jì)值達(dá)到用戶配置的讀寫(xiě)數(shù)據(jù)個(gè)數(shù)(用戶配置讀寫(xiě)數(shù)據(jù)長(zhǎng)度,通過(guò)讀寫(xiě)數(shù)據(jù)長(zhǎng)度來(lái)?yè)Q算出具體的讀寫(xiě)數(shù)據(jù)個(gè)數(shù))時(shí),判定本次任務(wù)執(zhí)行完畢,從而將該任務(wù)對(duì)應(yīng)的寄存器中的任務(wù)信號(hào)置0。
系統(tǒng)檢測(cè)到讀(寫(xiě))命令后,即跳轉(zhuǎn)到相應(yīng)的狀態(tài)執(zhí)行任務(wù)。每個(gè)不同的任務(wù)狀態(tài)映射為對(duì)DDR3控制器讀(寫(xiě))操作的不同配置。在進(jìn)入不同狀態(tài)的同時(shí),對(duì)應(yīng)任務(wù)起始地址端口的地址值被寄存在相應(yīng)的地址寄存器中。4個(gè)這樣的地址寄存器通過(guò)任務(wù)狀態(tài)控制的數(shù)據(jù)選擇器連接到DDR3控制器的地址端口。在DDR3和對(duì)應(yīng)FIFO準(zhǔn)備完畢的前提下,每次對(duì)App_wdf_data端口讀(寫(xiě))一個(gè)數(shù)據(jù),地址寄存器便自增8。由于該端口位寬為512 bit,而DDR3存儲(chǔ)單元位寬只有64 bit,即相當(dāng)于一次存取了8個(gè)DDR3單元數(shù)據(jù)。當(dāng)?shù)刂芳拇嫫饔?jì)數(shù)至用戶配置的地址緩存長(zhǎng)度時(shí),讀(寫(xiě))數(shù)據(jù)個(gè)數(shù)計(jì)數(shù)器同時(shí)記滿,任務(wù)執(zhí)行完畢,解除任務(wù)指令,任務(wù)寄存器有效信號(hào)置0。
用戶接口電路中使用了4個(gè)FIFO作為數(shù)據(jù)緩存。待寫(xiě)入DDR3的數(shù)據(jù)被緩存在寫(xiě)數(shù)據(jù)FIFO中。寫(xiě)數(shù)據(jù)FIFO輸入位寬為256 bit,輸出位寬為512 bit,以便與DDR3控制器對(duì)接。待讀取的數(shù)據(jù)被緩存在讀數(shù)據(jù)FIFO中。讀數(shù)據(jù)FIFO的輸入位寬為512 bit,輸出位寬為256 bit,以便與用戶接口對(duì)接。當(dāng)讀寫(xiě)FIFO出現(xiàn)任何讀空或因?qū)憹M而導(dǎo)致其未準(zhǔn)備好時(shí),整個(gè)系統(tǒng)的任務(wù)都將暫停執(zhí)行,直到FIFO恢復(fù)正常才可繼續(xù)執(zhí)行。
系統(tǒng)采用Xilinx的SUME開(kāi)發(fā)板作為實(shí)現(xiàn)平臺(tái)。FPGA采用Vertex7系列的XC7VX690TFFG1761。在Xilinx的VIVADO集成開(kāi)發(fā)環(huán)境中,根據(jù)以上硬件設(shè)計(jì)方法,采用VerilogHDL建模實(shí)現(xiàn)系統(tǒng)功能。編寫(xiě)用戶模塊產(chǎn)生數(shù)據(jù)和控制信息源,通過(guò)綜合布局、布線生成比特流文件;然后將比特流文件下載到FPGA板卡上,借助集成在VIVADO中的在線邏輯分析儀工具Debug,實(shí)現(xiàn)對(duì)測(cè)試信號(hào)的抓取分析[8]。
經(jīng)實(shí)際上板測(cè)試,若同時(shí)往port1與port2寫(xiě)入一定長(zhǎng)度的數(shù)據(jù):分析Debug工具抓取到的結(jié)果,基本實(shí)現(xiàn)了同時(shí)向DDR3的port1與port2寫(xiě)入數(shù)據(jù),數(shù)據(jù)和有效信號(hào)都能同時(shí)從用戶接口模塊送入時(shí)分復(fù)用橋接電路。但從抓取DDR3核的寫(xiě)入數(shù)據(jù)端口可以看到,實(shí)際上數(shù)據(jù)是被輪流寫(xiě)入port1與port2的,地址在兩個(gè)接口間輪流切換,直至寫(xiě)完用戶規(guī)定的地址長(zhǎng)度。同樣地,同時(shí)對(duì)寫(xiě)入數(shù)據(jù)進(jìn)行讀取,分別從port1里讀取剛才寫(xiě)入port1的數(shù)據(jù),從port2里讀出剛才寫(xiě)入port2的數(shù)據(jù)。此時(shí)可以看出,雖從總體上是兩個(gè)端口同時(shí)在讀數(shù)據(jù),但實(shí)際放大后是分時(shí)間片讀數(shù)據(jù)。port1和port2接口交替讀取,提高了DDR3實(shí)際使用效率,沒(méi)有閑置狀態(tài)。
為了驗(yàn)證數(shù)據(jù)的正確性,定義了一個(gè)累加數(shù)據(jù)源,同時(shí)向port1與port2寫(xiě)入一定大小的數(shù)據(jù);分別利用Debug工具抓取用戶接口模塊的寫(xiě)入數(shù)據(jù)與DDR3核接口的寫(xiě)入數(shù)據(jù),對(duì)比其是否相同,以確定數(shù)據(jù)是否成功寫(xiě)入。從板級(jí)測(cè)試可以確認(rèn),在按照規(guī)定時(shí)序送入port1與port2的累加數(shù)時(shí),從0開(kāi)始累加,并隨著數(shù)據(jù)有效信號(hào)每次加1,一直寫(xiě)到規(guī)定長(zhǎng)度。因此,從地址對(duì)應(yīng)的數(shù)據(jù)來(lái)看,寫(xiě)入DDR3數(shù)據(jù)驗(yàn)證成功。而在寫(xiě)入數(shù)據(jù)完成之后,port_wr_done信號(hào)拉高,告知用戶已經(jīng)準(zhǔn)備好讀取數(shù)據(jù)。用戶接口此時(shí)送入讀取指令,在port1和port2中同時(shí)讀取剛才寫(xiě)入的數(shù)據(jù)。從Debug的信息來(lái)看,port1與port2能同時(shí)讀取數(shù)據(jù),且數(shù)據(jù)為從0開(kāi)始依次累加,與寫(xiě)入數(shù)據(jù)一致,所以DDR3讀取驗(yàn)證成功。此外,用戶每次下達(dá)任務(wù)時(shí)都能在DDR3的任意地址范圍內(nèi)選擇讀、寫(xiě)數(shù)據(jù)的地址,比如選擇性讀取幾段而非全部數(shù)據(jù),以此來(lái)測(cè)試本設(shè)計(jì)的靈活性。板級(jí)測(cè)試表明,DDR3能按要求靈活選擇寫(xiě)入或讀出地址,各功能可正常使用。
基于Xilinx公司提供的DDR3 IP核控制器MIG,完成了在DDR3上切割為雙獨(dú)立讀寫(xiě)通道的用戶接口。兩套接口互不干擾,能同時(shí)完成讀寫(xiě)操作[9]。設(shè)計(jì)了一種時(shí)分復(fù)用橋接電路,將DDR3 IP核MIG提供的一套控制接口搭建為兩套獨(dú)立的用戶讀寫(xiě)接口,通過(guò)數(shù)據(jù)切換器使兩套用戶讀寫(xiě)接口按時(shí)間片分時(shí)與DDR3控制器接口相連。通過(guò)Virtex-7 XC7V690T板級(jí)測(cè)試,證明了該DDR3雙讀寫(xiě)通道控制器能高速、穩(wěn)定、有效地工作,能滿足用戶同時(shí)進(jìn)行兩套接口的讀寫(xiě)操作;用戶接口操作時(shí)鐘達(dá)到200 MHz,DDR3內(nèi)部數(shù)據(jù)存儲(chǔ)時(shí)鐘達(dá)到800 MHz。此雙通道DDR3緩存器適用于各種需要大量高速緩存數(shù)據(jù)的系統(tǒng)的研發(fā)工作,突破了傳統(tǒng)DDR3僅有一套非獨(dú)立讀寫(xiě)接口的局限,提高了DDR3的靈活性與工作效率。
參考文獻(xiàn):
[1] 唐瑞,姚遠(yuǎn)程,秦明偉.高速圖像模擬源的研究與實(shí)現(xiàn)[J].自動(dòng)化儀表,2017,38(8):40-44.
[2] 嚴(yán)振杰,俞磊,周鵬成.AP1000無(wú)線通信系統(tǒng)電磁兼容性試驗(yàn)設(shè)計(jì)[J].自動(dòng)化儀表,2017,38(2):82-85.
[3] 董旭明,李志斌.計(jì)算機(jī)視覺(jué)在并聯(lián)機(jī)器人運(yùn)動(dòng)學(xué)標(biāo)定中的應(yīng)用[J].自動(dòng)化儀表,2016,37(5):16-19.
[4] WANG B P,DU J S,BI X.High bandwidth memory interface design based on DDR3 SDRAM and FPGA[C]//International Soc Design Conference,Gyeongju,2016.
[5] 高勝.高速采樣數(shù)據(jù)存儲(chǔ)控制器的設(shè)計(jì)與實(shí)現(xiàn)[D].成都:電子科技大學(xué),2016.
[6] ANIL L,SIDDHARTH V,MICHAEL P.A Case Study:Power measurement and optimization of DDR3 DIMM in servers[C]//2015 IEEE Electrical Design of Advanced Packaging and Systems Symposium,Bangalore,2015.
[7] HITESH S,MERVIN J,DAVID S.DDR3 Interconnect optimization-signal integrity and timing analysis perspective[C]//2015 International Conference on Control,Electronics,Renewable Energy and Communications,Bandung,2015.
[8] 畢然.基于DDR3的CMOS高速圖像采集系統(tǒng)的FPGA設(shè)計(jì)與實(shí)現(xiàn)[D].哈爾濱: 哈爾濱理工大學(xué),2015.
[9] JANESKV J,RIZZO N D,HOUSSAMEDDINE D.Device performance in a fully functional 800MHz DDR3 spin torque magnetic random access memory[C]//Memory Workshop (IMW),2015 5th IEEE International,Taipei,2015.