SDRAM控制器设计

2017-12-15 10:07惠为君沈兆军
电脑知识与技术 2017年32期
关键词:控制器

惠为君+沈兆军

摘要:介绍了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

猜你喜欢
控制器
工商业IC卡控制器改造为物联网控制器实践
基于DSP的复合跟踪控制器的设计
Fuzzy-PI混合型控制器在远红外烘干炉中的应用
基于FPGA的异步通信控制器设计与实现
基于自抗扰控制的VSC-HVDC控制器设计
基于FPGA的可控硅移相触发控制器的实现
MOXA RTU控制器ioPAC 5542系列
倍福 CX8091嵌入式控制器
红狮控制 PID控制器PXU系列
基于PWM集成控制器开关电源的设计与仿真