摘 要: 介紹了SDRAM的存儲體結(jié)構(gòu),、主要控制時(shí)序和基本操作命令,,并且結(jié)合實(shí)際系統(tǒng),,給出了一種用FPGA實(shí)現(xiàn)的通用SDRAM控制器的方案,。
關(guān)鍵詞: SDRAM 狀態(tài)機(jī) 存儲 VHDL
在高速實(shí)時(shí)或者非實(shí)時(shí)信號處理系統(tǒng)當(dāng)中,,使用大容量存儲器實(shí)現(xiàn)數(shù)據(jù)緩存" title="數(shù)據(jù)緩存">數(shù)據(jù)緩存是一個(gè)必不可少的環(huán)節(jié), 也是系統(tǒng)實(shí)現(xiàn)中的重點(diǎn)和難點(diǎn)之一,。SDRAM(同步動(dòng)態(tài)隨機(jī)訪問存儲器)具有價(jià)格低廉,、密度高,、數(shù)據(jù)讀寫速度快的優(yōu)點(diǎn),,從而成為數(shù)據(jù)緩存的首選存儲介質(zhì),。但是SDRAM存儲體結(jié)構(gòu)與RAM有較大差異,其控制時(shí)序和機(jī)制也較復(fù)雜,,限制了SDRAM的使用,。目前,雖然一些通用微處理器提供了和SDRAM的透明接口,,但其可擴(kuò)展性和靈活性不夠,,難以滿足現(xiàn)實(shí)系統(tǒng)的要求,限制了SDRAM的使用,。
在詳細(xì)閱讀SDRAM數(shù)據(jù)文檔的前提下,,參考ALTERA公司的IP core,利用可編程器件(CPLD,,F(xiàn)PGA)設(shè)計(jì)了一種通用的SDRAM控制器,。它具有很高的靈活性,可以方便地和其它數(shù)據(jù)緩存接口電路進(jìn)行連接,,被成功地應(yīng)用在無線中頻數(shù)據(jù)采集分析系統(tǒng)中,,如圖1所示。在該系統(tǒng)中,,以SDRAM存儲陣列緩存中頻來的高速數(shù)據(jù),。存滿后,數(shù)據(jù)被慢速讀出至數(shù)據(jù)處理模塊。下面將對SDRAM控制模塊的設(shè)計(jì)進(jìn)行詳細(xì)的描述,。
1 SDRAM內(nèi)存條" title="內(nèi)存條">內(nèi)存條的結(jié)構(gòu)
SDRAM內(nèi)存條由SDRAM內(nèi)存芯片" title="內(nèi)存芯片">內(nèi)存芯片構(gòu)成,,根據(jù)內(nèi)存條的容量大小決定內(nèi)存條上內(nèi)存芯片的個(gè)數(shù)。現(xiàn)以MICRON公司生產(chǎn)的MIT16LSDT6464A型SDRAM內(nèi)存條為例,,簡要介紹SDRAM的結(jié)構(gòu),。
MIT16LSDT6464A內(nèi)存條容量為512M Byte,由16片容量為32M Byte的內(nèi)存芯片MT48LC32M8A2構(gòu)成,。16片內(nèi)存芯片被分為兩組,,每個(gè)芯片的數(shù)據(jù)位寬為8bit。8片一組,,64bit數(shù)據(jù)寬度,。每個(gè)內(nèi)存芯片的數(shù)據(jù)線和控制線均是復(fù)用的。對內(nèi)存條的讀寫操作" title="讀寫操作">讀寫操作,,是以內(nèi)存芯片組為單位的,,通過內(nèi)存條的片選信號S0、S1,、S2,、S3決定組號。S0,、S2控制芯片組1,,S1、S3控制芯片組2,。
SDRAM內(nèi)存芯片的主要信號有控制信號,、地址信號、數(shù)據(jù)信號,,均為工作時(shí)鐘同步輸入,、輸出信號。
控制信號主要有:CS(片選信號),,CKE(時(shí)鐘使能信號),,DQM(輸入、輸出使能信號),,CAS,、RAS、WE(讀寫控制命令字),。通過CAS,、RAS、WE的各種邏輯組合,,可產(chǎn)生各種控制命令(見表1)。
地址信號有:BA0和BA1頁地址選擇信號,A0~A12地址信號,,行,、列地址選擇信號。通過分時(shí)復(fù)用決定地址是行地址" title="行地址">行地址還是列地址,。在讀寫操作中,,在地址線上依次給出頁地址、行地址,、列地址,,最終確定存儲單元地址。
數(shù)據(jù)信號有:DQ0~DQ7,,雙向數(shù)據(jù),。其使能受DQM控制。
SDRAM的工作模式通過LOAD MODE REGISTER命令對工作模式寄存器進(jìn)行設(shè)置來選擇,。設(shè)置參量(見表2)有Reserved(備用的人)Write Burst Mode(WB,,寫突發(fā)模式)、Operation Mode(Op Mode,工作模式),、CAS Latency(CAS延遲),、Burst Type(BT,突發(fā)類型),、Burst Length(突發(fā)長度),。
2 SDRAM的基本讀寫操作
SDRAM的基本讀操作需要控制線和地址線相配合地發(fā)出一系列命令來完成。先發(fā)出BANK激活命令(ACTIVE),,并鎖存相應(yīng)的BANK地址(BA0,、BA1給出)和行地址(A0~A12給出)。BANK激活命令后必須等待大于tRCD(SDRAM的RAS到CAS的延遲指標(biāo))時(shí)間后,,發(fā)出讀命令字,。CL(CAS延遲值)個(gè)工作時(shí)鐘后,讀出數(shù)據(jù)依次出現(xiàn)在數(shù)據(jù)總線上,。在讀操作的最后,,要向SDRAM發(fā)出預(yù)充電(PRECHARGE)命令,以關(guān)閉已經(jīng)激活的頁,。等待tRP時(shí)間(PRECHARGE命令后,,相隔tRP時(shí)間,才可再次訪問該行)后,,可以開始下一次的讀,、寫操作。SDRAM的讀操作只有突發(fā)模式(Burst Mode),,突發(fā)長度為1,、2,、4、8可選,。
SDRAM的基本寫操作也需要控制線和地址線相配合地發(fā)出一系列命令來完成,。先發(fā)出BANK激活命令(ACTIVE),并鎖存相應(yīng)的BANK地址(BA0,、BA1給出)和行地址(A0~A12給出),。BANK激活命令后必須等待大于tRCD的時(shí)間后,發(fā)出寫命令字,。寫命令可以立即寫入,,需寫入數(shù)據(jù)依次送到DQ(數(shù)據(jù)線)上。在最后一個(gè)數(shù)據(jù)寫入后延遲tWR時(shí)間,,發(fā)出預(yù)充電命令,,關(guān)閉已經(jīng)激活的頁。等待tRP時(shí)間后,,可以展開下一次操作,。寫操作可以有突發(fā)寫和非突發(fā)寫兩種。突發(fā)長度同讀操作,。
tRCD,、tRP、tWR的具體要求,,詳見SDRAM廠家提供的數(shù)據(jù)手冊,。所等待的工作時(shí)鐘個(gè)數(shù)由tRCD、tRP,、tWR的最小值和工作時(shí)鐘周期共同決定,。
由以上介紹可以得出,SDRAM的讀,、寫操作均由一系列命令組成,,因此讀、寫操作是有時(shí)鐘損耗的,,工作時(shí)鐘速率不等于SDRAM能達(dá)到的讀,、寫速率。但是由于SDRAM有突發(fā)讀,、寫模式,,也就是說可以讀出和寫入一串地址連續(xù)的數(shù)據(jù),從而提高了效率,。當(dāng)突發(fā)長度為整頁時(shí),,讀、寫速度達(dá)到最快,。隨機(jī)讀,、寫速度的計(jì)算公式為:
fwrite/read=工作時(shí)鐘頻率(Hz)×數(shù)據(jù)寬度(bytes)×突發(fā)讀寫長度/操作所需的時(shí)鐘數(shù)
為了提高存儲密度,,SDRAM采用硅片電容存儲信息。電容總會(huì)有漏電流流過,,所以為了不使信息丟失,,必須定期地給電容刷新充電,。外部控制邏輯必須按要求定期向內(nèi)存條發(fā)出刷新命令,,保證在規(guī)定的時(shí)間內(nèi)對每一個(gè)單元都進(jìn)行刷新。
3 初始化操作
SDRAM在上電以后必須對其進(jìn)行初始化操作,,具體操作如下:
(1)系統(tǒng)在上電后要等待100~200μs,。在等待時(shí)間到了以后至少執(zhí)行一條空操作或者指令禁止操作。
(2)對所有芯片執(zhí)行PRECHARGE命令,,完成預(yù)充電,。
(3)向每組內(nèi)存芯片發(fā)出兩條AUTO REFRESH命令,使SDRAM 芯片內(nèi)部的刷新計(jì)數(shù)器可以進(jìn)入正常運(yùn)行狀態(tài),。
(4)執(zhí)行LOAD MODE REGISTER命令,,完成對SDRAM工作模式的設(shè)定。
完成以上步驟后,,SDRAM進(jìn)入正常工作狀態(tài),,等待控制器對其進(jìn)行讀、寫和刷新等操作,。
4 SDRAM控制器設(shè)計(jì)
4.1 功能說明
在以SDRAM作為緩存的系統(tǒng)中,,使用可編程器件對其進(jìn)行控制具有很強(qiáng)的靈活性。為了使設(shè)計(jì)具有模塊化和可重復(fù)使用的優(yōu)點(diǎn),,設(shè)計(jì)了一個(gè)簡化的SDRAM接口電路,。這樣就屏蔽掉了SDRAM操作的復(fù)雜性,而其它邏輯模塊可通過接口電路對SDRAM進(jìn)行訪問,。此外,,由于整個(gè)SDRAM控制器用VHDL語言編寫,只要對其進(jìn)行簡單的修改就可以滿足不同的需求,,具有很強(qiáng)的靈活性,。
參照圖2,SDRAM控制器完成的主要功能是對CMD[2:0]的命令字和ADDR端的地址進(jìn)行解析,,產(chǎn)生相應(yīng)的SDRAM的控制時(shí)序,。
CLK為輸入的工作時(shí)鐘端口。
ADDR為輸入地址端口,??刂破鲗⑵浣馕鰹閷?yīng)的片選、頁以及行,、列地址,。以一條MIT16LSDT6464A內(nèi)存條為例,,其大小為512Mbyte(229 byte)。數(shù)據(jù)位寬為64bit(8byte),,則地址線ADDR應(yīng)為26根,。可以這樣映射地址:ADDR[25]對應(yīng)內(nèi)存芯片組號,;ADDR[24:23]對應(yīng)頁號,;ADDR[22:10]對應(yīng)行號;ADDR[9:0]對應(yīng)列號,。
DATAIN為寫入數(shù)據(jù)端口,,64bit位寬。
DATAOUT為讀出數(shù)據(jù)端口,,64bit位寬,。
RD_OE為讀出數(shù)據(jù)使能端口,當(dāng)其為1時(shí),,表示從下一個(gè)時(shí)鐘起,,數(shù)據(jù)將依次出現(xiàn)在DATAOUT口上。
WR_OE為寫入數(shù)據(jù)使能端口,,當(dāng)其為1時(shí),,寫入數(shù)據(jù)應(yīng)該依次出現(xiàn)在DATAIN口上。
CMD[2:0]為命令輸入端口,,分別表示讀,、寫內(nèi)存等操作,具體編碼見表3,。其中,,CMD = “000”表示無操作,內(nèi)存條交給控制器管理,,定期完成刷新工作,;REFRESH命令由外部邏輯指定待刷新的內(nèi)存芯片組號,組號由ADDR的低位給出,;LOAD_MODE命令執(zhí)行內(nèi)存條工作寄存器初始化工作,,初始化值由DATAIN的低13位決定,內(nèi)存芯片組號同樣由ADDR的低位給出,;同理,,ADDR的低位也決定了預(yù)充電操作所對應(yīng)的內(nèi)存芯片組號。
CMDACK為命令應(yīng)答端口,,表示命令已經(jīng)被執(zhí)行,,使外部邏輯可以向控制器發(fā)出下一個(gè)動(dòng)作。
4.2 狀態(tài)機(jī)
圖3是SDRAM控制器的狀態(tài)轉(zhuǎn)移圖,。狀態(tài)圖中的各個(gè)狀態(tài)內(nèi)均包含一系列的子狀態(tài)轉(zhuǎn)移(對SDRAM內(nèi)存條發(fā)出連續(xù)命令),,每個(gè)子狀態(tài)完成一個(gè)功能操作,。初始化操作包括前面介紹的內(nèi)存條初始化全過程,工作寄存器的默認(rèn)值在VHDL程序中指定,。以后可以通過LOAD_MODE命令改變內(nèi)存條的工作模式,。初始化結(jié)束后,內(nèi)存條進(jìn)入Idel狀態(tài),,刷新計(jì)數(shù)器開始工作,,控制器開始響應(yīng)外部邏輯的操作請求。
刷新計(jì)數(shù)器操作是一個(gè)獨(dú)立的進(jìn)程(process),。刷新計(jì)數(shù)器的初值由內(nèi)存芯片要求,、內(nèi)存條個(gè)數(shù)和控制器工作頻率共同決定。例如,,在本次設(shè)計(jì)中,所采用的MT48LC32M8A2內(nèi)存芯片要求在64ms內(nèi)至少刷新8196次,。而MIT16LSDT6464A型內(nèi)存條共有兩組內(nèi)存芯片,,也就是要求在64ms內(nèi)要發(fā)出8196×2條自刷新(AUTO REFRESH)指令。系統(tǒng)工作時(shí)鐘為46.66MHz,,因此控制單條MIT16LSDT6464A時(shí),,刷新計(jì)數(shù)器初值至多為(64ms/8196/2)×46.66MHz,即182,。開始工作后,,每當(dāng)刷新計(jì)數(shù)器值減為0,便依次向內(nèi)存芯片組發(fā)出刷新命令,,保證SDRAM中的數(shù)據(jù)不丟失,。刷新請求是內(nèi)部請求;讀和寫操作是外部請求,。在Idel狀態(tài)中有請求仲裁邏輯,,當(dāng)內(nèi)部和外部請求同時(shí)出現(xiàn)時(shí),優(yōu)先保證內(nèi)部請求,,狀態(tài)轉(zhuǎn)移至刷新操作,。當(dāng)刷新操作結(jié)束時(shí),重新返回Idel狀態(tài),,開始響應(yīng)外部請求,。響應(yīng)外部請求后,應(yīng)答信號CMDBAK出現(xiàn)正脈沖,。它通知外部邏輯,,請求已經(jīng)被響應(yīng),可以撤銷請求,。在刷新操作狀態(tài)中,,也有計(jì)數(shù)器計(jì)數(shù),,其大小等于控制器管理的內(nèi)存芯片組號。記錄并判斷此次刷新操作所對應(yīng)的內(nèi)存芯片的組號,,產(chǎn)生相應(yīng)的片選信號,。
響應(yīng)讀、寫請求后,,狀態(tài)從Idel轉(zhuǎn)移到讀,、寫狀態(tài)。同時(shí)讀,、寫地址和寫入的數(shù)據(jù)鎖存至控制器,。控制器由讀寫地址解析出CS信號,、頁地址,、行地址、列地址,。向內(nèi)存條發(fā)出一系列命令(ACTIVE,,READ/WRITE with AUTO PRECHARGE),完成讀寫操作,。為了簡化,,此控制器向SDRAM發(fā)出的都是帶有AUTO PRECHARGE 的讀、寫指令,,然后由SDRAM內(nèi)部邏輯自動(dòng)在讀,、寫過程末期發(fā)出PRECHARGE指令(在發(fā)READ/WRITE指令時(shí),地址線A10賦值1,,打開AUTO PRECHARGE功能),。圖4和圖5分別是利用該控制器完成讀、寫操作的時(shí)序圖,。讀操作的CAS延遲為兩個(gè)時(shí)鐘,。
該SDRAM控制器在中頻數(shù)據(jù)海量存儲系統(tǒng)中已得到應(yīng)用。數(shù)據(jù)接收邏輯將接收到的中頻采樣數(shù)據(jù)整理后(拼接成64bit),通過SDRAM控制器存入SDRAM陣列,。存滿后,,數(shù)據(jù)輸出邏輯將中頻數(shù)據(jù)通過SDRAM控制器從內(nèi)存條中取出,傳輸至上位機(jī),。其VHDL代碼在ATERA公司的FPGA——EP1C6Q240中通過了QuartusII的仿真,、綜合和布局、布線,。占用499個(gè)logic cell,,消耗了8%的邏輯資源。留有豐富的資源可提供給其它邏輯單元使用。
上面介紹了SDRAM的基本工作原理和一種簡單的通用SDRAM控制器的實(shí)現(xiàn),。SDRAM的控制機(jī)制比較復(fù)雜,,具有多種突發(fā)讀、寫方式和工作模式(詳細(xì)內(nèi)容請參考SDRAM的數(shù)據(jù)手冊),。但是,,可以根據(jù)實(shí)際應(yīng)用,實(shí)現(xiàn)其中的一個(gè)子集(基本讀,、寫,、刷新操作)來滿足實(shí)際系統(tǒng)的需要。用SDRAM實(shí)現(xiàn)大容量的高速數(shù)據(jù)緩存具有明顯的優(yōu)勢,,使用可編程器件實(shí)現(xiàn)SDRAM控制器則使之具有更高的靈活性,,其應(yīng)用前景廣闊。
參考文獻(xiàn)
1 SDR SDRAM Controller White Paper. Altera Corporation,, August 2002. http://www.altera.com/literature
2 MICRON SYNCHRONOUS DRAM Data Sheet.Micron Technology Inc,,2002. http://www.micron.com/dramds
3 褚振勇,翁木云. FPGA 設(shè)計(jì)及應(yīng)用 [M]. 西安: 西安電子科技大學(xué)出版社,,2002