标题 | SDRAM控制器设计 |
范文 | 惠为君+沈兆军 摘要:介绍了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)) || …… (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). |
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。