DDR作为常用IP,一般用于数据缓存,平滑带宽。本文以Altera DDR3 IP核为例,讲述其IP核配置、仿真及需要注意的时序要求,欢迎各位探讨、研究、拍砖。
FPGA器件型号:Cyclone5
DDR型号 :MICRON MT41K256M16HA
Quartus版本 :Quartus Prime 16.1 Standard Edition
1 IP核配置
(1)PHY Settings
Speed Grade:速度等级,和FPGA芯片有关。
Memory clock frequency:给DDR的时钟频率。
Achieved memory clock frequency:PLL生成的驱动外部DDR的实际频率(memory clock)。
PLL reference clock frequency:FPGA时钟引脚输入的时钟,供给DDR的PLL使用的时钟频率(关键设置);
Rate on Avalon-MM interfere:(关键设置)
Full——用户侧逻辑部分数据位宽x2,速度/2,达到了降频的目的;
Half——用户侧逻辑部分数据位宽x4,速度/4,达到了降频的目的;
Achieved local clock frequency:PLL生成的驱动本地接口的实际频率(AFI clock);
Additional address and command clock phase:是否允许地址、控制信号有相位的移动(是否需要设计待确认,默认不设置);
Supply voltage:提供电压,和DDR3芯片有关;
PLL sharing mode:指是否与IP核外部的PLL公用,如果公用的话会有相应的引脚从IP核引出——一般No sharing,不共用。
DLL sharing mode,OCT sharing mode同上。
(2)Memory Parameters和Memory Timing
对于Memory Parameters和Memory Timing,当在IP核配置页面左方library中,选定DDR型号(如本文MICRON MT41K256M16HA),点击Apply,即实现具体DDR器件和参数匹配,无需再设置,如下图。
(3)Board Settings
Board Settings:Use Altera’s default settings,保持默认即可。
(4)Controller Settings
Maximum Avalon-MM burst length:设定Avalon-MM总线的最大突发长度;
Local-to-memory address mapping:CHIP-ROW-BANK-COL,Avalon-MM地址映射方式,涉及到DDR的读写效率(Xilinx MIG IP Core映射为ROW-COL-BANK时,效率最高)。
Command queue look-ahead depth:有效范围1~16,较大值会提高Bank管理的效率,但也会占用更多的资源;
Enable reordering:勾选,会提高控制器效率;
Starvation limit for each command:指定等待命令执行前能够执行的命令数,有效范围1~64。
若想提高控制器效率,就从调节efficiency选项下参数着手。
(5)Diagnostics
Diagnostics:仿真相关参数设置,Auto-calibration mode:Skip calibration,跳过校验,其他保持默认即可。
IP核参数配置完成,点击生成IP即可。
2 IP核仿真
(1)打开Quartus,点击File → Open Project,打开刚才生成的仿真文件:generate_sim_example_design.qpf
(2)选择Tools → Tcl Scripts,点击generate_sim_verilog_example_design.tcl,click "Run"即可。
(3)打开modelsim,切换目录:xxx/simulation/verilog/mentor
(4)敲tcl命令:do run.do即可。
3 Tips:
(1)对于写传输,要在avl_ready有效时,avl_burstbegin,avl_addr,avl_write_req,avl_wdata,avl_be信号才有效;
(2)avl_burstbegin为突发传输起始标志位(读、写突发共用),不受avl_ready的影响,在发起一次读或写操作,只需保持一个clk有效,并且不管avl_ready状态如何;
(3)但是,对于读或写请求,avl_write_req,avl_read_req,每次发读写请求时,必须保证avl_ready是有效状态,读写请求才能被DDR控制器接收;
(4)对于写请求avl_write_req,必须保持到写数据完成,才能拉低;
(5)对于读请求avl_read_req,只需在avl_ready有效时,将读请求发出去即可,不用一直有效;
(6)avl_size为突发读写的最大数据量,可以在IP核中设置,可以设置为最大值,之后在逻辑中灵活配置;
(7)avl_addr为突发传输的首地址,所以每次突发传输,只需给出其首地址,随后地址自动递增。