《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 模擬設(shè)計(jì) > 設(shè)計(jì)應(yīng)用 > 通用DDR SDRAM控制器的設(shè)計(jì)
通用DDR SDRAM控制器的設(shè)計(jì)
劉 瑰 朱鴻宇
摘要: 通用DDR SDRAM控制器的設(shè)計(jì)方法,以及一種解決DDR SDRAM所特有讀寫(xiě)方式難于控制的問(wèn)題的方法,。
Abstract:
Key words :

  摘  要: 通用DDR SDRAM控制器的設(shè)計(jì)方法,,以及一種解決DDR SDRAM所特有讀寫(xiě)方式難于控制的問(wèn)題的方法。
  關(guān)鍵詞: 雙數(shù)據(jù)率SDRAM  數(shù)字鎖相環(huán)  預(yù)充電  突發(fā)讀寫(xiě)

   SDRAM是具有同步接口的高速動(dòng)態(tài)隨機(jī)訪問(wèn)存儲(chǔ)器,。它由于具有大容量、讀寫(xiě)速度較快、支持突發(fā)式讀寫(xiě)及價(jià)格低廉而得到了廣泛的應(yīng)用,。但是近幾年來(lái),市面上出現(xiàn)了一種從SDRAM技術(shù)發(fā)展而來(lái)的DDR(Double Data Rate)SDRAM新型存儲(chǔ)器。該存儲(chǔ)器除了具有SDRAM的所有優(yōu)點(diǎn)外,,還由于采用了雙時(shí)鐘差分信號(hào)等技術(shù),,使其在時(shí)鐘觸發(fā)沿的上、下沿都能進(jìn)行數(shù)據(jù)傳輸(傳輸速率是普通SDRAM的2倍),,且在價(jià)格上也低于SDRAM,。在需要大容量存儲(chǔ)器的系統(tǒng)中,如臺(tái)式機(jī),、工作站,、服務(wù)器、高性能圖形適配器等選用DDR SDRAM將是一種很好的選擇,。但是DDR SDRAM的控制時(shí)序比較復(fù)雜,,要想和MCU、DSP等控制器芯片接口就必須利用可編程門(mén)陣列(如FPGA)設(shè)計(jì)一個(gè)DDR SDRAM控制器,。但由于它在時(shí)鐘的上升沿和下降沿均能讀取數(shù)據(jù),,這就使得DDR SDRAM控制器較普通的SDRAM控制器更難于設(shè)計(jì)。為此,,本文給出了一種通用DDR SDRAM控制器的一般設(shè)計(jì)方法,,并利用數(shù)字鎖相環(huán)技術(shù)解決了DDR SDRAM特有的讀寫(xiě)方式難于控制的問(wèn)題。
1  DDR SDRAM的基本操作和命令
    掌握DDR SDRAM(以下簡(jiǎn)稱(chēng)DDR)的操作是成功設(shè)計(jì)一個(gè)DDR SDRAM控制器的前提條件,。下面是一般的DDR所具備的操作,。
  DDR支持的常用命令有:空操作(Nop)、激活操作(Active),、突發(fā)讀(Burst Read),、突發(fā)寫(xiě)(Burst Write)、自動(dòng)刷新(Autorefresh),、預(yù)充電(Precharge),、模式寄存器配置(Mode Register Set)等。所有的操作命令都通過(guò)信號(hào)線RAS_N,、CAS_N,、WE_N共同控制。其基本操作命令如表1所示,。

 

 


  在進(jìn)行讀,、寫(xiě)操作之前必須激活DDR存儲(chǔ)體。一旦一個(gè)存儲(chǔ)體被激活,,它就必須在此存儲(chǔ)體的下一個(gè)激活命令發(fā)出之前進(jìn)行預(yù)充電,。當(dāng)對(duì)一個(gè)存儲(chǔ)體讀或?qū)懺L問(wèn)后,如果下一次要訪問(wèn)的行和當(dāng)前訪問(wèn)的行不是同一行,,則需要結(jié)束當(dāng)前的存儲(chǔ)體并重新打開(kāi)它,。預(yù)充電就是用來(lái)結(jié)束已激活的存儲(chǔ)體的,。
  訪問(wèn)DDR的基本命令是讀和寫(xiě)操作。當(dāng)讀命令發(fā)出時(shí),,地址總線上出現(xiàn)的就是要讀的起始地址,,1~3個(gè)時(shí)鐘周期后要讀的數(shù)據(jù)將會(huì)出現(xiàn)在數(shù)據(jù)總線上;當(dāng)寫(xiě)命令發(fā)出時(shí),,起始地址和數(shù)據(jù)就分別出現(xiàn)在地址總線和數(shù)據(jù)總線上,。在做讀操作時(shí),數(shù)據(jù)出現(xiàn)在數(shù)據(jù)總線上的周期數(shù)是由CAS延遲(CAS Latency,,CL)決定的,。CL依賴(lài)于DDR的速度和存儲(chǔ)器時(shí)鐘的頻率。一般而言,,時(shí)鐘頻率越快CL就越大,。在BR或者BW命令初始化后,就會(huì)進(jìn)行突發(fā)讀或突發(fā)寫(xiě),,直到完成當(dāng)前的突發(fā)長(zhǎng)度(Burst length,,BL)或突發(fā)結(jié)束(Burst Terminate,BT)命令發(fā)出才結(jié)束該操作,。DDR存儲(chǔ)器支持突發(fā)的長(zhǎng)度為2,、4或8個(gè)數(shù)據(jù)周期。
  由于DDR是利用電容存儲(chǔ)電荷的原理來(lái)保存信息的,,而電容會(huì)逐漸放電,。因此為了保證每個(gè)存儲(chǔ)單元數(shù)據(jù)的正確性,DDR SDRAM控制器必須周期性地發(fā)出自動(dòng)刷新命令,,用戶(hù)無(wú)需干預(yù),。在自動(dòng)刷新命令發(fā)出之前,所有存儲(chǔ)體都必須經(jīng)過(guò)預(yù)充電并已經(jīng)處于空閑狀態(tài),。一旦刷新開(kāi)始,,由于內(nèi)部有地址計(jì)數(shù)器,所以不需要外部地址的控制,。
  DDR中有模式寄存器,,它的各種操作模式是:CAS延遲、地址模式,、突發(fā)長(zhǎng)度,、突發(fā)類(lèi)型、測(cè)試模式等,。通過(guò)模式寄存器配置(MRS)命令將值寫(xiě)入到模式寄存器中,。
2 DDR SDRAM 控制器的設(shè)計(jì)
2.1 DDR SDRAM控制器簡(jiǎn)介

  本文討論的DDR SDRAM控制器(簡(jiǎn)稱(chēng)DDR控制器)一方與MCU等控制器接口,另一方與DDR接口,。同MCU等控制器的接口主要有地址總線(ADDR),、數(shù)據(jù)總線(DATA),、3位的命令總線(CMD[2:0])以及命令回答(CMDACK)等,。地址總線和數(shù)據(jù)總線的位數(shù)取決于DDR的總線位數(shù),。DDR控制器接收從MCU發(fā)來(lái)的命令及數(shù)據(jù),對(duì)命令進(jìn)行譯碼,,并向DDR發(fā)出相應(yīng)的操作及數(shù)據(jù),。與DDR接口的一方主要是RAS_N、CAS_N,、WE_N等控制信號(hào)線以及數(shù)據(jù)總線DDRDATA,、地址總線DDRADDR等。整個(gè)DDR控制器由3個(gè)模塊構(gòu)成:控制接口模塊,、命令模塊和數(shù)據(jù)通路模塊,。控制接口模塊接收從MCU來(lái)的命令和相關(guān)存儲(chǔ)器地址,,對(duì)命令進(jìn)行譯碼并將請(qǐng)求發(fā)送給命令模塊,;命令模塊接收從控制接口模塊譯碼后的命令和地址,產(chǎn)生相應(yīng)的命令給DDR,;數(shù)據(jù)通路模塊在讀命令READA和寫(xiě)命令WRITEA期間處理數(shù)據(jù)交換,。DDR控制器總框圖如圖1所示。

2.2 DDR控制器的命令
  DDR控制器共完成8種操作:NOP,、READA,、WRITEA、REFRESH,、PRECHARGE,、LOAD_MODE、LOAD_REG1,、LOAD_REG2,,其控制命令如表2所示。


  這8種操作都是由MCU在命令總線CMD[2:0]上向DDR控制器發(fā)出的,,DDR控制器在接收到諸如READA,、WRITEA、REFRESH,、PRECHARGE,、LOAD_MODE等命令時(shí)將會(huì)向MCU發(fā)回答命令CMDACK。當(dāng)MCU收到CMDACK命令后會(huì)在1個(gè)時(shí)鐘周期后向DDR控制器發(fā)NOP命令,。DDR控制器在發(fā)CMDACK命令的同時(shí)也會(huì)向DDR發(fā)相應(yīng)的操作,,也就是將DDR的RAS_N、CAS_N,、WE_N置成相應(yīng)的高位或低位,。如果命令是READA或WRITEA,,則需要重新從數(shù)據(jù)總線上讀出數(shù)據(jù)或?qū)懭霐?shù)據(jù)。各命令的功能如下,。 (1)NOP空操作命令,。在MCU接收到CMDACK命令后,MCU就會(huì)在一個(gè)時(shí)鐘周期后向DDR控制器發(fā)出NOP命令,。
  (2)READA命令是帶有預(yù)充電的突發(fā)讀操作,。MCU向DDR控制器發(fā)出READA命令的同時(shí)在地址總線ADDR上發(fā)出要讀的地址;DDR控制器接收到后將向DDR發(fā)出激活(Active)命令,,并向MCU發(fā)出CMDACK命令,;幾個(gè)時(shí)鐘周期后,要讀的DDR中的突發(fā)數(shù)據(jù)會(huì)由DDR控制器通過(guò)數(shù)據(jù)總線傳送給MCU,。
  (3)WRITEA命令是帶有預(yù)充電的突發(fā)寫(xiě)操作,。其過(guò)程和READA的過(guò)程類(lèi)似,也是在DDR控制器接收到MCU發(fā)出的WRITEA命令期間,,在地址總線ADDR上接收要寫(xiě)入的地址,,然后DDR控制器向DDR發(fā)出激活(Active)命令,并向MCU發(fā)出CMDACK命令,。只是在WRITEA命令有效期間,,要寫(xiě)入DDR的第一個(gè)突發(fā)數(shù)據(jù)就已經(jīng)出現(xiàn)在數(shù)據(jù)總線上了。
   (4)REFRESH命令是DDR控制器指示DDR完成自動(dòng)刷新的命令,。
  (5)PRECHARGE命令是控制器指示DDR完成存儲(chǔ)體預(yù)充電的命令,。
  (6)LOAD_MODE是用來(lái)配置DDR中的模式寄存器的,其值就是在MCU向DDR控制器發(fā)出LOAD_
MODE命令的同時(shí)在ADDR總線上傳送的數(shù)值,。當(dāng)DDR控制器向DDR發(fā)出模式寄存器配置(MRS)命令時(shí),,ADDR總線上的值就會(huì)直接映射到DDR的地址總線上。
  (7)LOAD_REG1和LOAD_REG2是配置DDR控制器內(nèi)部2個(gè)寄存器的命令,。
2.3 DDR控制器的內(nèi)部寄存器
  DDR控制器內(nèi)部有2個(gè)16位的配置寄存器:REG1和REG2,,其值分別由命令LOAD_REG1和LOAD_REG2命令寫(xiě)入。
REG1中包含了CAS延遲CL(REG1[1:0]),、RAS到CAS延遲的時(shí)鐘數(shù)RC(REG[3:2]),、REFERSH命令持續(xù)時(shí)間的時(shí)鐘數(shù)RRD(REG1[7:4])及突發(fā)長(zhǎng)度BL(REG1[12:9])。
  REG2是一個(gè)16位的寄存器,,存儲(chǔ)的是DDR控制器向DDR發(fā)出刷新命令的間隔時(shí)間,。
2.4 各功能模塊設(shè)計(jì)
2.4.1 控制接口模塊
  控制接口模塊包含1個(gè)命令譯碼器和1個(gè)16位的刷新減計(jì)數(shù)器及相應(yīng)的控制電路。命令譯碼器譯碼并寄存從MCU來(lái)的命令,,將譯碼后的NOP,、WRITEA、READA,、REFRESH,、PRECHARGE和LOAD_MODE等命令及相應(yīng)的地址轉(zhuǎn)送給命令模塊,。減計(jì)數(shù)器和相應(yīng)的控制電路用來(lái)產(chǎn)生刷新命令給命令模塊,其值就是由LOAD_REG2命令寫(xiě)入到REG2中的值,。當(dāng)計(jì)數(shù)器減到0時(shí),,控制接口模塊就向命令模塊發(fā)REFRESH_REQ并一直保持到命令模塊發(fā)REFRESH_ACK來(lái)響應(yīng)該請(qǐng)求。一旦控制接口模塊接收到REFRESH_ACK,,減計(jì)數(shù)器就會(huì)重新寫(xiě)入REG2中的值,。
2.4.2 命令模塊
  命令模塊由1個(gè)簡(jiǎn)單的仲裁器,、命令發(fā)生器及命令時(shí)序器組成,。它接收從控制接口模塊來(lái)的譯碼后的命令,接收刷新控制邏輯發(fā)來(lái)的刷新請(qǐng)求命令并產(chǎn)生正確的命令給DDR,。仲裁器在控制接口發(fā)來(lái)的命令(也就是MCU通過(guò)控制接口譯碼后的命令)和刷新控制邏輯發(fā)來(lái)的刷新請(qǐng)求命令之間進(jìn)行仲裁,。刷新請(qǐng)求命令的優(yōu)先級(jí)高于控制接口來(lái)的命令。如果控制接口來(lái)的命令和刷新請(qǐng)求命令同時(shí)到達(dá),,或者同在一個(gè)刷新操作期間,,則仲裁器就會(huì)拖延向MCU發(fā)CMDACK命令的時(shí)間直到刷新操作完成。如果刷新命令正在進(jìn)行操作期間發(fā)出,,則要一直等待到操作全部完成,。
  在仲裁器收到MCU發(fā)來(lái)的命令后,該命令就傳送到命令發(fā)生器,,命令時(shí)序器即用3個(gè)移位寄存器產(chǎn)生正確的命令時(shí)序后發(fā)給DDR,。1個(gè)移位寄存器用來(lái)控制激活命令時(shí)序,1個(gè)用來(lái)控制READA和WRITEA命令,,1個(gè)用來(lái)計(jì)時(shí)操作命令的持續(xù)時(shí)間,,為仲裁器確定最后的請(qǐng)求操作是否完成。
2.4.3 數(shù)據(jù)通路模塊
  數(shù)據(jù)通路模塊提供了DDR到MCU的數(shù)據(jù)通路,。MCU從DDR設(shè)備讀出的數(shù)據(jù)和MCU向DDR設(shè)備寫(xiě)入的數(shù)據(jù)都要經(jīng)過(guò)數(shù)據(jù)通路模塊,。在MCU向DDR控制器發(fā)WRITEA命令時(shí),數(shù)據(jù)總線DATA上要寫(xiě)入DDR的數(shù)據(jù),;在MCU向DDR控制器發(fā)READA命令時(shí),,數(shù)據(jù)總線DATA則從DDR讀出數(shù)據(jù)。
  數(shù)據(jù)通路模塊在和DDR接口的一方完成了2個(gè)轉(zhuǎn)換:一是將DDR過(guò)來(lái)的數(shù)據(jù)總線寬度翻倍,,二是將DDR在時(shí)鐘上,、下沿送出的數(shù)據(jù)用200MHz的時(shí)鐘頻率接收。數(shù)據(jù)通路模塊在和MCU接口的一方也相應(yīng)地做了2個(gè)轉(zhuǎn)換:一是將MCU過(guò)來(lái)的數(shù)據(jù)寬度減半送給DDR,,二是將MCU工作在100MHz頻率下的數(shù)據(jù)以200MHz的頻率送給DDR,。
  DDR送來(lái)的數(shù)據(jù)是在100MHz的時(shí)鐘頻率的上升和下降沿被讀出的,而到了數(shù)據(jù)通路模塊則將時(shí)鐘頻率倍頻到200MHz,,因此只需在時(shí)鐘的上升沿讀出數(shù)據(jù)即可,。其中的時(shí)鐘倍頻可采用數(shù)字鎖相環(huán)技術(shù)將輸入時(shí)鐘升頻,。某些FPGA內(nèi)部包含了鎖相環(huán)電路(如Altera公司的FLEX10KA系列的FPGA),可以直接調(diào)用,。
2.5 初始化過(guò)程
  在MCU與DDR之間通信必須通過(guò)DDR控制器對(duì)DDR進(jìn)行初始化:置DDR的突發(fā)長(zhǎng)度,、CL、突發(fā)類(lèi)型以及操作模式等,。在初始化完DDR后,,MCU也必須對(duì)DDR控制器的2個(gè)內(nèi)部寄存器進(jìn)行設(shè)置,由MCU發(fā)LOAD_REG2和LOAD_REG1命令分別完成,。整個(gè)DDR和DDR控制器的初始化過(guò)程為:(1)完成預(yù)充電PRECHARGE命令,。(2)發(fā)LOAD_MODE命令。(3)發(fā)LOAD_REG2命令,。(4)發(fā)LOAD_
  REG1命令,。
3  結(jié)束語(yǔ)
  本文給出的通用DDR控制器的設(shè)計(jì)方法,可以很好地解決DDR在時(shí)鐘上升和下降沿都能讀取數(shù)據(jù)而不好控制的問(wèn)題,,而且可以直接利用FPGA內(nèi)部提供的數(shù)字鎖相環(huán)電路,,避免了在設(shè)計(jì)中增加復(fù)雜的模擬電路。此外,,開(kāi)發(fā)者還可以根據(jù)自己的實(shí)際需要對(duì)該設(shè)計(jì)方法進(jìn)行修改,,以形成自己專(zhuān)用的DDR控制器。
參考文獻(xiàn)
1  DDR SDRAM Specification.http://www.samsung.com,,2002.5
2  夏宇聞.復(fù)雜數(shù)字電路與系統(tǒng)的Verilog HDL設(shè)計(jì)技術(shù).北京:北京航空航天大學(xué)出版社,,1998
3  戴梅萼,史嘉權(quán).微型計(jì)算機(jī)技術(shù)及應(yīng)用(第二版).北京:清華大學(xué)出版社,,1996
4  常青,,陳輝煌,孫廣富等.可編程專(zhuān)用集成電路及其應(yīng)用與設(shè)計(jì)實(shí)踐.北京:國(guó)防工業(yè)出版社,,1998
 

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