赞
踩
Spartan6 DDR占用MCB资源(硬核资源),7系列占用MIG资源;
博文较多,此处至重点介绍其中关键信息;
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
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数据。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。