论文部分内容阅读
摘要:介绍了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]可以赋值为4’b0000或4’b0100。当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)) || ……
(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)
关键词: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]可以赋值为4’b0000或4’b0100。当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)) || ……
(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)