王維平,張正炳,賀東芹 (長(zhǎng)江大學(xué)電子信息學(xué)院,湖北荊州434023)
DDR SDRAM(Double Data Rate Synchronous Dynamic Random Access Memory,雙倍速率隨機(jī)存儲(chǔ)器)采用2.5V的工作電壓,在核心時(shí)鐘的上升沿和下降沿傳輸數(shù)據(jù),具有比SDR(single data rate)SDRAM多一倍的傳輸速率的優(yōu)點(diǎn)。FPGA(Field-Programmable Gate Array)是一種可編程器件,在FPGA上可以實(shí)現(xiàn)任意數(shù)字電路功能。在電子通訊領(lǐng)域,數(shù)據(jù)量越來(lái)越大,對(duì)存儲(chǔ)器的需求也越來(lái)越大;FPGA具有并行性、可編程等優(yōu)點(diǎn),它的應(yīng)用場(chǎng)合也越來(lái)越廣,在FPGA板卡上嵌入SDRAM已經(jīng)應(yīng)用在很多系統(tǒng)中,因此研究在FPGA平臺(tái)上來(lái)實(shí)現(xiàn)DDR讀寫(xiě)控制的方法具有重要的實(shí)際意義。下面,筆者在分析DDRSDRAM基本操作特性的基礎(chǔ)上,根據(jù)DDR的時(shí)序要求,提出了一種基于VerilogHDL語(yǔ)言的控制器實(shí)現(xiàn)方案。
筆者采用的DDR具有4個(gè)BANK(就是被分為4個(gè)塊)、15根地址總線、16根數(shù)據(jù)總線 (DQ15~DQ0)、2根數(shù)據(jù)捕獲探針 (DQS,雙向信號(hào)線)、2根寫(xiě)掩碼信號(hào) (DM1~DM0,可一直設(shè)置為0)、1對(duì)相位相反的主控時(shí)鐘線 (CLK_P,CLK_N)、1根時(shí)鐘使能信號(hào) (CKE)、4根命令信號(hào)線:CS_N(片選信號(hào)),RAS_N(行地址使能信號(hào)),CAS_N(列地址使能信號(hào))和WE_N(寫(xiě)使能信號(hào))。
DDR的指令與SDR的指令基本一致,主要由CS_N,RAS_N,CAS_N和WE_N 4個(gè)信號(hào)控制,真值表如表1所示。命令是在主時(shí)鐘的上升沿捕獲。
表1 DDR的基本指令真值表
1)CL CAS latency,列地址有效到讀出數(shù)據(jù)的延時(shí),是在讀數(shù)據(jù)時(shí)讀命令到數(shù)據(jù)輸出的時(shí)間長(zhǎng)度,它由廠商確定,主要有2,2.5,3(時(shí)鐘周期個(gè)數(shù))3個(gè)數(shù)值,可以通過(guò)寄存器配置。
2)tRCD RAS to CAS latency,行地址 (ACT命令)有效到列地址有效的最小延時(shí),不可配置。
3)tRAS 行有效 (ACT命令)到預(yù)充電命令的最小時(shí)延。
4)tRP 預(yù)充電命令到行有效的最小時(shí)延。
DDR的讀寫(xiě)數(shù)據(jù)是在DQS信號(hào)下捕捉的,數(shù)據(jù)的位數(shù)決定了DQS的位數(shù),一位DQS信號(hào)負(fù)責(zé)捕捉8位數(shù)據(jù)信號(hào)。寫(xiě)操作時(shí),DQS在數(shù)據(jù)信號(hào)DQ的中心捕獲數(shù)據(jù);讀操作時(shí),DQS在數(shù)據(jù)信號(hào)的邊沿捕獲數(shù)據(jù)。在數(shù)據(jù)讀寫(xiě)之前,需要先進(jìn)行行有效操作,即ACT命令,然后經(jīng)過(guò)tRCD的時(shí)間,執(zhí)行讀或?qū)懖僮髅?。在讀操作中,讀命令后還要經(jīng)過(guò)CL(CAS latency)時(shí)間才開(kāi)始讀取數(shù)據(jù)。
筆者設(shè)計(jì)的DDR控制器主要有3個(gè)模塊,分別是狀態(tài)轉(zhuǎn)換控制模塊、指令譯碼模塊和時(shí)鐘模塊,如圖1所示??刂破鞯挠脩艨刂菩盘?hào)有CMD(用戶發(fā)送的指令)與ADDR(用戶地址)、DATAIN(DDR的輸入數(shù)據(jù))和DATAOUT(DDR的輸出數(shù)據(jù))。時(shí)鐘模塊提供DDR主時(shí)鐘和控制器系統(tǒng)內(nèi)部的數(shù)據(jù)時(shí)鐘 (CLK_X2)。在使用時(shí),用戶首先發(fā)送1個(gè)CMD到狀態(tài)轉(zhuǎn)換模塊進(jìn)行狀態(tài)轉(zhuǎn)換,然后控制器返回1個(gè)CMDACK響應(yīng)用戶,在第2個(gè)時(shí)鐘周期將這個(gè)命令狀態(tài)標(biāo)志輸入到指令譯碼模塊進(jìn)行指令譯碼,控制指令信號(hào),完成相應(yīng)的操作。伴隨著狀態(tài)的轉(zhuǎn)換,相應(yīng)的地址信號(hào)也鎖存進(jìn) DDR。REF_CLK與RESET_N是系統(tǒng)時(shí)鐘和全局復(fù)位信號(hào),除了這2個(gè)信號(hào)與前述的用戶控制信號(hào)外,圖1中剩下的接口信號(hào)就是DDR的接口信號(hào)了。
圖1 DDR控制器框圖
圖2是各種操作的狀態(tài)轉(zhuǎn)化圖,是指指令之間轉(zhuǎn)換的可能操作。
圖2 DDR狀態(tài)轉(zhuǎn)換圖
根據(jù)DDR的時(shí)序要求,一共采用了3個(gè)時(shí)鐘,分別是DDR的1對(duì)反相時(shí)鐘 (DDR_CLK_P,DDR_CLK_N)和數(shù)據(jù)控制時(shí)鐘(CLK_X2,由時(shí)鐘模塊產(chǎn)生)。根據(jù)DDR的要求,指令信號(hào)要在DDR_CLK_P的上升沿采樣,所以采用其反相時(shí)鐘信號(hào)DDR_CLK_N來(lái)同步命令邏輯,使DDR_CLK_P的上升沿恰好在命令的中心。根據(jù)DDR讀寫(xiě)數(shù)據(jù)的要求,采用了1個(gè)DDR系統(tǒng)時(shí)鐘頻率2倍的數(shù)據(jù)時(shí)鐘,用來(lái)處理讀寫(xiě)數(shù)據(jù)。時(shí)序參見(jiàn)圖3和圖4。
DQS是雙向信號(hào),在讀數(shù)據(jù)時(shí)由DDR本身產(chǎn)生,在寫(xiě)數(shù)據(jù)時(shí)需要控制器來(lái)產(chǎn)生。因?yàn)樵贒DR中DQS與其系統(tǒng)時(shí)鐘保持一致,只不過(guò)是有個(gè)偏差范圍,所以采用DDR_CLK_P的開(kāi)關(guān)時(shí)鐘作為DQS信號(hào),寫(xiě)操作中產(chǎn)生DQS信號(hào) (數(shù)據(jù)位寬為16,DQS位寬則為2)的Verilog代碼:
DDR的控制器主要有讀、寫(xiě)、預(yù)充電、刷新、配置模式寄存器等操作,如圖2所示。DDR在工作時(shí)主要分為2個(gè)階段:上電初始化和讀寫(xiě)過(guò)程。初始化很重要,主要完成時(shí)鐘穩(wěn)定與寄存器配置的過(guò)程,它是一些指令的順序執(zhí)行過(guò)程。筆者采用的DDR是Hynix公司的產(chǎn)品。不同廠家的DDR初始化過(guò)程不盡相同,其寄存器配置的參數(shù)可能也不同,為了提高控制器的通用性,可以在控制器外來(lái)配置初始化操作。因?yàn)镈DR的地址線是有限的,讀寫(xiě)的時(shí)候是采用時(shí)分復(fù)用技術(shù)來(lái)實(shí)現(xiàn)完全的尋址過(guò)程的。DDR的地址線有15根,其中2根是BANK地址 (BA1~BA0),剩下的是行列地址 (13根,A12~A0),其中行地址為A12~A0,列地址為A8~A0,行地址與列地址分時(shí)復(fù)用,這樣等效尋址線就是24根 (2+13+9),尋址空間正好是16M。在初始化完成以后就可以進(jìn)行讀寫(xiě)了,按照DDR的時(shí)序要求,先進(jìn)行行鎖定 (ACT命令),然后經(jīng)過(guò)tRCD的時(shí)間,再執(zhí)行讀/寫(xiě)操作,同時(shí)鎖定列地址。圖3和圖4分別是在Modelsim仿真中的寫(xiě)、讀時(shí)序圖,突發(fā)長(zhǎng)度為8(一次讀/寫(xiě)8個(gè)數(shù)據(jù)),CL為3,tRCD時(shí)間大約為3個(gè)時(shí)鐘周期;在ACT命令周期 (CS_N=0,RAS_N=0,CAS_N=1,WE_N=1),鎖定行地址,即將圖中的SA=0000H賦給A12~A0地址線;經(jīng)過(guò)tRCD時(shí)間執(zhí)行讀/寫(xiě)命令,注意在讀寫(xiě)命令時(shí),列地址SA=0425H,實(shí)際上此時(shí)的列地址是0025H,只不過(guò)此時(shí)讀寫(xiě)方式是帶預(yù)充電的讀寫(xiě)方式 (A10=1,加上A8~A0=0025H,所以整個(gè)SA=0425H)。如圖3所示,DQ是在CLK_X2時(shí)鐘下產(chǎn)生的,正好在DQS的邊沿鎖存。在讀數(shù)據(jù)時(shí)DQ與DQS是邊沿對(duì)齊;如圖4所示,數(shù)據(jù)時(shí)鐘(CLK_X2)的上升沿正好在數(shù)據(jù)的中心,符合DDR時(shí)序要求。
圖3 寫(xiě)時(shí)序仿真結(jié)果
圖4 讀時(shí)序仿真結(jié)果
DDR需要定時(shí)刷新指令與預(yù)充電指令,所以合理地處理這2個(gè)指令可以有效地提高讀寫(xiě)的效率。刷新是周期性操作,預(yù)充電是在地址換行時(shí)需要執(zhí)行的操作,所以提高效率的主要方法就是合理的安排預(yù)充電命令。讀寫(xiě)操作有2種方式:一種是帶預(yù)充電的讀寫(xiě),一種是普通的讀寫(xiě)。在采用普通讀寫(xiě)時(shí)需要在地址換行的時(shí)候用預(yù)充電命令來(lái)重新進(jìn)行行使能。2種讀寫(xiě)方式在指令上的區(qū)別就是:帶預(yù)充電的讀寫(xiě)命令在ACT命令 (此時(shí),地址輸入為DDR的行地址)時(shí),將A10置高;而普通讀寫(xiě)不需要將A10置高。
DDR的數(shù)據(jù)突發(fā)模式只有2、4、8三種,尋址一個(gè)完整地址都要進(jìn)行ACT到 READ/WRITE的過(guò)程,如果讀寫(xiě)數(shù)據(jù)在一個(gè)行時(shí)可以省去后續(xù)數(shù)據(jù)讀寫(xiě)的ACT過(guò)程。筆者采用了突發(fā)為2的DDR讀寫(xiě)方式,只在第一組數(shù)據(jù)時(shí)執(zhí)行一個(gè)ACT命令,它可以實(shí)現(xiàn)一個(gè)行內(nèi)的任意偶數(shù)個(gè)數(shù)據(jù)的連續(xù)讀寫(xiě)。例如視頻領(lǐng)域經(jīng)常對(duì)一幀圖像數(shù)據(jù)進(jìn)行處理 (如去隔行處理[1]),存儲(chǔ)器就可以連續(xù)的處理大批量的數(shù)據(jù),時(shí)鐘效率是比較高的。
當(dāng)數(shù)據(jù)地址隨機(jī)且經(jīng)??缭揭恍械刂窌r(shí),如果還是采用普通讀寫(xiě)方式的話,需要經(jīng)常在行地址變化時(shí)執(zhí)行預(yù)充電命令,就會(huì)導(dǎo)致讀寫(xiě)的效率下降。例如在視頻編碼中,預(yù)測(cè)編碼是去冗余的最有效方法,預(yù)測(cè)就需要圖像幀區(qū)域搜索[2],這時(shí)在存儲(chǔ)器中表現(xiàn)為數(shù)據(jù)地址的隨機(jī)性。這種情況下可以采用帶預(yù)充電的讀寫(xiě)命令,這樣每個(gè)指令中都會(huì)進(jìn)行預(yù)充電,就不必?fù)?dān)心在地址換行的時(shí)候發(fā)生錯(cuò)誤了。但是,每個(gè)指令之間必須有一定的間隔 (突發(fā)長(zhǎng)度/2+tRP),例如采用突發(fā)為8的讀寫(xiě)時(shí),每個(gè)指令之間的間隔就要最少有4+tRP個(gè)周期,所以設(shè)置突發(fā)模式為8時(shí)效率比較高。
在硬件調(diào)試前,軟件仿真是非常重要的,一般在仿真中時(shí)序吻合的情況下是可以實(shí)現(xiàn)既定功能要求的,在FPGA設(shè)計(jì)尤其是高速設(shè)計(jì)中,調(diào)試前的時(shí)序分析與時(shí)序收斂至關(guān)重要,只有滿足了時(shí)序收斂,設(shè)計(jì)才具有穩(wěn)定性。筆者在代碼綜合階段采用了FPGA常用方法提高了設(shè)計(jì)的速度,比如增加流水線級(jí)數(shù)與消除亞穩(wěn)態(tài)的方式[3],使CLK_X2達(dá)到333M,DDR時(shí)鐘167M,還有時(shí)序余量,滿足時(shí)序要求。
ALTERA提供一個(gè)集成于QUART USII軟件中的FPGA片上debug工具:SignaltapII,它可以捕獲和顯示實(shí)時(shí)信號(hào),觀察在系統(tǒng)設(shè)計(jì)中的硬件和軟件之間的互相作用。它的原理就是設(shè)定采樣周期,實(shí)時(shí)采樣數(shù)據(jù)并存儲(chǔ)到PFGA內(nèi)RAM中,然后通過(guò)JTAG接口傳送到QUARTUSII來(lái)顯示。正是因?yàn)镾ignaltapII的實(shí)時(shí)性,在調(diào)試時(shí)需要注意讀寫(xiě)驗(yàn)證的方法。初始化的配置過(guò)程很難觀察到,只能驗(yàn)證后面的讀寫(xiě)過(guò)程。因?yàn)镽AM的容量有限,一次捕捉到的數(shù)據(jù)也是有限的,在板級(jí)調(diào)試時(shí),需要以循環(huán)的方式進(jìn)行讀寫(xiě)數(shù)據(jù)指令的執(zhí)行,以便在邏輯分析儀中捕捉到數(shù)據(jù)。筆者采用先將數(shù)據(jù)寫(xiě)入一段地址中,然后在相同的地址中讀出來(lái),并且比較相同地址寫(xiě)入數(shù)據(jù)與讀出數(shù)據(jù)是否相同的方法來(lái)驗(yàn)證DDR控制器是否正常工作。為了保證讀寫(xiě)的可靠性,循環(huán)的方式采用遍歷所有地址范圍的方法,觀察結(jié)果發(fā)現(xiàn)寫(xiě)入與讀出的數(shù)據(jù)是完全吻合的。如圖5、圖6所示,寫(xiě)入數(shù)據(jù)與讀出數(shù)據(jù)一致。
圖5 SignaltapII捕獲的寫(xiě)入數(shù)據(jù)時(shí)序圖
圖6 SignaltapII捕獲的讀出數(shù)據(jù)時(shí)序圖
通過(guò)對(duì)DDR時(shí)序的分析,給出了一種DDR控制器的設(shè)計(jì)方案。并且針對(duì)不同的尋址方式,給出了不同的讀寫(xiě)方法,提高了讀寫(xiě)效率。最終,控制器在ALTERA公司的cycloneIII系列芯片上實(shí)現(xiàn),在板卡上能夠控制Hynix公司的DDR芯片穩(wěn)定地讀寫(xiě)數(shù)據(jù)。存儲(chǔ)器工作頻率達(dá)到167M,數(shù)據(jù)穩(wěn)定可靠,讀寫(xiě)效率較高。
[1]余兆明,査日勇,黃磊,等.圖像編碼標(biāo)準(zhǔn)H.264技術(shù) [M].北京:人民郵電出版社,2005.
[2]畢厚杰.新一代視頻壓縮編碼標(biāo)準(zhǔn)——H.264/AVC[M].北京:人民郵電出版社,2005.
[3]Kilts S.高級(jí)FPGA設(shè)計(jì)結(jié)構(gòu)、實(shí)現(xiàn)和優(yōu)化 [M].孟憲元譯.北京:機(jī)械工業(yè)出版社,2009.