基于Kintex?7 FPGA 的DDR3 SDRAM接口应用研究

吴长瑞+徐建清+蒋景红
摘 要: 针对FPGA中使用DDR3进行大容量数据的缓存应用背景,采用模块化设计方法,提出基于Xilinx Kintex?7 FPGA的DDR3 SDRAM FIFO接口设计方案。在分析DDR3用户接口特点和用户接口时序的基础上,对不同读/写模式进行效率测试。借鉴标准FIFO的设计思想,结合DDR3 SDRAM控制器的特点,设计遍历状态机对该FIFO接口进行读/写测试。最后,原型机平台验证了该接口不仅具有标准FIFO简单易用的功能,而且具有存储空间大等优势。
关键词: DDR3 SDRAM; FIFO; FPGA; 遍历状态机
中图分类号: TN43?34; TP332.3 文献标识码: A 文章编号: 1004?373X(2017)24?0021?04
Abstract: Aiming at the application background of using DDR3 for large?capacity data caching in FPGA, a design scheme of DDR3 SDRAM FIFO interface based on Xilinx Kintex?7 FPGA is presented according to the modularized design method. Based on the analysis of DDR3 user interface characteristics and user interface time sequence, the efficiency of different read?write modes was tested. In combination with the design thought of standard FIFO and characteristics of DDR3 SDRAM controller, the traversal state machine is designed to perform the read?write test of the FIFO interface. The interface was verified with the prototype platform. The result demonstrates that the interface has the simple and easy?to?use functions of standard FIFO, and large storage space.
Keywords: DDR3 SDRAM; first?in first?out; field programmable gate array; traversal state machine
0 引 言
在高速实时数据信号处理领域,缓存是不可缺少的部分,利用FPGA外接DDR3 SDRAM(Synchronous Dynamic Random Access Memory) 进行大容量数据缓存是近期研究的热点。异步FIFO以其接口时序简单、易于操作、读写速度高等优点广泛应用于数据实时采集和跨时钟域数据传输的系统中。由于工艺的限制,常见的FIFO芯片或者FPGA内部的FIFO IP核容量非常有限,很难满足数据吞吐量较大的系统。DDR3 SDRAM具有集成度高、读写速度快、价格便宜等优点成为目前数据缓存的主流;但其操作复杂,增加了系统的开发周期和开发成本[1?2]。
本文提出基于FPGA的DDR3 SDRAM FIFO接口方案,该方案既具有DDR3 SDRAM容量大、成本低等优点又具有异步FIFO接口简单、易于操作的优点。从用户接口信号入手分析接口速度、接口效率和接口时序,在此基础上设计基于DDR3的FIFO接口,并编写测试程序对该设计进行遍历测试。目前,该方案已经在某项目的高速数据缓存中得到了应用。
1 DDR3 SDRAM
DDR3 SDRAM即同步动态随机存取存储器,同步是指Memory工作需要同步时钟,内部命令的发送与数据的传输都以它為基准;动态是指存储阵列需要不断的刷新来保证数据不丢失;随机是指数据不是线性依次存储,而是由指定地址进行数据读写。
与静态随机存储器(Static Random Access Memory,SRAM)靠双稳态触发器来记忆信息的原理不同,SDRAM是靠MOS电路中的栅极电容来记忆信息。由于电容上的电荷会泄漏,需要定时给与补充,所以SDRAM需要设置刷新电路。但SDRAM比SRAM集成度高、功耗低,成本也低,适于作大容量存储器[3?4]。表1为两种类型的存储器特点。
2 DDR3用户接口
本设计选用Micron公司MT41J128M16HA?15EIT 芯片,单片DDR3位宽16 b,深度128 Mb,即DDR3的容量为128 Mb×16 b=2 Gb。Xilinx DDR3控制器的作用是将双时钟沿触发接口转换为用户易操作的单时钟沿触发接口[5]。
2.1 DDR3接口速度
表2为Kintex?7 FFG封装系列FPGA在不同存储器类型、不同Bank类型、不同FPGA速度等级等条件下DDR3最大接口速率[2]。
从表1中可以得出如下结论:
(1) 同等条件下,4:1 DDR3接口控制器的速率要高于2:1 DDR3接口控制器的速率。
(2) 同等条件下,HP (High Performance)Bank对应接口控制器的速率要高于HR (High Range) Bank对应接口控制器的速率;设计时根据不同应用需求选择HP Bank还是HR Bank。
(3) 从文献[6]还可以看出,同等条件下,FFG封装的FPGA对应DDR3接口控制器的速率要高于FBG封装FPGA对应的DDR3接口控制器的速率。
2.2 DDR3接口效率
由于DDR3存在预充电、刷新、行激活等操作,所以DDR3就存在一个接口效率的问题。 如果不考虑开销,单纯从时钟和数据位宽的角度看,一个工作时钟为533 MHz,数据位宽为16 b的DDR3颗粒,由于接口是双倍数据速率(Double Data Rate,DDR),那么单片DDR3颗粒理论最大带宽为8.528 GB/s。但是,DDR3的读/写共用同一组数据总线,同时DDR3内部是以Bank/行/列的组织结构,读/写切换、同Bank不同行间切换都需要比较长的时间,同时不同指令之间也有各种时间间隙要求[7]。应用模式不同,DDR3接口效率差异非常大[8]。本文对相同Bank内单行写不同数量的burst数据进行分析研究。
测试方法为给Xilinx的DDR3控制器中输入指定的激励,利用chipscope查看读/写遍历DDR3所需要的时间,根据DDR3的容量和遍历读/写所用的时间计算出有效读写带宽。
本设计采用的DDR3的芯片一行对应1 024列。图1为单行写不同burst数量数据的示意图。图1(a)为每行写一个burst数据,然后切换到下一行,图1(b)为每行写2个burst数据,然后切换到下一行,图1(c)为每行写4个burst数据,然后切换到下一行。
相同Bank内单行写不同burst数量的读/写效率如表3所示。
经验证发现,Xilinx 的DDR3控制器对于按地址连续读/写,效率还是比较高,可以达到89%~90%之间,但是Xilinx的DDR3控制器对于DDR3的随机地址存储效率比较低。单行单个burst读/写操作,读/写效率只有9.8%~12%。对于一些需要随机读/写的应用,提高带宽的方法是避免同Bank行切换以及读/写频繁切换。
2.3 DDR3接口时序
Xilinx DDR3 控制器接口信号包括地址信号、写数据信号和读数据信号等。DDR3读/写共用同一个地址信号。Kintex?7系列FPGA 外接的DDR3 仅支持突发长度BL(Burst Length)为8,即一个地址对应读/写8个数据。DDR3 控制器内部由两部分组成,控制部分和数据部分。控制部分用于控制读操作还是写操作,读写地址是什么;数据部分用于传输要写入DDR3的数据或读出的数据[10]。
从图2可以得到连续写命令的控制要点如下:
(1) 当app_rdy(DDR3地址准备好信号)和app_en(DDR3地址使能信号)同时拉高时,写命令和写地址有效或者读命令和读地址有效,这根据app_cmd的值判断。
(2) 当app_wdf_rdy(DDR3写FIFO准备好信号)和app_wdf_en(DDR3写FIFO使能信号)同时拉高的时候,写入数据有效。
(3) 读命令和读有效相差14~20个时钟周期。
(4) Kintex?7系列的FPGA BL=8,写数据位宽和读数据位宽是颗粒位宽的8倍,所以一个命令地址对应一个数据。
3 DDR3 FIFO接口设计
由于本设计采用型号MT41J128M16HA?15EIT,单片位宽16 b,深度128 M,即DDR3的容量为128 Mb×16 b=16 Mb×128 b,因此可以将DDR3 FIFO接口模拟成一个深度为16 Mb,位宽128 b的FIFO。
图3为DDR3 FIFO接口模块框图。该模块主要由写FIFO(wr_fifo)、读FIFO(rd_fifo)和读控制模块(wr_rd_ctrl)三部分组成。本节利用硬件描述语言Verilog HDL阐述读/写控制模块在Kirtex?7中的主要实现过程。
wr_fifo 和rd_fifo的数据位宽和DDR3 控制器的用户接口位宽一致。笔者看到的就是FIFO接口,wr_fifo为写数据FIFO,用来缓存当DDR3 SDRAM 控制器处于非空闲状态时,外部发送过来的数据,以免造成数据丢失;rd_fifo 为读数据FIFO,用来缓存从DDR3 SDRAM 中讀出的数据。
为了防止DDR3 FIFO出现上溢或者下溢的现象,即防止FIFO写满或者读空,设计中使用计数器ddr3_wr_cnt表示DDR3 FIFO中当前缓存的数据个数。当DDR3 FIFO写操作时,ddr3_wr_cnt增加1;当DDR3 FIFO读操作时,ddr3_wr_cnt减少1;DDR3 FIFO读控制模块的部分Verilog代码如下:
if(ddr3_app_en_wr & (ddr3_wr_cnt < 32′h1000000))
ddr3_wr_cnt <= ddr3_wr_cnt + 1′b1;
else if(ddr3_app_en_rd & (ddr3_wr_cnt > 32′h0))
ddr3_wr_cnt <= ddr3_wr_cnt ? 1′b1;
读操作和写操作共用同一个app_addr地址和app_cmd命令。所以DDR3 FIFO不能同时读写。设计默认写数据优先级为高于读数据优先级,保证了缓存外部数据的实时性。
图4给出了读/写控制模块的状态机跳转图。状态描述如下:
(1) Idle 是状态机的初始状态。在这个状态中,等待DDR3校准完成,若完成,状态机跳入Check data in状态。
(2) Check data in状态:判断是否进行写DDR3操作,当wr_fifo 有数据且DDR3颗粒有空间并写ready时,跳入Write状态,否则跳入Check data out判断是否进行读DDR3操作。
(3) Write状态:在该状态读wr_fifo的数据并写入DDR3颗粒中。
(4) Check data out状态:在该状态判断是否进行读DDR3操作。当rd_fifo 有数据且DDR3颗粒有空间并读ready时,跳入Read状态,否则跳回Check data in状态,循环往复。
(5) Read状态: 在该状态读DDR3颗粒中的数据并写入rd_fifo中。
图5为DDR3遍历读写状态机跳转图。
状态描述如下:
(1) Idle 是状态机的初始状态。在这个状态中,等待DDR3校准完成,若完成,状态机跳入Write状态;否则继续在Idle状态等待。
(2) Write状态:对DDR3进行写操作遍历,写操作遍历完成,跳入Write_Done状态。
(3) Write_Done状态:读/写操作的中间状态,主要为计算DDR3的写操作效率而设计。
(4) Read状态:对DDR3进行读操作遍历,由于读命令和读数据有效之间有一定的时间延时,因此设计Read_Valid状态。
(5) Read_Valid状态:等待DDR3的读数据全部读出并比较输出数据的正确性。状态机继续跳入Write状态。循环遍历。其中设置如下寄存器完成对DDR3遍历读/写效率测试:
ddr3_test_cnt: 完成一次DDR3的读/写操作遍历,该计数器增1,用于查看遍历次数;
ddr3_error_flag:读数据校验出错为1,ddr3_error_cnt为ddr3_error_flag的计数器;
ddr3_wr/rd_time: ddr3遍历一遍写/读操作所需要的时间,用于计算DDR3的写/读效率。
利用板载Kintex?7 FPGA和DDR3 SRAM的板卡对本文设计的DDR3 FIFO模块进行读/写测试,即利用FIFO接口实现DDR3 SDRAM存储空间的遍历读写测试。图6是Kintex?7 FPGA中使用Chipscope捕获的DDR3 FIFO模块时序图。
4 结 语
本文设计的DDR3 FIFO模块具有标准FIFO功能,笔者利用该模块可以按照FIFO时序实现DDR3 SDRAM存储空间的遍历读写测试[9?10]。DDR3 FIFO与标准FIFO主要有两个不同点:DDR3 FIFO存储空间比标准FIFO大,本文设计的DDR3 FIFO容量为1 Gb,而FPGA内部标准FIFO容量为18 Kb或36 Kb;DDR3 FIFO 有读/写优先级,写优先级高于读优先级,而标准FIFO没有读/写优先级。
参考文献
[1] 马其琪,鲍爱达.基于DDR3 SDRAM的高速大容量数据缓存设计[J].计算机测量与控制,2015,23(9):3112?3118.
[2] 马游春,王悦凯,丁宁.基于DDR3 SDRAM的高速视频传输系统[J].电子技术应用,2015,41(12):69?71.
[3] 李逍楠.DDR3控制器的研究[D].西安:西安电子科技大学,2013.
[4] JEDEC Solid State Technology Association. JESD79?3F: DDR3 SDRAM specification [S]. Virginia: JEDEC Solid State Technology Association, 2012.
[5] Xilinx Co., Ltd. 7 series FPGAs memory interface solutions user guide [EB/OL]. [2012?10?20]. http://www.xilinx.com/support/documentation/ip_documentation/ug586_7Series_MIS.pdf.
[6] Xilinx Co., Ltd. Kintex?7 FPGAs data sheet: DC and AC switching characteristics [EB/OL]. [2015?02?11]. http://www.xilinx.com.
[7] 张刚,贾建超,赵龙.基于FPGA的DDR3 SDRAM控制器设计及实现[J].电子科技,2014,27(1):70?73.
[8] 殷晔,李丽斯,常路,等.基于FPGA的DDR3存储控制的设计与验证[J].计算机测量与控制,2015,23(3):969?971.
[9] Micron Technology Inc. DDR3 point?to?point design support [EB/OL]. [2013?06?13]. http://www.micron.com/~/media/Documents/Products/Technical%20Note/DRAM/tn4113_ddr3_point_to_point_design.pdf.
[10] Xilinx Co., Ltd. Achieving high performance DDR3 data rates in Virtex?7 and Kintex?7 FPGAs [EB/OL]. [2013?08?29]. http://www.xilinx.com/support/documentation/white_papers/wp383_Achieving_High_Performance_DDR3.pdf.