基于FPGA的SDRAM控制器的设计和实现
1. 引言
清扫车扫刷随着电子技术在工业、医疗、商业等领域的发展,人们对数据传输率的要求越来越高,传统的单片机早已不能满足这种高速数据传输的要求。与此同时,可编程的逻辑器件FPGA/CPLD以其强大的功能,开发过程投资小、周期短,可反复编程修改,开发工具智能化等特点,成为当今硬件设计的潮流;相比而言,FPGA即现场可编程门阵列,它的集成度高,可完成极其复杂的时序与组合逻辑电路功能,更适用于高速、高密度的高端数字逻辑电路设计领域[1]。SDRAM即:同步动态随即存储器,与传统的DRAM有很大区别。它可以与系统总线以同频率工作,用同一个CPU时钟周期即可完成数据的访问和刷新,进而大大的提高了数据传输率,其速度远大于DRAM。因而,SDRAM常作为数据缓存应用于高速数据传输系统中。目前,许多嵌入式设备的大容量、高速度存储器都采用SDRAM来实现,而且大多都是用专用芯片完成其控制电路,这不但提高了设计成本,而且使系统的硬件电路变得复杂。随着FPGA在嵌入式系统中的广泛应用,如果我们能够结合具体的需要,利用FPGA来设计自己的SDRAM控制器,这些问题就迎刃而解了。然而,SDRAM的控制逻辑复杂、时序要 求严格,常常困扰设计人员。有很多文章[2,3,4,5]详细的介绍了SDRAM的工作原理、控制时序和指令特点,以及基于FPGA的SDRAM控制器的实现方法,但是并没有详细的给出控制器内部结构和指令时序的控制问题。因此。本文将介绍一种基于FPGA的通用SDRAM控制器,并着重介绍设计方案中各模块的功能和实现方法。该控制器用VHDL语言程序实现,完成了SDRAM指令状态转换、信号仲裁判断,并巧妙的用三个移位寄存器解决了指令的逻辑和时序的问题。 1. SDRAM简介
SDRAM具有空间存储量大、读写速度快、价格相对便宜的特点。但其控制逻辑复杂,需要周期性刷新操作、行列管理、不同延时和命令序列等。 1.1 SDRAM地址结构
SDRAM的存储地址分为页(bank)地址,行(row)地址和列(column)地址。例如一个8MByte的SDRAM,被分为4个bank,即1个bank为2MByte,每个bank包括12行8列。
废渣41.2 SDRAM的指令
SDRAM的一系列指令如表1所示,每个指令最终都是通过控制RAS、CAS、WE信号来实现。通常对SDRAM的操作过程如下:
表1 SDRAM命令
(1) SDRAM初始化操作:
水性附着力促进剂上电后至少等待100ns,然后至少执行1条空操作;对所有页执行预充电操作;向各页发出两条刷新操作指令;最后执行SDRAM工作模式的设定LMR命令用来配置SDRAM工作模式寄存器,SDRAM工作寄存器如表2所示。其中A11~A10是用户保留位;A9用来配置写突发模式;A8~A7是操作模式,通常为“00”,代表标准操作模式;A6~A4设置CAS延迟时间;
A3决定突发操作模式是顺序还是间隔型;最后的三位A2~A0用来配置突发长度。
表2 SDRAM工作寄存器
A11 | A10 | A9 | A8 | A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 |
Reserve | Write burst mode | Operating mode | Latency mode | Burst type | Burst length |
| | | | | | | | | | | |
(2) SDRAM读、写操作:
根据实际应用的需要,发出读、写指令。SDRAM可实现突发式读写,支持的突发长度可配置为1氧化沟工艺流程图个、2个、4个、8个数据周期或者页模式。并且突发的模式可以配置为顺序或者间隔型。对SDRAM进行访问的最主要操作就是读RD和写WR操作。SDRAM在进行读写操作时,必须要先进行页激活ACT操作,以保证存储单元是打开的,以便从中读取地址或者写入地址,关闭存储单元通过预充电PHC命令实现。在进行写操作时,内部的列地址和数据就会被寄存;进行读操作时,内部地址被寄存,等待CAS 延迟时间(通常为1~3个时钟周期)后,读出的数据出现在数据总线上,具体时序详见SDRAM数据手册,此处不再赘述。
(3) 操作终止:
当负压脉动式清肺仪SDRAM接收到读、写指令后,开始进行顺次的读写操作,直到达到突发长度或者突发终止指令BT出现。
镜面银油墨
2. SDRAM控制器方案
SDRAM控制器【6】针对SDRAM的指令操作特点,为SDRAM提供同步命令接口和时序逻辑控制,下面将以ALTERA公司的Cyclone系列FPGA为例,主机系统时钟为100MHz,使用三星公司的K4S641632E,8MByte SDRAM【7】,介绍SDRAM控制器的具体设计方法。图1为SDRAM控制器的接口原理图。
图1 SDRAM控制器接口原理图
接口信号介绍:
(1) 与主机接口信号:
CLK:系统时钟信号;
RESET::系统复位信号;
CMD[2:0]:译码指令,如表3所示;
CMDACK:指令应答信号,通知主机命令已被SDRAM执行;
ADDR:地址线,根据具体情况确定位数,本例中为22位,A21、A20代表页地址BA1,BA0;A19~A8代表行地址;A7~A0代表列地址;
DATAIN/DATAOU:输入、输出数据总线;
DM:数据掩码;
(2) 与SDRAM接口信号:
SADDR:12位地址线,在读、写操作时,地址线分时复用为行地址和列地址;
BA:页地址,BA0,BA1;
CS:片选信号;
CKE:时钟使能信号;
RAS、CAS、WE:命令控制信号;
DQM:SDRAM数据掩码;
DQ:双向数据线;
SDRAM控制器作为顶层模块,由3个主要模块组成:接口控制模块、命令生成模块、数据路径模块。下面将详细的介绍各个模块的功能和关键设计的VHDL实现方法。
表3 CMD命令字
2.1 接口控制模块
接口控制模块主要实现的功能包括:将CMD[2:0]翻译成接口指令和对刷新计数器的控制,如图2所示。首先通过状态机来完成对CMD[2:0]的翻译,在VHDL程序中声明一个用户自定义类型states,根据CMD[2:0]输入来决定状态的转移,完成对CMD[2:0]的解码,如下所示:
type states is(nop,reada,writea,refresh,precharge,load_mode);
signal state : states ;
…
……………
case cmd is
when "011" => state<=refresh;
when "111" => state<=nop;
………………
SDRAM需要周期性刷新操作以保持数据,数据手册中通常会给出在一定的时间T内,SDRAM至少刷新X次,如果用户使用频率为Fr MHz的时钟,则刷新周期Tf可以通过下面的公式计算出:Tf=(T*Fr) / X。例如,本例中数据手册要求64ms内至少刷新4096次,系统时钟周期为100MHz,则刷新周期为(64ms*100MHz)/ 4096,得出结果等于1562.5,所以至多1562个时钟周期的时间就必须对SDRAM刷新一次。刷新控制在程序中通过一个计数器来完成,当到达规定的计数周期,就向SDRAM发出REF_REQ刷新请求,直到SDRAM完成刷新操作,发出REF_ACK刷新应答信号,计数器才重新赋值开始下一次的计数。
图2 接口控制模块
2.2 命令生成模块
图3是命令生成模块,主要实现了对输入的指令请求进行仲裁判断,并将仲裁后要执行的指令解码成SDRAM需要的RAS、CAS等信号,从而实现对SDRAM的控制。
图3 命令生成模块
之所以需要仲裁机制,是因为在指令执行之前可能会发生以下情况:其它指令和刷新请求同时到来;刷新请求到来时,其它指令正在执行。仲裁机制实现方法如下:
(1) SDRAM在每一刻只有一个指令在执行;
(2) 先到的指令先执行,即:如果刷新请求到来时,其它命令正在执行中,要等到当前命令执行完成后,才能执行刷新指令;
(3) 其它指令和刷新请求同时到来时刷新操作先执行。
经过仲裁判断后,指令将传入命令生成器。命令生成器不仅要把指令解码成可控制SDRAM的信号,同时还要用三个移位寄存器对命令执行的延迟时间进行控制。第一个为指令延时寄存器,用来保证SDRAM有充足时间完成最终指令。例如,如果命令的执行需要8各时钟周期的时间,则指令延时寄存器com_delay的初值设为“11111111”,同时声明一个内部信号com_done,作为指令执行完成的标志的。在指令执行期间,每一个时钟上升沿到来时,移位寄存器向右移位一次,com_delay[0]的移入com_done,同时“0” 移入最高
位com_delay[7]。当com_done为“0”时,就说明指令的延迟时间已到,即通过com_done的值,就可以判断当前指令是否执行完成。要注意的是:移位寄存器的位数和初值,应该根据SDRAM的数据手册中命令完成需要的时间和系统的时钟周期来确定。下面得例程仅供参考。
if (do_state=refresh or do_state=reada or do_state=writea
or do_state=precharge or do_state=load_mode)then
command_delay(7 downto 0)<="11111111"; ------移位寄存器初值
command_done<='1';
………………
else
command_done<=command_delay(0); --------移位操作
command_delay(6 downto 0)<= command_delay(7 downto 1);
command_delay(7)<='0';