kaiyun官方注册
您所在的位置: 首页> 可编程逻辑> 设计应用> 基于FPGA与DDR2 SDRAM的大容量异步FIFO缓存设计
基于FPGA与DDR2 SDRAM的大容量异步FIFO缓存设计
来源:微型机与应用2011年第4期
庾志衡1,叶俊明2,邓迪文3
(1. 桂林电子科技大学 电子工程与自动化学院,广西 桂林 541004; 2. 桂林电子科技大学
摘要:为了满足高速实时数据采集系统对所采集海量数据进行缓存的要求,通过研究FIFO的基本工作原理,利用FPGA和DDR2 SDRAM设计了一种高速大容量异步FIFO。使用Xilinx提供的存储器接口生成器(MIG)实现FPGA与DDR2的存储器接口,并结合片上FIFO和相应的控制模块完成FIFO的基本框架结构。详细介绍了各个组成模块的功能和原理,并设计了专门的测试模块。
Abstract:
Key words :

摘 要:为了满足高速实时数据采集系统对所采集海量数据进行缓存的要求,通过研究FIFO的基本工作原理,利用FPGADDR2 SDRAM设计了一种高速大容量异步FIFO。使用Xilinx提供的存储器接口生成器(MIG)实现FPGA与DDR2的存储器接口,并结合片上FIFO和相应的控制模块完成FIFO的基本框架结构。详细介绍了各个组成模块的功能和原理,并设计了专门的测试模块。
关键词:高速大容量异步FIFO; MIG; FPGA; DDR2 SDRAM

 异步FIFO作为数据缓存被广泛应用于高速实时数据采集、不同时钟域之间的高性能数据传输以及多机处理等系统中[1]。如在视频系统中用于视频信号转换、视频分割和画中画电视[2]。在高速传感信号实时检测处理系统中用于数据缓存等。随着微电子技术的发展,FIFO芯片也在向着高速、大容量、小体积、低成本的方向发展。特别是Xilinx FPGA 提供的FIFO IP核已经能够达到500 MHz的速率和4 MB的容量。这些都为FIFO的实际工程应用提供了广阔的空间。但是在某些价格敏感、要求海量数据缓存的高速系统中,出于价格和性能方面的考虑,大容量异步FIFO芯片并非这类设计的最佳选择。FPGA具有工作速度高、可配置性强、灵活性好等突出优点,使用Xilinx FPGA 提供的免费MIG IP核可以很容易实现FPGA与外部存储器之间的接口,而DDR2 SDRAM具有单位空间存储容量大、高数据带宽、价格便宜等优点。因此根据FIFO的基本原理,通过采用Xilinx FPGA器件和Micron公司的256MB DDR2 SDRAM MT4HTF3264HY-667设计并实现了一种异步FIFO。该FIFO具有价格相对便宜、高数据带宽、容量大、数据位宽可以根据需要进行相应灵活配置等特点,具有较高的工程实用价值。
1 大容量异步FIFO系统方案设计
设计主要由两块片上FIFO、两块数据位宽转换模块、FIFO控制器、DDR2 SDRAM控制器、时钟模块和外部的DDR2 SDRAM构成[3]。其整体结构框图如图1所示。

基本工作机理是当WR_EN有效为高电平,输入数据DIN[N:0]在WR_CLK的上升沿触发下经过“数据位宽转换模块1”之后输出位宽为128 bit的数据写入到位宽为128 bit,深度为2 K的“片上FIFO1”中。当FIFO控制器检测到“片上FIFO1”快满时,开始读取其中的数据,按照地址顺序递增的方式通过DDR2 SDRAM控制器写入到DDR2 SDRAM中,直到“片上FIFO1”被取空。当FIFO控制器检测到“片上FIFO2”快空时,通过DDR2 SDRAM控制器按照地址顺序递增读取DDR2 SDRAM中的数据,写入到“片上FIFO2”中,直到“片上FIFO2”被写满为止。DDR2 SDRAM只有一组地址总线,而在该项设计中需要对DDR2 SDRAM进行独立的读写操作。为此,在FIFO控制器中定义了两组地址总线用于分别记录读写操作地址,当FIFO控制器处于写DDR2 SDRAM状态时,选通写地址总线(wr_addr)与DDR2 SDRAM的地址总线(ddr2_addr)互联。当FIFO控制器处于读DDR2 SDRAM状态时,选通读地址总线(rd_addr)与DDR2 SDRAM的地址总线(ddr2_addr)互联。另外为了保证读数据有效,在FIFO控制器中设计有相应的限制语句,只有当读地址(rd_addr)小于写地址(wr_addr)时,才允许读DDR2 SDRAM中的数据。“片上FIFO2”的空满标志信号作为所设计的FIFO的空满标志信号。从外部看,该设计是一个具有标准接口的大容量异步FIFO,而不用关心其内部操作。而且只需要对数据转换模块中的相关参数进行简单的改动,便可以改变该大容量异步FIFO的位宽(THE WIDTH)。
2 高速大容量异步FIFO设计
如图1所示,设计主要集中在FPGA部分,包括数据位宽转换模块、FIFO控制器、时钟模块、DDR2 SDRAM控制器设计以及片上FIFO的定制。
2.1 DDR2 SDRAM控制器设计
存储器控制器需要对包括存储器控制状态机在内的所有构建模块加以集成。控制器状态机必须按正确顺序发出命令,同时还要考虑存储器器件的时序要求。而且存储器控制器状态机因存储器架构(DDR、DDR2、QDRII、RLDRAM等)、组数(BANK)、数据总线宽度、存储器器件的宽度和深度、组和行存取算法等变量的不同而异。因此,创建存储器控制器是一项极其复杂、精细的任务。
使用MIG(Memory Interface Generation)软件工具[4]可以生成一个完整的设计,减少了设计人员的工作量,简化了系统设计。设计人员通过在MIG GUI中设置系统和存储器参数,整个过程不用一分钟,MIG工具即可生成存储控制器有关的RTL和UCF文件。MIG设计流程如图2所示。

设计采用Xilinx提供的免费IP核 MIG2.3来设计DDR2 SDRAM控制器。所用FPGA为Virtex-5 FPGA XC5vlx110T。控制器原理框图如图3所示。

其中时钟&复位模块(Infrastructure)用于生成控制器所需要的各类时钟和复位信号,它的输入时钟可根据用户需求选择单端或差分时钟信号输入。延时控制单元(Idelay_ctrl)用于同步校准设计中的延时单元以减少功耗。状态控制单元(Ctrl)是控制器中的最关键单元,它生成DDR2 存储器接口和用户接口所必需的所有控制信号。物理层控制单元(Phy_top)是设计的物理层接口的顶层模块,它封装了FPGA 与 DDR2 SDRAM的物理接口信号。用户接口单元(Usr_top)作为设计中的用户接口,用于接收和存储用户数据、命令和地址信息。最终将复杂的DDR2 SDRAM访问操作封装成简单的读写两种操作。设计采用的Micron DDR2 SDRAM SODIMM MT4HTF3264HY-667容量为256MB、带宽5.3 GB/S、数据位宽64 bit、含10位列地址线、13位行地址线和2位BANK地址线。上述MIG控制器右侧信号端口用于连接DDR2 SDRAM物理引脚,右侧信号端口用于连接输入时钟和来自FIFO控制器的数据和控制信号线。这些端口类型和位宽刚好与所选定的MT4HTF3264HY-667相匹配。
2.2 片上FIFO设计
所设计的FIFO数据输入/输出端与外界的数据传输、FPGA与DDR2 SDRAM间的通信分别属于不同的时钟域,设计中通过采用两块小容量片上FIFO[5]作为缓冲来实现他们之间的跨时钟域数据传输。根据所选定DDR2 SDRAM的性能参数,两块片上FIFO的数据位宽设置为128 bit,深度1 kHz。
2.3 FIFO控制器设计
FIFO控制器用于控制两块片上FIFO与DDR2 SDRAM之间的数据通信,其状态转移图如图4所示。由于DDR2 SDRAM具有很高的数据带宽,MT4HTF3264-667的带宽为5.3 GB/S。远大于FIFO1输入/输出端的数据带宽。所以FIFO控制器根据两块片上FIFO的数据量状况,对DDR2 SDRAM总线进行分时复用。

该状态机工作过程为:
(1)系统上电或复位后,状态机进入空闲状态(idle),在该状态下输入端片上FIFO1读使能信号(rd_en_wrfifo)、输出端片上FIFO2写使能信号(wr_en_rdfifo),DDR2 SDRAM控制器的用户地址FIFO使能信号(app_af_wren),用户数据FIFO使能信号(app_wdf_wren)均无效。
(2)在空闲状态下,当检测到输入端片上FIFO1几乎满,并且DDR2 SDRAM控制器初始化完毕,控制器发送写DDR2 SDRAM命令(cmd =3’b000)。将读到的数据直接写入DDR2 SDRAM由于DDR2 SDRAM控制器突发长度为4,地址总线按4累加。当检测到片上FIFO1被取空时,回到空闲状态。
(3)在空闲状态,当检测到输出端片上FIFO2几乎空,并且没有检测到输入端片上FIFO1几乎满时,开始读DDR2 SDRAM中的数据,并将读出的数据写入到输出端片上FIFO2。待FIFO2写满后,回到空闲状态。
2.4 时钟模块设计
控制器所需要的系统时钟(sys_clk)和200 MHz时钟(idly_clk_200)由外部33 MHz时钟信号通过FPGA的全局时钟网络后,分别输入到两个定制好的DCM后输出生成。
2.5 数据位宽转换模块设计
该模块用于匹配N位的输入/输出数据位宽和两个片上FIFO的128 bit数据位宽,实现所设计的大容量异步FIFO位宽可配置功能。输入端数据位宽转换模块的基本工作机理是将在WR_CLK时钟作用下连续输入的128/N个数据按先后顺序由高到低组成128 bit数据输出到片上FIFO1的数据输入端口,同时生成一个时钟上升沿作为FIFO1的写时钟,将该128 bit宽数据写入到片上FIFO1中。输出端数据位宽转换模块将从片上FIFO2读到的128 bit宽数据是由高到低依次拆分为128/N个N位宽数据,并且在RD_CLK上升沿先后输出这些数据。当这些数据输出完毕后,该模块输出一个上升沿脉冲作为输出端片上FIFO2的读时钟信号,读取下一个128 bit宽的数据。
3 实验测试
为了测试系统的性能,设计了专门的测试系统对所设计的FIFO进行测试,如图5所示。

基本工作机理是,在FPGA内部定制一块存有4KB已知数据的嵌入式ROM。该ROM在时钟CLK和循环地址计数器的作用下输出数据流,该数据流经过待验证的FIFO缓存后,通过串口发送到上位机上显示。通过比较上位机接收到的数据与ROM中存储的数据是否一致,便可以判断系统设计是否正确。
分别对不同位宽的FIFO,通过改变ROM的时钟CLK模拟生成FIFO的高低速率输入数据流,进行反复的实验测试,结果表明上位机上接收到的数据与ROM中存储的数据是一致的。
参考文献
[1] 金明,罗飞路,朱霞飞.FIFO芯片在高速系统中的应用[J].电子技术应用,1998,24(3):61-62.
[2] 郭照南,李儒峰.FIFO 芯片AL422B在视频系统中的应用[J].湖南工程学院学报, 2002,12(1):37-38.
[3] 徐欣,周舟,李楠,等.基于DDR2 SDRAM的高速大容量异步FIFO的设计与实现[J].中国测试,2009,35(6):34-37.
[4] Memory interface solutions user guide. http://www.xilinx.com/support/documentation/ip_documentation/ug086.pdf.
[5] LogiCORE? IP FIFO Generator v6.2. http://www.xilinx.com/support/documentation/ip_documentation/fifo_generator_ug175.pdf.

此内容为AET网站原创,未经授权禁止转载。
Baidu
map