APP下载

基于FPGA的DDR2 SDRAM控制器设计

2021-07-02钱素琴刘晶华

电子测试 2021年11期
关键词:存储器时钟控制器

钱素琴,刘晶华

(东华大学信息科学与技术学院,上海,201600)

0 引言

随着数据采集系统的发展,应用于图像采集和数据传输等领域的产品对存储器的速度要求越来越高。DDR2系列的SDRAM动态存储器因为其能在时钟的正负沿进行两倍速度读写[1],同时具有低成本、高速、大容量、运行稳定等高性价比的优点,所以在各个领域中被广泛使用[2]。比如文献3采用DDR2来存储视频数据[3],文献4利用DDR2实现了数据量较大的原始红外图像的缓存[4],文献5将DDR2存储技术应用到了船舶港口物流跟踪系统中[5]等。

DDR2复杂苛刻的操作时序,造成对应的DDR2控制器电路结构也比较特别。很多FPGA厂商利用其可编程芯片的丰富软硬件资源设计了DDR2存储控制器IP核[6],其中Altera公司设计的存储控制器因其效率最高使用较为广泛。要实现DDR2控制器的设计,用户只需了解FPGA芯片专用于连接DDR2的引脚功能及存储器的工作机制即可。

本设计主控制器选用了Altera公司Cyclone IV系列的EP4CE30F23C8,数据缓存器选用了Micron公司内存为2Gbit大小的MT47H128M16-25E,研究了DDR2 SDRAM的工作原理及控制器IP核解决方案,在现场可编程门阵列芯片FPGA中实现DDR2控制器设计,并在嵌入式逻辑分析仪Signaltap中显示了双边沿时钟主频工作下的测试结果,在166.7MHz时钟频率下实现了稳定读写的目标。

1 DDR2的工作机制

1.1 DDR2的初始化

DDR2 SDRAM有许多操作步骤,包括加载模式、自刷新、预充电、激活、读写操作和空闲等待。在进行上述操作之前必须要在上电后按照规定的步骤完成初始化。在初始化的过程中主要是对其模式寄存器的值进行配置来完成CAS延迟、突发长度、突发类型、输出驱动能力、片上端接电阻(ODT)值、伴随CAS的附加延迟、片外驱动器校准等参数的配置,为之后的读写操作做准备。

1.2 DDR2的读写操作

DDR2读写操作前需要对指定段的行进行激活,每个段只允许打开1行进行读写操作,如果要对同一段中的其他行进行读写操作,则必须先用预充电命令关闭已经打开的行,再用激活命令打开需要进行读写操作的行。实际上是锁定行地址,再进行突发操作,对连续地址单元进行读写操作[6]。DDR2可支持突发读写,突发读写长度为4和8,也称突发传输,简化了DDR2的读写操作并提高了读写效率。

1.3 IP核

Altera为用户提供了DDR2控制的两个IP, 一个是DDR2 SDRAM Controller with UniPHY,另一个为DDR2 SDRAM Controller with ALTMEMPHY。DDR2 SDRAM Controller with UniPHY的性能比DDR2 SDRAM Controller with ALTMEMPHY更好一些,两种IP使用的方法是相同的,但UniPHY不支持Cyclone系列的芯片,所以在Cyclone 系列的FPGA上只能使用ALTMEMPHY IP来实现DDR2。

2 DDR2 SDRAM控制器的设计

图1为本方案的控制器总体结构框图,主要包括FPGA和DDR2 SDRAM,其中FPGA内部模块包括参数计算、输入FIFO、DDR2控制器、输出FIFO。图像数据缓存是通过FPGA片内的输入输出FIFO资源与片外的DDR2 SDRAM进行的,其中,各个模块之间数据位宽不一致和数据传输速度不匹配的问题可以由输入输出FIFO解决,高速大容量的数据缓存可以借助DDR2 SDRAM来实现。

图1 系统总体结构框图

系统实现的过程如下:上电后对DDR2存储器的模式寄存器配置后进行初始化;在读取数据和写入数据时,实现存储器能上下沿传输数据和突发传输的要求。在写入数据操作时将待发送的数据和命令转换成符合存储器要求的写指令,然后将数据写入存储器;在读取操作时先将读地址和数据长度转换成存储器要求的读指令发送给存储器读出需要的数据,然后从存储器将读出的数据发送给用户端。

在结构框图的基础上,本文进行了硬件和软件两个部分的设计。硬件设计为FPGA与DDR2的信号连接,软件设计为以verilog语言为基础的FPGA逻辑编程控制DDR2的读写。

2.1 DDR2 SDRAM控制器的信号连接图

DDR2 SDRAM控制器的信号连接图如图2所示。

图2 信号连接图

在本方案中的设计的测试模块中有时钟输入信号CLK和置位信号RST。功能验证的部分包含初始化模块、读写控制模块和数据传输模块的验证。

DDR2 SDRAM与FPGA开发板上的FPGA相连的是BANK3和BANK4的IO,相连的硬件引脚具体为:系统时钟差分时钟信号(CK、CK#)、时钟使能信号(CKE#)、行列地址复用总线(A[13:0])、段地址选择线(BA[2:0])、数据总线(DQ[15:0])、随路时钟信号(DQS)、片选信号(CS#)、行地址选通信号(CAS#)、列地址选通信号(RAS#)、写使能信号(WE#)、数据屏蔽信号(DM)和片内终端电阻控制线(ODT)等[7]。

DDR2 SDRAM的电平电压为1.8V,参考电压VREF为电源电压的一半。由于外部由5V电源供电,所以采用MP1482芯片将外部的5V电源电压转换成DDR2需要的1.8V电压。具体电路参考MP1482使用手册,本文不再赘述。

DDR2的硬件设计需要严格考虑信号完整性[8],在电路设计和PCB设计的时候需要充分考虑匹配电阻/终端电阻、走线阻抗控制和走线等长控制,保证DDR2的高速稳定的工作。

2.2 DDR2 SDRAM控制器的逻辑设计

DDR2 SDRAM控制器的主要功能是实现存储器芯片的初始化、读写操作和数据传输,它将存储器复杂的读写时序隐藏起来,转化成简单易行的操作,通过控制器,只需控制简单的接口信号,就可以对存储器芯片进行读写操作。写入数据的时候,只要控制写请求信号wr_burst_req、写长度wr_burst_len、写地址wr_burst_add和写数据wr_burst_data。同样,读数据的时候,只要控制读请求信号rd_burst_req、读长度rd_burst_len、读地址rd_burst_add、读数据有效rd_burst_data_valid和读数据rd_burst_data。本设计的命令参数是根据表1的命令真值表和图3的状态转换图进行逻辑设计的。

表1 DDR2 SDRAM基本操作的命令真值表

图3 DDR2 SDRAM控制器状态转换图

图3的状态转换图显示了DDR2 SDRAM控制器把外部的burst 读请求和写请求转化成 DDR2 IP接口的Local Bus的所需的信号和时序的流程。具体的读和写流程如下:

Burst读:当程序在IDLE状态接收到读请求(rd_burst_req为高)时,会进入MEM_READ状态并发送Local Bus的读请求命令,读请求的长度为rd_burst_len。发送Local Bus的读请求结束后进入MEM_READ_WAIT状态,等待数据全部读出完成。读数据完成后会返回IDLE状态,并发送rd_burst_finish信号。

Burst写:当程序在IDLE状态接收到写请求(wr_burst_req为高)时,会先进入MEM_WRITE_FIRST状态,再轮流进入MEM_WRITE_BURST_BEGIN状态和MEM_WRITE状态。在MEM_WRITE_BURST_BEGIN状态,会置位Local Bus的local_burst_begin信号为高,说明这是一个burst的写命令,burst长度为local_size。在MEM_WRITE状态,不需要发送 local_burst_begin信号。在MEM_WRITE_BURST_BEGIN状态和MEM_WRITE状态里,Local Bus的local_write_req信号一直为高,直到写入的数据完成返回到IDLE状态,并发送wr_burst_finish 信号。

3 DDR2 SDRAM控制器的验证

根据DDR2 SDRAM控制器状态转换图用硬件开发语言verilog进行FPGA逻辑编程,编译仿真后连接JTAG将程序烧录到FPGA开发装置中,测试是否产生读写请求信号,以及地址和测试数据,并校验读和写的数据是否正确,并将结果在SignalTap中显示出来。

3.1 验证流程

本方案具体验证流程如下:

(1)在Quartus II中生成ALTMEMPHY IP核,在该过程中设置了Device family、Speed grade、DDR2的输入参考时钟频率和DDR2时钟频率等参数;

(2)编写mem_burst_v2.v程序完成对DDR2 IP的封装;

(3)编写ddr2_test.v测试程序实现两个功能,一个功能是产生读写请求信号、地址和测试数据并校验读和写的数据是否正确,另一个功能是例化mem_burst_v2模块和第一步中生成的DDR2 IP顶层模块ddr2.v;

(4)程序编译完成之后会用Quartus II的对应仿真软件Modelsim将程序的运行结果进行仿真观察是否能达到预期的结果,仿真完成之后连接JTAG将程序烧录到FPGA开发板中,使用SignalTap工具来测试和观察DDR2读写的时序和信号状态。

3.2 验证结果

开发的程序在Quartus II中编译后的资源报告如图4所示,资源报告内容主要包括项目名ddr_test、顶层文件名ddr_test、FPGA系列名Cyclone IV E、FPGA型号EP4CE30F23C8、总逻辑模块数7907、引脚数49以及锁相环数1。

图4 资源报告

连接JTAG将程序烧录到FPGA开发板中,使用SignalTap工具来测试和观察DDR2读写的时序和信号状态,采样时钟使用DDR2 IP产生的phy_clk,具体波形如图5、图6和图7所示。

首先可以观察一下图5中DDR burst写入数据的波形,这里波形显示向DDR2的地址空间E830A6的地址开始写入01010101,02020202...的数据。因为这里的DDR2的burst写length为2,所以地址信号local_address是每写入2个数据就加2, local_burst_begin信号为第一个数据写的时候为高,第二个数据写的时候为低。

图5 写入数据图

这里需要注意:只有当local_ready为高和local_write_req信号都为高时,写入的数据才是有效的数据,如果local_ready信号为低,local_write_req和数据需要一直保持,等待local_ready 信号为高才行。

接下去可以观察一下图6中DDR2的burst读的时序,在local_ready信号为高和local_read_req信号为高时,依次读取地址信号local_address为E830A6,E830A8…的数据。

图6 数据地址及信号有效图

这里也同样:只有当local_ready为高和local_read_req信号都为高时,burst读才是有效的,如果local_ready信号为低,local_read_req和地址local_address需要一直保持,等待local_ready 信号为高才行。

继续观察读出的数据是否跟之前写入的数据一致,local_read_req信号请求为高等待一段时间后,local_rddata_valid信号会变高,这里DDR2输出有效的数据01010101,02020202....,如图7所示,DDR2读出的数据正是之前写入到DDR2中的数据。

图7 读数据图

根据以上的DDR2测试,可以得到在Intel的FPGA Cyclone IV系列开发板上的DDR2部分能够稳定地在166.7MHz时钟频率下工作,因为DDR2采用上下沿数据读写,所以数据读写传输达到330MHz的频率。在编程时,IP核的封装模块即本方案中的mem_burst_v2模块非常重要,可以简化对DDR2 IP接口和时序控制的难度,并且能方便后续的其他模块如读写模块的使用,也能为程序的移植带来便捷。

4 结论

本文首先介绍了DDR2 SDRAM的工作机制,包括DDR2 SDRAM的初始化、工作方式和IP核;之后根据DDR2 SDRAM的操作原理设计了DDR2 SDRAM的控制器,包括硬件设计和软件设计两个方面;硬件设计给出了信号连接图,软件设计给出了整个控制器系统的状态转换图,包括突发模式下读写操作的状态转换;最后对设计的DDR2 SDRAM控制器进行了验证,证明了在166.7MHz时钟频率下读写操作以及local_ready和local_read_req等控制信号都可以正常作用,并且数据正确。通过本文对DDR2 SDRAM控制器的设计,大大简化了DDR2 SDRAM的读写操作功能。

猜你喜欢

存储器时钟控制器
别样的“时钟”
静态随机存储器在轨自检算法
古代的时钟
有趣的时钟
时钟会开“花”
存储器——安格尔(墨西哥)▲
模糊PID控制器设计及MATLAB仿真
MOXA RTU控制器ioPAC 5542系列
倍福 CX8091嵌入式控制器
基于Nand Flash的高速存储器结构设计