【摘 要】通過(guò)FPGA控制2GB的DDR2內(nèi)存條實(shí)現(xiàn)了1.2GHz的16bits并行數(shù)據(jù)輸出,解決了工程應(yīng)用中速度與容量不能兼容的問(wèn)題。首先,介紹了FPGA與DDR2內(nèi)存條點(diǎn)對(duì)點(diǎn)互聯(lián)時(shí)的阻抗匹配模型,使用Mentor公司的高速電路仿真軟件Hyperlinx對(duì)阻抗匹配模型進(jìn)行布線前和布線后仿真,實(shí)現(xiàn)高速數(shù)字電路板的信號(hào)完整性分析。然后,簡(jiǎn)要介紹了DDR2內(nèi)存條的工作流程,使用Verilog語(yǔ)言完成DDR2內(nèi)存條控制器的代碼編寫,并通過(guò)ModelSim軟件對(duì)DDR2內(nèi)存條控制器的功能進(jìn)行驗(yàn)證。
一、引言
在各種地鐵數(shù)據(jù)通信系統(tǒng)中,對(duì)高速、大容量數(shù)字信號(hào)存儲(chǔ)器的需求越來(lái)越多。DDR2內(nèi)存條憑借其高速、大容量、數(shù)據(jù)更新快等的優(yōu)點(diǎn),得到了廣泛的應(yīng)用。本設(shè)計(jì)應(yīng)用在毫米波段射頻信號(hào)形成器的面元法信號(hào)形成中,面元法信號(hào)形成是通過(guò)對(duì)具有引信工作頻率的連續(xù)波進(jìn)行快速的幅度調(diào)制,從而仿真模擬引信的實(shí)際回波信號(hào)。
基于FPGA實(shí)現(xiàn)DDR2內(nèi)存條的控制,由于DDR2內(nèi)存條的工作頻率高,存儲(chǔ)容量大,傳輸信號(hào)的完整性要求高,導(dǎo)致其印制板設(shè)計(jì)難度大、控制器程序編寫復(fù)雜等不利于FPGA對(duì)DDR2內(nèi)存條進(jìn)行開發(fā)的因素。本文通過(guò)詳細(xì)介紹FPGA與DDR2內(nèi)存條之間信號(hào)完整性的分析方法,以及驗(yàn)證DDR2內(nèi)存條控制器的正確性的方法,解決了DDR2內(nèi)存條設(shè)計(jì)中的瓶頸問(wèn)題,實(shí)現(xiàn)了DDR2內(nèi)存條在工程中的較好應(yīng)用。
二、FPGA與DDR2內(nèi)存條之間信號(hào)完整性設(shè)計(jì)
本設(shè)計(jì)中使用的FPGA是Altera公司的StratixII系列的芯片,使用的DDR2內(nèi)存條是
市場(chǎng)上通用的內(nèi)存條,容量為2GB。如果使用StratixIII系列更高端的FPGA芯片時(shí),可以使用FPGA內(nèi)部的OCT功能來(lái)省去源端的匹配電阻,DDR2內(nèi)存條可以使用ODT功能來(lái)省去終端匹配電阻,此時(shí)只需要FPGA和DDR2內(nèi)存條直接互聯(lián)。本設(shè)計(jì)中沒有使用這兩種功能,所以不進(jìn)行討論。
(一)布線前FPGA和DDR2內(nèi)存條之間信號(hào)完整性分析
DDR2內(nèi)存條接口信號(hào)滿足JEDEC-standard 1.8V(兼容SSTL_18)標(biāo)準(zhǔn)。首先,我們將 FPGA到DDR2內(nèi)存條的信號(hào)分為三類:?jiǎn)味藛蜗騻鬏敗味穗p向傳輸、差分單向傳輸,他們分別對(duì)用FPGA到DDR2內(nèi)存條之前的地址與控制信號(hào)、數(shù)據(jù)信號(hào)、時(shí)鐘信號(hào)。在FPGA中對(duì)應(yīng)三種信號(hào)的匹配模式為:SSTL_18 ClassI、SSTL_18 ClassII和Differential SSTL_18 Class I。我們?cè)贖yperlinx中設(shè)計(jì)三種阻抗匹配模型如圖1所示,在模型的源端和終端分別調(diào)用器件的ibis模型,設(shè)置仿真參數(shù)包括:源端電阻、終端電阻、傳輸線的長(zhǎng)度,通過(guò)改變仿真參數(shù),對(duì)比傳輸信號(hào)的完整性。
其中,要保證單端信號(hào)線的阻抗為50-60Ω±10%;差分信號(hào)線的阻抗為100Ω±10%,傳輸線的阻抗同樣可以在Hyperlinx中進(jìn)行仿真。首先,固定傳輸線的線寬,通過(guò)設(shè)計(jì)傳輸線的厚度,銅層的分布,板層之間的介質(zhì)厚度和介質(zhì)常數(shù)來(lái)實(shí)現(xiàn)單端傳輸線阻抗為50-60Ω±10%,通過(guò)設(shè)計(jì)差分傳輸線的間距來(lái)實(shí)現(xiàn)阻抗為100Ω±10%。傳輸線的阻抗確定后,只有傳輸線的長(zhǎng)度和驅(qū)動(dòng)電流兩個(gè)可以改變的參數(shù)。在阻抗匹配電路中,要求源端電阻距離FPGA輸出端小于3cm,終端電阻距離DDR2內(nèi)存條的距離小于2cm。根據(jù)實(shí)際印制板布局布線的考慮,我們都采用2cm。此時(shí),通過(guò)改變傳輸線的長(zhǎng)度和驅(qū)動(dòng)電流的強(qiáng)度,來(lái)驗(yàn)證信號(hào)完整性隨這兩個(gè)參數(shù)的變化。設(shè)計(jì)中為了保證傳輸線能夠滿足400Mhz信號(hào)的傳輸,我們采用最小脈寬為1.25ns的隨機(jī)脈沖信號(hào)作為激勵(lì)信號(hào),通過(guò)觀察接收端的眼圖來(lái)檢驗(yàn)信號(hào)傳輸?shù)耐暾?。在三種模型中,模型二最具有代表性,因此,本文中只分析模型二,其他模型分析方法類似。
此種模式下傳輸?shù)男盘?hào)是DDR2內(nèi)存條的數(shù)據(jù)信號(hào)。當(dāng)輸出驅(qū)動(dòng)為16mA,傳輸線的長(zhǎng)度由20cm遞增到80cm,DDR2內(nèi)存條接收端的眼圖如圖4所示。其中,橫坐標(biāo)為500ps,縱坐標(biāo)為1V。表1為4個(gè)眼圖的測(cè)量值。為了保證能夠正確接收信號(hào)和設(shè)計(jì)的冗余,我們要求眼圖的高度大于700mV,在80cm的傳輸距離內(nèi)都能夠滿足要求。
當(dāng)傳輸線的長(zhǎng)度固定為40cm,驅(qū)動(dòng)電流分別為4mA、8mA、16mA、20mA時(shí)接收端眼圖如下圖5所示,其中,橫坐標(biāo)為500ps,縱坐標(biāo)為1V,表2 為4個(gè)眼圖的測(cè)量值。此時(shí),16mA、20mA都能可靠的滿足眼圖高度大于700mV的要求。
上述過(guò)程為數(shù)據(jù)由FPGA傳輸?shù)紻DR2內(nèi)存條時(shí)的情況,當(dāng)由DDR2內(nèi)存條輸出到FPGA輸入端時(shí),DDR2內(nèi)存條的輸出驅(qū)動(dòng)電流可以設(shè)置成為正常和減弱,減弱時(shí)的驅(qū)動(dòng)電流僅為正常時(shí)的45~60%。由于DDR2的正常驅(qū)動(dòng)電流為13.4mA,減弱的電流強(qiáng)度為6~8mA。為了保證FPGA可靠接收,我們采用正常的驅(qū)動(dòng)電流。可以通過(guò)上面的方法分析數(shù)據(jù)由DDR2內(nèi)存條到FPGA接收端的眼圖,檢驗(yàn)信號(hào)的完整性。
在三種傳輸模式下,隨著傳輸線的距離的增加,眼圖的高度都是逐漸變小。所以,在能夠滿足布線的條件下我們將三類傳輸模式下傳輸線設(shè)計(jì)成等長(zhǎng)的15cm。單端的兩種阻抗模型在16mA的時(shí)候信號(hào)眼圖的高度比較理想,同時(shí)過(guò)沖和功耗都比較小。差分的阻抗模型在8mA的綜合上述因素眼圖最理想。
(二)布線后仿真
布線后將印制板導(dǎo)入到Hyperlinx中,通過(guò)加載器件的ibis模型,設(shè)置終端電阻和源端電阻后,選擇三類信號(hào)分別仿真。圖4為布線后在Hyperlinx中單端單向傳輸、單端雙向傳輸、差分單向傳輸?shù)姆抡嫜蹐D,其中,橫坐標(biāo)為500ps,縱坐標(biāo)為1
與布線前的仿真結(jié)果相比,眼圖寬度、眼圖高度沒有多大變化,只是信號(hào)的過(guò)沖偏大,
這與傳輸線之間的串?dāng)_,以及布線后和布線前的傳輸線的阻抗有偏差導(dǎo)致的。
三、DDR2內(nèi)存條控制器的設(shè)計(jì)
DDR2內(nèi)存條控制器的實(shí)現(xiàn)可以采用DDR2 SDRAM控制器IPcore實(shí)現(xiàn)較高效率的控制,此時(shí),在FPGA中的布局布線都是最優(yōu)的,在StratixII系列的FPGA中對(duì)DDR2內(nèi)存條控制的時(shí)鐘最高可以達(dá)到267MHz。而在不使用DDR2 SDRAM控制器Ipcore的時(shí)候執(zhí)行的效率就沒有那么高,此時(shí),最高時(shí)鐘一般都在166Mhz以下。由于內(nèi)存條在讀寫操作的時(shí)候需要刷新操作,所以不能100%的時(shí)鐘速度進(jìn)行讀寫。通過(guò)計(jì)算可以得出平均最高的讀寫速度為最高時(shí)鐘速度的95%左右。根據(jù)設(shè)計(jì)本身的要求,我們采用166Mhz的時(shí)鐘進(jìn)行存儲(chǔ)就夠達(dá)到設(shè)計(jì)的要求??紤]到設(shè)計(jì)的成本,我們采用自己設(shè)計(jì)編寫的DDR2 SDRAM控制器。
(一)DDR2內(nèi)存條控制流程
DDR2內(nèi)存條的工作流程如下圖7所示。首先,DDR2內(nèi)存條電源供電需要特定的順序,我們使用TPS51116開關(guān)電源通過(guò)控制S3/S5來(lái)控制加電的順序。初始化需要按照固定的時(shí)序進(jìn)行,來(lái)保證內(nèi)存條工作狀態(tài)正常。進(jìn)入 IDLE空閑狀態(tài)時(shí)我們可以進(jìn)行讀寫和刷新操作,刷新操作需要在64ms內(nèi)進(jìn)行8192次刷新指令,確保對(duì)所有的行刷新一次,這樣平均7.8us刷新一次。但是由于刷新請(qǐng)求的時(shí)候,內(nèi)存條的工作狀態(tài)可能停留在讀寫操作中,此時(shí),需要等待內(nèi)存條的讀寫完成后回到IDLE狀態(tài),然后再響應(yīng)刷新請(qǐng)求。在166Mhz時(shí)鐘下,讀寫操作周期的最大值為一行進(jìn)行連續(xù)的讀操作,此過(guò)程小于7.8us。因此,不會(huì)因?yàn)榈却x寫過(guò)程而導(dǎo)致刷次數(shù)變少。我們可以采用小于7.8us的時(shí)間來(lái)請(qǐng)求刷新一次,這樣就可以保證刷新的可靠性。
圖7 DDR2內(nèi)存條工作流程
為了保證最大效率的傳輸,我們采用連續(xù)讀模式,此時(shí),RL=3,BL=4如圖8所示。首先執(zhí)行active指令,同時(shí)地址選擇相應(yīng)的bank和行地址,等待tRCD的時(shí)間,然后可以進(jìn)入讀指令操作,每一次讀出一行1024個(gè)數(shù)據(jù),需要連續(xù)讀操作256次,每次讀出4個(gè)數(shù)據(jù)。此時(shí),數(shù)據(jù)實(shí)現(xiàn)連續(xù)讀的速度為時(shí)鐘速度的兩倍。當(dāng)讀完這一行指令后執(zhí)行precharge指令關(guān)閉這一行后回到空閑狀態(tài)。在IDLE狀態(tài)中刷新指令的優(yōu)先級(jí)最高,所以,回到IDLE狀態(tài)后要檢查是否有刷新請(qǐng)求,如果有刷新請(qǐng)求,狀態(tài)機(jī)跳轉(zhuǎn)到Auto refresh狀態(tài)中,執(zhí)行刷新指令后再跳轉(zhuǎn)回IDLE狀態(tài),可以繼續(xù)重復(fù)上述步驟,這樣就可以保證最高效率的輸出。
圖8連續(xù)讀操作的時(shí)序
(二)DDR2內(nèi)存條控制器的設(shè)計(jì)方法
DDR2內(nèi)存條控制器的模塊如圖9所示。通過(guò)使用FPGA內(nèi)部的DLL產(chǎn)生所需要的DDR2內(nèi)存條的3對(duì)差分時(shí)鐘,由于三對(duì)差分時(shí)鐘線長(zhǎng)度相等,所以到達(dá)DDR2內(nèi)存條的相位一致的。DLL輸出的clk為內(nèi)部系統(tǒng)時(shí)鐘,產(chǎn)生DDR2的內(nèi)存條的地、址控制信號(hào),通過(guò)對(duì)相位的調(diào)整,使3對(duì)差分時(shí)鐘信號(hào)與地址、控制信號(hào)滿足時(shí)序要求。clk-90°相對(duì)比clk相位提前90°,速度一致;clkx2與clk同相,速度為clk的2倍,觸發(fā)圖中的數(shù)據(jù)模塊,產(chǎn)生DQ[63:0]、DQS[7:0]、DM[7:0]信號(hào),以及采樣由DD2內(nèi)存條讀入的數(shù)據(jù)。
首先,數(shù)據(jù)為異步的16bits數(shù)據(jù),我們通過(guò)數(shù)據(jù)接收模塊準(zhǔn)確可靠的采樣下來(lái)16位的數(shù)據(jù),然后緩存到FIFO1中,由于外來(lái)的異步數(shù)據(jù)速度相對(duì)于內(nèi)部工作頻率較低,我們需要對(duì)數(shù)據(jù)進(jìn)行緩存處理。由于DDR2內(nèi)存條工作在BL=4的模式下,每一次寫操作都會(huì)寫入64bits×4的數(shù)據(jù)量,所以,在FIFO1中我們緩存16個(gè)數(shù)據(jù)后由數(shù)據(jù)位合并模塊將數(shù)據(jù)合并為一個(gè)256位的數(shù)據(jù),然后再緩存到FIFO2中,通過(guò)控制模塊查詢FIFO 2的狀態(tài),只要發(fā)現(xiàn)FIFO 2中有數(shù)據(jù)我們就可以將數(shù)據(jù)由FIFO 2中讀出,寫到DDR2內(nèi)存條中,然后繼續(xù)判斷FIFO 2的狀態(tài)。當(dāng)內(nèi)存條的工作時(shí)鐘為166MHz時(shí),寫操作一次需要20個(gè)時(shí)鐘時(shí),此時(shí),寫入數(shù)據(jù)的速度小于133Mhz時(shí),可以滿足大部分的接口傳輸。
圖 9 DDR2內(nèi)存條控制器的設(shè)計(jì)模塊
將數(shù)據(jù)由DDR2內(nèi)存條讀出的時(shí)候,由于讀操作是對(duì)DDR2內(nèi)存條的一整行進(jìn)行操作,所以,需要將FIFO3的容量開的大一些,保證FIFO3的容量的一半大于一行的數(shù)據(jù)量。通過(guò)判斷FIFO3的半滿標(biāo)志來(lái)決定是否繼續(xù)進(jìn)行讀操作,如果FIFO3已經(jīng)半滿了,則不需要再進(jìn)行讀操作,否則數(shù)據(jù)將會(huì)有丟失的可能,如果FIFO 3沒有半滿則可以繼續(xù)讀操作。在DDR2內(nèi)存條的工作時(shí)鐘為166MHz時(shí),假設(shè)讀一行數(shù)據(jù)需要1個(gè)active操作,256個(gè)讀操作, 1個(gè)percharge操作,1個(gè)auto refresh操作,需要的時(shí)間為3.2us。此時(shí),能夠保證最高300Mhz的64位輸出。通過(guò)數(shù)據(jù)拆位和FIFO4的緩存后,可以保證1.2GHz的16位連續(xù)輸出。
(三)DDR2內(nèi)存條控制器的驗(yàn)證
針對(duì)上述的工作流程我們可以編寫測(cè)試程序?qū)DR2內(nèi)存條控制器的功能進(jìn)行驗(yàn)證,為了驗(yàn)證對(duì)DDR2內(nèi)存條的控制是否正確,我們可以使用DDR2內(nèi)存條廠商提供的Verilog模型。將測(cè)試程序和DDR2內(nèi)存條Verilog模型加載到Moldsim軟件中進(jìn)行仿真,輸出仿真過(guò)程的提示信息如下圖10所示。
圖10 Moldsim軟件中的仿真輸出
四、總結(jié)
在設(shè)計(jì)過(guò)程過(guò),我們可以按照DDR2 SDRAM控制器Ipcore的設(shè)置引腳分配進(jìn)行布線,這樣我們可以兼容兩種狀態(tài)。在速度要求不高而且沒有DDR2 SDRAM控制器Ipcore的情況下,我們可以使用上述方法實(shí)現(xiàn)DDR2內(nèi)存條的控制,當(dāng)速度滿足不了系統(tǒng)的要求是我們可以通過(guò)ALTERA公司購(gòu)買DDR2 SDRAM控制器Ipcore,來(lái)實(shí)現(xiàn)更高速的系統(tǒng)。