惠為君+沈兆軍
摘要:介紹了SDRAM的結(jié)構(gòu)、時(shí)序和有關(guān)概念。在該基礎(chǔ)上,基于自頂向下設(shè)計(jì)思想,把控制器模塊劃分為兩個(gè)部分:內(nèi)部命令產(chǎn)生、命令輸出。基于verilog實(shí)現(xiàn)這兩部分模塊電路,并完成頂層實(shí)體。測(cè)試表明,該控制器是有效的。
關(guān)鍵詞:Verilog;SDRAM;控制器
中圖分類號(hào):TN911 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2017)32-0236-03
VGA CONTROLER in Verilog
HUI Wei-jun
(Yancheng Institute of Technology, Yancheng 224051, China)
Abstract: The structure, timing and related concepts of SDRAM are introduced in this paper. After that, Based on the top-down design idea, the controller module is divided into two parts: the internal command generation、command output. The two module circuits as well as top layer entity are realized Based on verilog, The test shows that the controller is worked.
Key words: Verilog; SDRAM; controller
SDRAM即同步動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器,其容量大,存儲(chǔ)速度快。在設(shè)計(jì)一種視頻圖像系統(tǒng)時(shí),需要存儲(chǔ)的數(shù)據(jù)量大,采用SDRAM作為存儲(chǔ)器件。為此,需要設(shè)計(jì)SDRAM控制器。
1 SDRAM結(jié)構(gòu)及引腳
本系統(tǒng)采用hynix的SDRAM器件,型號(hào)為HY57V641620。
SDRAM為陣列結(jié)構(gòu),如同一張二維表格,如圖1所示。通過行列地址,存儲(chǔ)單元可以隨機(jī)訪問。存儲(chǔ)器行數(shù)為 2^12 = 4096,列數(shù)為 2^8 = 512,段數(shù)為 2 ^ 2 = 4。 其容量為 4096*512*4 = 8Mbit。
其主要引腳名稱及功能如下:
CKE:時(shí)鐘使能;CS_N: 片選;
WE_N:寫使能,低電平為寫,高電平為讀;
RAS_N: 行選通;CAS_N: 列選通;
BA[1:0] : 段選擇;
A[11:0] : 行、列復(fù)用地址。行地址12位,列地址取低8位。
D[15:0] 雙向數(shù)據(jù)端口。
2 SDRAM時(shí)序
SDRAM的操作時(shí)序分為三部分:初始化、寫、讀。控制器設(shè)計(jì)就是基于這三部分時(shí)序完成的。初始化完成之后,才可以實(shí)現(xiàn)對(duì)存儲(chǔ)器的讀寫操作。
初始化時(shí)序分為4個(gè)部分,如圖2所示。
1) 200us的輸入延時(shí)。用于穩(wěn)定電路各部分的狀態(tài)。
2) 所有段預(yù)充電。預(yù)充電是指關(guān)閉現(xiàn)有行,激活另一行。A10置位,對(duì)所有L_BANK預(yù)充電,A10位,對(duì)固定L_BANK預(yù)充電。
3) 8個(gè)刷新周期。SDRAM的數(shù)據(jù)保存在電容中。SDRAM的特征就是要定時(shí)刷新,給電容充電,來保證數(shù)據(jù)不丟失。電容中數(shù)據(jù)的有效保存期時(shí)間為64ms,器件存儲(chǔ)單元共有4096行,每行刷新時(shí)間為64ms/4096 = 15.625us。
4) 模式寄存器設(shè)置。通過對(duì)地址總線的賦值來進(jìn)行模式配置,用來控制器件的讀寫方式。
讀寫模式等具體內(nèi)容見附錄[1]。
本系統(tǒng)配置寄存器值為:000_011_0_111,即設(shè)置潛伏長(zhǎng)度為2個(gè)時(shí)鐘,頁模式突發(fā)讀寫,順序傳輸方式。
3 器件讀寫
模式寄存器配置完成之后,器件就可以正常讀寫了。
由于行列地址復(fù)用,不能同時(shí)傳送行列地址。讀寫時(shí)序如圖4所示,讀數(shù)據(jù)的時(shí)候,先發(fā)送行地址,使行有效。經(jīng)過時(shí)間Trcd以后,再發(fā)送列地址和讀寫有效信號(hào)。Trcd稱為行有效時(shí)間。由于列地址只有8位,所以[A11..A8]可以賦值為4b0000或4b0100。當(dāng)A10取值1時(shí),器件自動(dòng)預(yù)充電。
在發(fā)送列地址讀數(shù)據(jù)的時(shí)候,控制信號(hào)CKE、CS_N、WE_N要同時(shí)有效。讀命令有效后,數(shù)據(jù)要經(jīng)過放大,才可以輸出,這段時(shí)間稱為Tcl。Tcl一般為2~3個(gè)周期。
寫數(shù)據(jù)的時(shí)候,行列地址時(shí)序和讀數(shù)據(jù)相同。寫數(shù)據(jù)沒有潛伏時(shí)間,但是數(shù)據(jù)寫入器件還是需要時(shí)間,稱為寫回延時(shí)Twr。在Twr時(shí)間內(nèi),不可以預(yù)充電。
4 控制器編程實(shí)現(xiàn)
4.1 內(nèi)部命令產(chǎn)生模塊
該模塊產(chǎn)生產(chǎn)生初始化及刷新、讀寫等命令?;诔跏蓟瘯r(shí)序,在200us穩(wěn)定期過戶,依次生成預(yù)充電、8個(gè)刷新周期、模式寄存器設(shè)置命令。
parameter INIT_PER = 16'd25000;
reg [15:0] init_timer;
if(init_timer < (INIT_PER+201))
init_timer <= init_timer + 16'd1;
初始化常量取值25000,時(shí)鐘125Mhz,
if (init_timer < INIT_PER)
INIT_REQ <=1;
else if(init_timer == (INIT_PER+20)) PRECHARGE <=1;
else if( (init_timer == (INIT_PER+40)) ||endprint
……
(init_timer == (INIT_PER+180)) )
REFRESH <= 1;
定義init_timer為16位。定義INIT_PER大小為25000。滿足輸入穩(wěn)定期:
1/125 us * 25000 = 200us 。
然后是20個(gè)時(shí)鐘的預(yù)充電,及8個(gè)刷新周期,寄存器配置。
parameter REF_PER = 16'd1953;
reg [15:0] timer;
if (REF_ACK == 1)
begin timer <= REF_PER;
REF_REQ <= 0; end
else if (INIT_REQ == 1)
begin
timer <= REF_PER + 16'd200;
REF_REQ <=0; end
else timer <= timer - 1'b1;
if(timer == 0) REF_REQ <= 1;
定義常量 REF_PER大小為1953。滿足每行刷新時(shí)間間隔:
1/125us * 1953 = 15us
即過15us之后,刷新行,總刷新周期為64ms。如果INIT_REQ有效,需要多加200個(gè)時(shí)鐘,等待初始化完成之后,再生成刷新請(qǐng)求。
4.2 命令執(zhí)行模塊
該模塊把讀、寫、預(yù)充電、刷新等命令翻譯成正確的控制命令,連接到SDRAM的控制引腳:CKE、CS_N、RAS_N 、WE_N等,使SDRAM執(zhí)行的正確的動(dòng)作。
定義內(nèi)部命令變量和向量:
reg do_reada,do_writea,do_refresh;
reg do_precharge,do_load_mode,do_initial;
reg command_done,do_rw, rw_flag;
reg [7:0] command_delay;
reg [1:0] rw_shift;
其中,command_delay及command_d用于內(nèi)部延時(shí)。
模塊的功能描述內(nèi)容主要分為三個(gè)部分,如圖5所示。
4.3 內(nèi)部命令產(chǎn)生
部分核心程序如下:
if( INIT_REQ == 1 ) do_initial <= 1;
else
begin
if ((PRECHARGE == 1) & (command_done == 0)
do_precharge <= 1;
if ((REF_REQ == 1 | REFRESH == 1) &(command_done == 0)
do_refresh <= 1;
……
if ((READA == 1) & (command_done == 0) begin do_reada <= 1;ex_read <= 1; end
……
end
當(dāng)輸入的初始化命令、與充電、刷新、讀寫命令有效且命令完成標(biāo)記為零時(shí)候,對(duì)應(yīng)的內(nèi)部命令置位。
4.4 延時(shí)
為保證命令的有效執(zhí)行,在生成一個(gè)內(nèi)部命令的時(shí)候,有必要執(zhí)行一段延時(shí)。為保證延時(shí)的精確性,延時(shí)電路用移位寄存器實(shí)現(xiàn)。
if ((do_refresh == 1) | (do_reada == 1) | (do_writea == 1) | (do_precharge == 1)
| (do_load_mode == 1))
begin
command_delay <= 8'b11111111;
command_done <= 1;
else
begin
command_done<=command_delay[0];
command_delay <= (command_delay>>1);
end
移位寄存器并入串出,延時(shí)8個(gè)時(shí)鐘之后,command_done復(fù)位,可以接受下一個(gè)命令。
4.5 SDRAM控制信號(hào)輸出
SDRAM動(dòng)作與輸入控制信號(hào)關(guān)系如表1所示。
其中,BTR是突發(fā)操作停止動(dòng)作。
if (do_initial ==1) begin
RAS_N <= 1;
CAS_N <= 1;
WE_N <= 1; end
……
else if (do_reada == 1 | do_writea == 1) begin
RAS_N <= 0;
CAS_N <= 1;
WE_N <= 1; end
else if (do_rw == 1) begin
RAS_N <= 1;
CAS_N <= 0;
WE_N <= rw_flag; end
……
當(dāng)內(nèi)部讀寫命令有效時(shí)候,首先行選通,也就是激活操作,然后在延時(shí)Trcd之后,標(biāo)記do_rw有效,執(zhí)行讀寫操作。
5 頂層實(shí)體
頂層實(shí)體電路如圖6所示。系統(tǒng)設(shè)置了頁模式控制命令pm_stop,如果pm_stop有效,則非頁模式下,需要額外延時(shí)。
在系統(tǒng)中,此控制器配合FIFO可以完成數(shù)據(jù)的存取工作。
參考文獻(xiàn):
[1] 李麗斯, 楊立杰, 殷曄, 等. 劉康麗基于FPGA的頁快速命中的SDRAM控制器的設(shè)計(jì)[J]. 2015(13).
[2] 郭柳柳, 甄國涌, 劉東海. 基于FPGA高速圖像數(shù)據(jù)的存儲(chǔ)及顯示設(shè)計(jì)[J]. 電子技術(shù)應(yīng)用, 2014(11).
[3] 鄧凱, 王永明. 一種簡(jiǎn)單的SDRAM控制器實(shí)現(xiàn)方法[J]. 國外電子測(cè)量技術(shù), 2011(09).
[4] 魯玲. 多時(shí)鐘域數(shù)據(jù)傳遞的FPGA實(shí)現(xiàn)[J]. 現(xiàn)代電子技術(shù), 2007(21).
[5] 楊會(huì)建, 田成軍, 楊志娟, 等. 基于FPGA的SDRAM乒乓讀寫操作設(shè)計(jì)[J]. 長(zhǎng)春理工大學(xué)學(xué)報(bào), 2015(2).
[6] 李麗斯, 楊立杰, 殷曄, 等. 基于SDRAM大容量緩存FIFO控制器的設(shè)計(jì)與實(shí)現(xiàn)[J]. 2015(13).endprint