惠为君+沈兆军
摘要:介绍了SDRAM的结构、时序和有关概念。在该基础上,基于自顶向下设计思想,把控制器模块划分为两个部分:内部命令产生、命令输出。基于verilog实现这两部分模块电路,并完成顶层实体。测试表明,该控制器是有效的。
关键词:Verilog;SDRAM;控制器
中图分类号:TN911 文献标识码:A 文章编号: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即同步动态随机存取存储器,其容量大,存储速度快。在设计一种视频图像系统时,需要存储的数据量大,采用SDRAM作为存储器件。为此,需要设计SDRAM控制器。
1 SDRAM结构及引脚
本系统采用hynix的SDRAM器件,型号为HY57V641620。
SDRAM为阵列结构,如同一张二维表格,如图1所示。通过行列地址,存储单元可以随机访问。存储器行数为 2^12 = 4096,列数为 2^8 = 512,段数为 2 ^ 2 = 4。 其容量为 4096*512*4 = 8Mbit。
其主要引脚名称及功能如下:
CKE:时钟使能;CS_N: 片选;
WE_N:写使能,低电平为写,高电平为读;
RAS_N: 行选通;CAS_N: 列选通;
BA[1:0] : 段选择;
A[11:0] : 行、列复用地址。行地址12位,列地址取低8位。
D[15:0] 双向数据端口。
2 SDRAM时序
SDRAM的操作时序分为三部分:初始化、写、读。控制器设计就是基于这三部分时序完成的。初始化完成之后,才可以实现对存储器的读写操作。
初始化时序分为4个部分,如图2所示。
1) 200us的输入延时。用于稳定电路各部分的状态。
2) 所有段预充电。预充电是指关闭现有行,激活另一行。A10置位,对所有L_BANK预充电,A10位,对固定L_BANK预充电。
3) 8个刷新周期。SDRAM的数据保存在电容中。SDRAM的特征就是要定时刷新,给电容充电,来保证数据不丢失。电容中数据的有效保存期时间为64ms,器件存储单元共有4096行,每行刷新时间为64ms/4096 = 15.625us。
4) 模式寄存器设置。通过对地址总线的赋值来进行模式配置,用来控制器件的读写方式。
读写模式等具体内容见附录[1]。
本系统配置寄存器值为:000_011_0_111,即设置潜伏长度为2个时钟,页模式突发读写,顺序传输方式。
3 器件读写
模式寄存器配置完成之后,器件就可以正常读写了。
由于行列地址复用,不能同时传送行列地址。读写时序如图4所示,读数据的时候,先发送行地址,使行有效。经过时间Trcd以后,再发送列地址和读写有效信号。Trcd称为行有效时间。由于列地址只有8位,所以[A11..A8]可以赋值为4b0000或4b0100。当A10取值1时,器件自动预充电。
在发送列地址读数据的时候,控制信号CKE、CS_N、WE_N要同时有效。读命令有效后,数据要经过放大,才可以输出,这段时间称为Tcl。Tcl一般为2~3个周期。
写数据的时候,行列地址时序和读数据相同。写数据没有潜伏时间,但是数据写入器件还是需要时间,称为写回延时Twr。在Twr时间内,不可以预充电。
4 控制器编程实现
4.1 内部命令产生模块
该模块产生产生初始化及刷新、读写等命令。基于初始化时序,在200us稳定期过户,依次生成预充电、8个刷新周期、模式寄存器设置命令。
parameter INIT_PER = 16'd25000;
reg [15:0] init_timer;
if(init_timer < (INIT_PER+201))
init_timer <= init_timer + 16'd1;
初始化常量取值25000,時钟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。满足输入稳定期:
1/125 us * 25000 = 200us 。
然后是20个时钟的预充电,及8个刷新周期,寄存器配置。
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。满足每行刷新时间间隔:
1/125us * 1953 = 15us
即过15us之后,刷新行,总刷新周期为64ms。如果INIT_REQ有效,需要多加200个时钟,等待初始化完成之后,再生成刷新请求。
4.2 命令执行模块
该模块把读、写、预充电、刷新等命令翻译成正确的控制命令,连接到SDRAM的控制引脚:CKE、CS_N、RAS_N 、WE_N等,使SDRAM执行的正确的动作。
定义内部命令变量和向量:
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用于内部延时。
模块的功能描述内容主要分为三个部分,如图5所示。
4.3 内部命令产生
部分核心程序如下:
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
当输入的初始化命令、与充电、刷新、读写命令有效且命令完成标记为零时候,对应的内部命令置位。
4.4 延时
为保证命令的有效执行,在生成一个内部命令的时候,有必要执行一段延时。为保证延时的精确性,延时电路用移位寄存器实现。
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
移位寄存器并入串出,延时8个时钟之后,command_done复位,可以接受下一个命令。
4.5 SDRAM控制信号输出
SDRAM动作与输入控制信号关系如表1所示。
其中,BTR是突发操作停止动作。
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
……
当内部读写命令有效时候,首先行选通,也就是激活操作,然后在延时Trcd之后,标记do_rw有效,执行读写操作。
5 顶层实体
顶层实体电路如图6所示。系统设置了页模式控制命令pm_stop,如果pm_stop有效,则非页模式下,需要额外延时。
在系统中,此控制器配合FIFO可以完成数据的存取工作。
参考文献:
[1] 李丽斯, 杨立杰, 殷晔, 等. 刘康丽基于FPGA的页快速命中的SDRAM控制器的设计[J]. 2015(13).
[2] 郭柳柳, 甄國涌, 刘东海. 基于FPGA高速图像数据的存储及显示设计[J]. 电子技术应用, 2014(11).
[3] 邓凯, 王永明. 一种简单的SDRAM控制器实现方法[J]. 国外电子测量技术, 2011(09).
[4] 鲁玲. 多时钟域数据传递的FPGA实现[J]. 现代电子技术, 2007(21).
[5] 杨会建, 田成军, 杨志娟, 等. 基于FPGA的SDRAM乒乓读写操作设计[J]. 长春理工大学学报, 2015(2).
[6] 李丽斯, 杨立杰, 殷晔, 等. 基于SDRAM大容量缓存FIFO控制器的设计与实现[J]. 2015(13).endprint