一、先了解几个时钟
如上图,包含了四个时钟:
1)系统时钟,即MIG核工作时钟,通常命名sys_clk;
2)参考时钟,即MIG核参考时钟,通常命名ref_clk,必须是200MHz;
3)DDR芯片工作时钟,由FPGA输出给DDR的差分时钟,可以命名ddr_clk;
4)用户时钟,MIG核输出给用户端的时钟,通常命名ui_clk。
注意1:ddr_clk与ui_clk有比例关系,ddr_clk:ui_clk = 4:1或2:1,当ddr_clk=800MHz时,只能是4:1。
注意2:用户数据位宽如何计算,例如ddr_clk=800MHz时,ui_clk = 200MHz,ddr物理位宽为16bit(2片ddr菊花链连接就是32bit),上下沿采集(2倍),因此用户数据位宽=800*32*2/200=256bit。
注意3:256bit/32bit=8,所有ddr用户地址每次加8。
二、MIG核的配置
(1)配置界面1
如果是zynq,需要用到ps的话就勾选,否则不勾选,本工程选的zynq芯片但是没有用PS,则不勾选。
(2)配置界面2
默认不勾选。
(3)配置界面3
跟所选DDR类型有关,本工程选择DDR3。
(4)配置界面4
1:DDR芯片工作时钟(ddr_clk);
2:选择所使用的DDR型号;
3:本工程使用MT41K256M16TW-107 AAT,如果2中没有实际应用的DDR型号,现在列表中选择一个相似的名称,可通过3对实际使用的DDR命名,并结合实际封装进行配置,如下;
4:2片ddr菊花链连接就是32bit。
(5)配置界面5
用户数据宽度,见前述计算方式,不再赘述。(注意:配置界面1没有勾选AXI则无此界面,忽略就行)。
(6)配置界面6
提供给MIG核的系统时钟,通常与参考时钟相同200MHz,注意每次重新打开mig核,这个值都会变化,一定要重新配置成200MHz(VIVADO的bug)。
(7)配置界面7
时钟结合实际来就行。
(8)配置界面8
(9)配置界面9
选择DDR物理管脚约束方式。
(10)配置界面10
导入——>验证——>下一步。也可在Pin Number列做适当修改后再验证——>下一步。
三、仿真
(1)ready信号
如上2个图,ddr读出数据需要23(24?)个时钟周期(rdy拉高时的周期数)。
(2)app_wdy_data与app_rdy
如上图,写指令与写数据是两个通道,app_wdy_data与app_rdy不需要关联上,官方时序图与官方案例仿真对应不上。(猜测:MIG内部有类似fifo的功能,可以将写入的数据缓存,等待app_rdy拉高再写入对应的地址?)
(3)app_wdf_end、app_wdf_wren、app_en、app_cmd
上5张图中,注意app_wdf_end、app_wdf_wren、app_en、app_cmd时序,在读写期间如果一直拉高会报错!!!!!
四、工程实践
(1)搭建工程
往DDR写一组数,然后读出来,配置如前。
在implementation时可能会报如上错误,则缺啥补啥,在如下路径中搜索相应文件添加到那个路径下即可。
(2)上板测试
1)写功能
写时序ila如下,跟UG手册一致。
2)读功能
读时序ila如下,跟UG手册一致。
五、参考
Xilinx vivado DDR3 MIG IP核中系统时钟、参考时钟解释及各个时钟的功能详解