惠為君
摘要:介紹了SDRAM的結(jié)構(gòu)、原理和時(shí)序。在此基礎(chǔ)上,基于FPGA實(shí)現(xiàn)了SDRAM控制器設(shè)計(jì),給出了設(shè)計(jì)的代碼結(jié)構(gòu)。在MODELSIM平臺(tái)上完成了設(shè)計(jì)的仿真。結(jié)果表明,該設(shè)計(jì)是成功的。
關(guān)鍵詞:SDRAM; VERILOG; FPGA; 控制器
中圖分類號(hào):TN911 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào):1009-3044(2015)05-0241-03
The SDRAM Controller Based of FPGA
HUI Wei-jun
(Yan Cheng Institute of Technology, Yancheng 224051, China)
Abstract: The structure, principle and time sequence of SDRAM are introduced in this paper. Based on this, the design of SDRAM controller based on FPGA is realized, the code structure of the design is given as well as. The simulation of the design is completed on the MODELSIM platform. The results shows that the design is successful.
Key words: SDRAM; VERILOG; FPGA ; Controller
SDRAM即同步動(dòng)態(tài)隨機(jī)存儲(chǔ)器,其價(jià)格低、容量大、體積小,是計(jì)算機(jī)系統(tǒng)的主要組成部分。在實(shí)時(shí)圖像采集處理系統(tǒng)中,考慮到成本性能等因素,主要用SDRAM作為存儲(chǔ)設(shè)備。SDRAM的控制邏輯復(fù)雜,對(duì)于不同的存儲(chǔ)要求,為了充分利用SDRAM的性能,有必要設(shè)計(jì)專用的控制器。
1 SDRAM的結(jié)構(gòu)
SDRAM內(nèi)部是若干個(gè)存儲(chǔ)陣列,這樣就比較容易做到順序訪問(wèn)和隨機(jī)訪問(wèn)。
這樣的一個(gè)陣列叫一個(gè)L_BANK。一般的SDRAM芯片取4個(gè)這樣的L_BANK.。訪問(wèn)存儲(chǔ)單元的步驟是:先訪問(wèn)L_BANK,再訪問(wèn)行,最后訪問(wèn)列。以本文使用的hynix的
HY56V641260為例,其行地址12BIT,列地址8BIT,存儲(chǔ)單元的寬度為16BIT,L_BANK數(shù)為4。HY56V641260的容量為4* 1M * 16BIT。
2 SDRAM的引腳
主要的控制引腳決定了SDRAM的主要操作,這對(duì)設(shè)計(jì)SDRAM的控制器十分重要。如表1所示,為SDRAM引腳名稱及引腳組合決定的功能。其中,CS#-為片選信號(hào),RAS#為行選通,CAS#為列選通,WE#寫信號(hào)。以上信號(hào)都是低電平有效,它們的不同組合實(shí)現(xiàn)SDRAM的不同功能 。在讀寫的時(shí)候,WE#為低為寫,為高位讀。
功能號(hào)表示為:1、無(wú)操作;2、選定行;3和4、選定列(同時(shí)讀/寫);5、突發(fā)傳輸終止;6、預(yù)充電;7、刷新;8、模式寄存器加載。
3 SDRAM的時(shí)序
SDRAM的時(shí)序分為初始化時(shí)序和讀寫時(shí)序,時(shí)序的不同階段對(duì)應(yīng)SDRAM的不同操作。
如圖2所示,初始化分四個(gè)階段:200us的輸入穩(wěn)定期,4個(gè)L-BANK預(yù)充電(操作6),8個(gè)刷新周期(操作7),模式寄存器加載(操作8)。 其中模式寄存器加載確定SDRAM的讀寫工作方式。
如圖3為讀寫時(shí)序圖,首先選定行(操作2),過(guò)時(shí)間tRCD以后,就可以讀/寫操作(操作4)了,當(dāng)然,其時(shí)要選定列,同時(shí)使行無(wú)效。
由上述時(shí)序可以得到,SDRAM控制器主要控制SDRAM實(shí)現(xiàn)以下動(dòng)作:
a. 200us的穩(wěn)定期,執(zhí)行空操作。
b. 所以BANK預(yù)充電
c. 8個(gè)刷新周期
d. 寄存器模式加載
e. 正常讀寫
4 SDRAM控制器的Verilog實(shí)現(xiàn)
根據(jù)時(shí)序,控制器的實(shí)現(xiàn)部分主要就分為初始化和讀寫部分。
If (RESET_N==0) begin
SA <= 0; //地址線
BA <= 0; //段地址
CS_N <= 1; //片選
RAS_N <= 1; //行選通
CAS_N <= 1; //列選通
WE_N <= 1; //寫使能
CKE <= 0; end //時(shí)鐘使能。
以上控制信號(hào)除了CKE都是低電平有效,所以復(fù)位后,控制信號(hào)都取高電平,等待初始化指令。接受到初始化指令后,行列都不選通,寫使能取高電平,此時(shí)初始化開(kāi)始。
系統(tǒng)時(shí)鐘取125MHZ,初始化時(shí)序的四個(gè)階段,由計(jì)數(shù)器計(jì)數(shù)控制。第一個(gè)階段為250us的穩(wěn)定期,對(duì)應(yīng)的計(jì)數(shù)值為25000,第二個(gè)階段為預(yù)充電階段,需要20個(gè)時(shí)鐘周期,第三個(gè)階段為8個(gè)刷新周期對(duì),每個(gè)刷新周期為20個(gè)時(shí)鐘周期,最后對(duì)應(yīng)的就是寄存器模式加載。
#define INT_INT_PER 18d25000
if (init_counter < (INIT_PER+201))
init_counter <= init_counter + 16d1;
else if (init_counter < INIT_PER)
begin
REFRESH <=0;
PRECHARGE <=0;
LOAD_MODE <=0;
INIT_REQ <=1; //200us穩(wěn)定期
end
else if(init_counter == (INIT_PER+20)) //20個(gè)時(shí)鐘周期的預(yù)充電
begin
REFRESH <=0;
PRECHARGE <=1;
LOAD_MODE <=0;
INIT_REQ <=0;
end
else if( (init_counter=(INIT_PER+40)) || ….)
begin
REFRESH <=1;
PRECHARGE <=0;
LOAD_MODE <=0;
INIT_REQ <=0;
end
else if(init_counter == (INIT_PER+200)) begin
REFRESH <=0;
PRECHARGE <=0;
LOAD_MODE <=1;
INIT_REQ <=0;
end
INIT_REQ取值為1表示200us穩(wěn)定期,PRECHARGE取值為1表示預(yù)充電,余類推。模式寄存器加載成功之后,就可以對(duì)SDRAM進(jìn)行讀寫操作。
If ((READA == 1) & (do_reada == 0)) begin
do_reada <= 1;
ex_read <= 1;
end else
do_reada <= 0;
end
在收到讀取的命令之后,首先行選通,使行選通脈沖取值為0,列選通脈沖取值為1。
If (do_reada == 1 | do_writea == 1) begin RAS_N <= 0;
CAS_N <= 1;
WE_N <= 1; end
行選通到列選通之間,需要一定的時(shí)間延遲,這個(gè)時(shí)間稱為行選通周期,一般用t_RCD表示。不同廠家的SDRAM,行選通周期取值不同,一般取2到3個(gè)時(shí)鐘周期。
If (RESET_N == 0)begin
rw_shift <= 0;
do_rw <= 0; end
else if ((do_reada == 1) | (do_writea == 1)) begin
if (t_RCD == 3)
rw_shift <= 2; end
else begin
rw_shift <= (rw_shift>>1);
do_rw <= rw_shift[0];
end
用移位寄存器的移位動(dòng)作實(shí)現(xiàn)延時(shí),當(dāng)讀寫動(dòng)作標(biāo)記do_rw的值由0跳變到1時(shí)候,說(shuō)明延時(shí)完成,可以進(jìn)行讀寫動(dòng)作。
If (do_rw==1) begin RAS_N <= 1;
CAS_N <= 0;
WE_N <= rw_flag; end
行選通脈沖取高電平,同時(shí)列選通脈沖取低電平,此時(shí)進(jìn)行讀寫動(dòng)作。 具體讀或者寫動(dòng)作由讀寫標(biāo)記寄存器rw_flag標(biāo)記。此時(shí),如果是讀取數(shù)據(jù)的話,經(jīng)過(guò)一個(gè)數(shù)據(jù)潛伏期CL,數(shù)據(jù)將出現(xiàn)在數(shù)據(jù)總線上。
5 仿真
SDRAM的型號(hào)取hynix的hy57v641620,其結(jié)構(gòu)是分為4個(gè)BANK, 每個(gè)BANK取12BIT的行地址,8BIT的列地址,容量是1M*16BIT。仿真的時(shí)候,取編碼是11的BANK,CKE為高電平,CSN為低電平。同時(shí)需要設(shè)計(jì)一個(gè)仿真數(shù)據(jù)文件,為SDRAM提供寫入的數(shù)據(jù)。
初始化仿真時(shí)序如圖-4所示。為了簡(jiǎn)單起見(jiàn),截圖是去除了CKE和CSN信號(hào)。
如圖-5為讀寫時(shí)序。在模式寄存器加載之后,進(jìn)入到SDRAM讀寫時(shí)序。由時(shí)序圖可知,先選定行,行選擇信號(hào)為低,然后選擇列,列現(xiàn)在信號(hào)為低,同時(shí)WE_N信號(hào)有效。此時(shí),寫入數(shù)據(jù)。
6 結(jié)束語(yǔ)
該控制器的設(shè)計(jì)是用于控制SDRAM存儲(chǔ)CMOS攝像頭實(shí)時(shí)采集的圖像。在實(shí)際應(yīng)用中,還需要設(shè)計(jì)讀寫緩存器,用于暫存攝像頭的數(shù)據(jù)流。SDARM的數(shù)據(jù)來(lái)源于讀寫緩存器,此時(shí),讀寫緩存器取代仿真時(shí)所用的數(shù)據(jù)文件。
參考文獻(xiàn):
[1] 段然, 樊曉椏. 基于狀態(tài)機(jī)的SDRAM 控制器的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與應(yīng)用,2005, 42(17) : 110-112.
[2] 夏宇聞. Verilog 數(shù)字系統(tǒng)設(shè)計(jì)教程[M]. 北京航空航天大學(xué)出版社, 2008.
[3] 朱文斌,劉春平,黃振.基于FPGA 的高可靠性SDRAM 控制器設(shè)計(jì)與實(shí)現(xiàn)[J]. 電訊技術(shù),2011,51(10) : 113-116。
[4] 趙欣博,陳星.DDR SDRAM 與 FPGA 的高速接口設(shè)計(jì)[J].電子測(cè)量技術(shù), 2008,31(11):182-183.