2.2 各模块的设计
2.2.1系统控制接口模块
该模块内含了初始化机制和系统指令分析机制。
初始化机制不仅要完成对SDRAM的初始化配置,还要完成对控制器的初始化配置,使控制器与外部SDRAM的工作模式一致。其过程如下:由计数器控制在系统上电200US左右后,先进行SDRAM的初始化配置工作,由一个Precharge all bank指令完成对所有BANK的预充,接着是多个Refresh指令,然后是模式配置指令(LOAD_MODE),完成SDRAM的工作模式设置。之后进行控制器的初始化配置工作,先发出指令LOAD_REG1给控制器载入模式字,再发出LOAD_REG2指令载入控制器的刷新计数器值,完成控制器初始化配置。
上述初始化过程结束后,系统指令分析机制才可接收并分析系统的读写信号和地址信息以及从下个模块反馈回来的CMDACK信号,并产生对应的CMD命令和SADDR地址信息给CMD命令解析模块。通过程序设置,实现了根据初始化配置的参数来确定在读写到特定时刻发出PRECHARGE或者REFRESH的CMD指令,从而简化了系统的控制。而每当收到CMDACK为1时,表示CMD指令已经发出并有效,此时就要发出NOP命令(CMD=000)。要说明的是,SADDR是分时复用的,在初始化载入模式时,SADDR用以传输用户自己定义的模式字内容;而在正常的读写期间,SADDR作为地址线传输SDRAM所需的行、列和块地址。此外, 系统指令分析机制会根据控制器对SDRAM的操作处于什么样的状态而反馈SDRAM_FREE和FDATA_ENABLE信号给系统用户。详细的CMD指令说明见表2。
2.2.2 CMD命令解析模块
该模块对CMD指令进行判断,其结果就是输出相应的操作指令信号给命令响应模块。例如:CMD为001时,则会输出do_read信号为1,CMD为010时,则会输出do_write信号为1。在同一时刻,各操作指令的有效状态是互斥的,只会输出一种有效的的操作指令。而如果CMD命令是NOP,则不会有任何有效操作指令发出,此时命令响应模块就会对SDRAM做出NOP操作动作。
此外,该模块内含用以预设某些模式参数的模式寄存器,主要包括3类:第1类是SDRAM模式控制寄存器,在LOAD_MODE指令时,将该寄存器的值送入SDRAM的模式寄存器中,以控制SDRAM的工作模式。第2类是SDRAM控制器的参数寄存器(LOAD_REG1),使得SDRAM控制器的工作方式与外部的SDRAM器件的工作方式匹配。第3类是SDRAM的刷新周期控制寄存器,该寄存器预设用户定义的自动刷新计数值,用于SDRAM的刷新周期预设。上述三类寄存器的预设值都是系统控制接口模块在初始化时通过SADDR传送给来的。
2.2.3命令响应模块
该模块的作用为:根据从CMD命令解析模块得到的操作指令,做出符合SDRAM读写规范的操作动作,来进行用户期望的操作;给出数据选通信号OE,来控制数据通路模块(写操作时OE为1,读操作时OE为0)。此外,该模块把系统非复用的地址ADDR处理为SDRAM复用的地址,分时送给SA,BA。程序中地址复用方法为: assign raddr = ADDR[ROWSTART +ROWSIZE -1:ROWSTART] //raddr为行地址
assign caddr = ADDR[COLSTART + COLSIZE -1:COLSTART] //caddr为列地址
assign baddr= ADDR[BANKSTART +`BANKSIZE -1:BANKSTART]//baddr为BANK地址
( ROWSTART、COLSTART、BANKSTART分别为行、列、块在ADDR中的起始bit位)
在设计中WRITEA和READA的CMD指令实际隐含了ACTIVE命令,所以该模块在收到do_write或do_read指令后,会先进行激活动作,经过初始化配置规定的CAS延迟时间之后再进行读写动作。例如初始化时,模式字规定CAS=2,BURST LENGTH=PAGE,则从命令接口模块收到d0_write=1后,会先作出激活动作并给出行地址(发出RAS_N=0,CAS_N=1,WE_N=1,SA=raddr),过2个时钟延迟后,再做出写动作并给出列地址(发出RAS_N=1,CAS_N=0,WE_N=0,SA=caddr)。
此外,收到各类操作指令后,该模块会反馈给CMD命令解析模块cmdack信号为1,并最终反馈到系统控制接口模块的CMDACK信号为1,如果没有收到任何操作指令,则cmdack=0,CMDACK=0.
2.2.4 数据通路模块
该模块受OE信号的控制,使数据的进出和相应的操作指令在时序上同步。OE为1时,数据可由DQ脚写入SDRAM,OE为0时,数据可从SDRAM的DQ脚读出。
3.SDRAM控制器的使用及仿真时序
根据系统设计对SDRAM读写要求的不同,对控制器进行简单的参数修改(主要是初始化时模式内容字的设置),即可使对SDRAM的控制符合自己的要求。该控制器的使用很简单,系统只需要根据控制器接口处的反馈信号(FDATA_ENABLE、SDRAM_FREE)的变化,通过FPGA_WR、FPGA_RD、ADDR发送读写命令,用DAIN、DAOUT来发、收SDRAM的数据即可。系统无须关心SDRAM的刷新和预充。
以PAGE方式的写操作为例,初始化结束后,只要SDRAM空闲,系统就会收到SDRAM_FREE有效信号,此时可以发出FPGA_WR指令,同时给出ADDR地址信息,在收到反馈的FDATA_ENABLE有效后,系统将数据通过DAIN写到SDRAM中去,即完成写操作,而读操作的顺序与写操作类似。使用MODELSIM对该控制器进行仿真,仿真时序图如下:
仿真结果表明,该控制器可以使得系统对SDRAM的读、写控制非常简单、方便。笔者在一个图象采集显示系统中使用了该控制器接口,成功的实现了以page方式的对SDRAM进行图象数据的存取。
4 结束语
本文提出了一种基于FPGA的SDRAM控制器的设计方法,解决了由于SDRAM器件控制逻辑复杂导致的操作不方便问题。笔者用ALTERA公司的Cyclone FPGA器件进行设计,设计输入采用Verilog来完成,实现了上述的SDRAM控制器的设计,成功的解决了SDRAM控制困难的问题,使SDRAM与本地处理器和PCI控制器方便、可靠的完成数据交换。此外,由于采用了参数化设计思想,对特定容量的SDRAM的特定工作模式而言,只要根据其器件参数进行设定,该控制器就可以适用特定SDRAM的特定工作模式,具有一定的通用性。
Verilog硬件描述语言已越来越广泛地应用于EDA领域,大多数EDA设计工程师都用它来进行FPGA开发。在数字电路设计领域,利用FPGA器件非常强大的功能和非常灵活的设计方法,几乎没有不能实现的设计。
参考文献
Kingston Technology Company,‘THE ULTIMATE MEMORY GUIDE’, 2001.
HY57V56820B(L)T 4 Banks x 8M x 8Bit Synchronous DRAM data sheet ,HY
夏宇闻.复杂数字电路与系统的Verilog HDL设计技术[M].北京航空航天大学,1998.
作者简介
曹华 男 1978年出生,电子科技大学在读硕士研究生。主要研究方向为数字信号处理、FPGA在图像处理系统中的应用。
邓彬 女 1966年出生,电子科技大学副教授,硕士导师,主要研究方向为图像传输与处理、单片机及DSP技术的应用开发。