Spartan6 DDR占用MCB资源(硬核资源),7系列占用MIG资源;
1.添加IP
博文较多,此处至重点介绍其中关键信息;
Clock Period : 指的是IP核给DDR3的时钟,和速度等级有关,-n,其中n越大则最高频率越大。
PHY to Controler Clock Ratio :MIG内部datapath的时钟与DDR3的工作时钟之间的比例。ui_clk是MIG内部输出给用户端的时钟,同输入给datapath的时钟,也即ui_clk :ddr3_clkp,n = 1:4
Memory Part :若用的DDR选项里没有,可以先点击Creat Custom Part 进行创新建。
Input Clock Period :用户给IP核的时钟。
Systerm Clock :系统时钟,进过PLL后传输给DDD3;单端且来自本模块,推荐选择No Buffer
Reference Clock :参考时钟,用于生成往datapath(IP核里面逻辑)里面写的时钟和IP核输出给用户的时钟;在Systerm Clock=200M的时候,参考时钟可以用系统时钟。
Global :编译这个IP和工程
Out of context per IP :单独编译IP
2.IP和初始化仿真
Add source --> Creat File
添加例化MIG文件
mig_7series_0_mig u_mig_7series_0_mig (
// Memory interface ports
.ddr3_addr (ddr3_addr),
.ddr3_ba (ddr3_ba),
.ddr3_cas_n (ddr3_cas_n),
.ddr3_ck_n (ddr3_ck_n),
.ddr3_ck_p (ddr3_ck_p),
.ddr3_cke (ddr3_cke),
.ddr3_ras_n (ddr3_ras_n),
.ddr3_reset_n (ddr3_reset_n),
.ddr3_we_n (ddr3_we_n),
.ddr3_dq (ddr3_dq),
.ddr3_dqs_n (ddr3_dqs_n),
.ddr3_dqs_p (ddr3_dqs_p),
.init_calib_complete (init_calib_complete),
.ddr3_cs_n (ddr3_cs_n),
.ddr3_dm (ddr3_dm),
.ddr3_odt (ddr3_odt),
// Application interface ports
.app_addr (app_addr),
.app_cmd (app_cmd), //命令控制信号
.app_en (app_en), //命令,地址使能信号
.app_wdf_data (app_wdf_data),
.app_wdf_end (app_wdf_end), //写数据的最后一个数,类似于突发指示的功能,因为用户接口没有突发长度指示;每一次传输只能传输128bit的数据,可以根据app_end来判断哪些有效。7系列以上MIG只有8突发一种形式。
.app_wdf_wren (app_wdf_wren),
.app_rd_data (app_rd_data),
.app_rd_data_end (app_rd_data_end),
.app_rd_data_valid (app_rd_data_valid),
.app_rdy (app_rdy), //该信号表示IP核是否准备好接受数据,当它与app_en同时有效时写数据有效,针对于命令
.app_wdf_rdy (app_wdf_rdy), //写数据准备好信号指示,针对于数据
.app_sr_req (app_sr_req),
.app_ref_req (app_ref_req), //refresh 的request,刷新的请求;一般用不上填0即可,因为刷新MIG可以自动完成,如果人为需要刷新,1个周期的1即可
.app_zq_req (app_zq_req),
.app_sr_active (app_sr_active),
.app_ref_ack (app_ref_ack),
.app_zq_ack (app_zq_ack),
.ui_clk (ui_clk), //ip核输出给用户的时钟
.ui_clk_sync_rst (ui_clk_sync_rst), //IP核输出的同步复位
.app_wdf_mask (app_wdf_mask),
// System Clock Ports
.sys_clk_p (sys_clk_p),
.sys_clk_n (sys_clk_n),
// Reference Clock Ports
.clk_ref_p (clk_ref_p),
.clk_ref_n (clk_ref_n),
.sys_rst (sys_rst)
);
地址映射关系
可以看到app_addr有28根地址线全部用上,cow address有10bit,row address有15bit和DDR3对应。所以第一个128bit数据传输完成之后吗,下一次连续传输地址+8;MIG内部会自行将输入进来的128bit的数据转化为8个16bit的数据写入DDR3中,地址也是MIG内部自动走动分配的,只需要给出8个首地址即可。
写时序图
有地址和数据关三种写入方式,1对应数据和命令同时给出,2对应数据先于数据给出,3对应数据在命令给出之后给出,第三种方式数据最晚不能晚于命令给出的两个周期后给出。这样会发现每次写一个128bit的数据时,由于MIG的突发长度固定位8,因此对于位宽16bit的DDR3来说,第一个128bit里面也包含了该次写入的最后一个数据,因此app_end信号始终有效;
下面以1. app_data64 位,DDR3位宽为8位,PHY to controller clock ratio = 4:1介绍详细app_end的不同情况(from UG586):
这种情况下由于时钟比例是4:1,因此每个64bit数据既是本次突发的第一个数据也是本次突发的最后一个数据,因此aa_end始终有效。
2. app_data32 位,DDR3位宽为8位,PHY to controller clock ratio = 2:1
总线位宽为32bit,因此在传输第二个32bit数据时才会有app_end有效,注意MIG中突发长度固定位8,当DDR3位宽为8时,每一次传输会传输M8*8(BL)=64bit数据。