1 大容量异步FIFO系统方案设计
设计主要由两块片上FIFO、两块数据位宽转换模块、FIFO控制器、DDR2 SDRAM控制器、时钟模块和外部的DDR2 SDRAM构成[3]。其整体结构框图如图1所示。

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所示。


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所示。

分别对不同位宽的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.