赞
踩
借用之前在CSDN看到的一位仁兄分享的博客内容,再来详细分析和解释一下在学习DDR3过程中的理解与体会。仁兄文章的链接不知道是啥了,在这里说声不好意思哈!
- mig_7series_0 u_mig_7series_0 (
-
- // Memory interface ports
- .ddr3_addr (ddr3_addr), // output [14:0]
- .ddr3_ba (ddr3_ba), // output [2:0]
- .ddr3_cas_n (ddr3_cas_n), // output
- .ddr3_ck_n (ddr3_ck_n), // output [0:0]
- .ddr3_ck_p (ddr3_ck_p), // output [0:0]
- .ddr3_cke (ddr3_cke), // output [0:0]
- .ddr3_ras_n (ddr3_ras_n), // output
- .ddr3_reset_n (ddr3_reset_n), // output
- .ddr3_we_n (ddr3_we_n), // output
- .ddr3_dq (ddr3_dq), // inout [63:0]
- .ddr3_dqs_n (ddr3_dqs_n), // inout [7:0]
- .ddr3_dqs_p (ddr3_dqs_p), // inout [7:0]
- .init_calib_complete (init_calib_complete), // output
-
- .ddr3_cs_n (ddr3_cs_n), // output [0:0]
- .ddr3_dm (ddr3_dm), // output [7:0]
- .ddr3_odt (ddr3_odt), // output [0:0]
- // Application interface ports
- .app_addr (app_addr), // input [28:0]
- .app_cmd (app_cmd), // input [2:0]
- .app_en (app_en), // input
- .app_wdf_data (app_wdf_data), // input [511:0]
- .app_wdf_end (app_wdf_end), // input
- .app_wdf_wren (app_wdf_wren), // input
- .app_rd_data (app_rd_data), // output [511:0]
- .app_rd_data_end (app_rd_data_end), // output
- .app_rd_data_valid (app_rd_data_valid), // output
- .app_rdy (app_rdy), // output
- .app_wdf_rdy (app_wdf_rdy), // output
- .app_sr_req (app_sr_req), // input
- .app_ref_req (app_ref_req), // input
- .app_zq_req (app_zq_req), // input
- .app_sr_active (app_sr_active), // output
- .app_ref_ack (app_ref_ack), // output
- .app_zq_ack (app_zq_ack), // output
- .ui_clk (ui_clk), // output
- .ui_clk_sync_rst (ui_clk_sync_rst), // output
- .app_wdf_mask (app_wdf_mask), // input [63:0]
- // System Clock Ports
- .sys_clk_i (sys_clk_i),
- .sys_rst (sys_rst) // input
- );

这段代码就是举个例子,例化的接口代码用于下面讲解时的参考对照,按照需求设计的IP核不同,接口引脚也不太一样,但是相差不大。
1. 打开IP Catalog然后搜索mig,如下图所示:
2. 如下图所示,首先是确认工程的信息,主要是芯片信息和编译环境的信息,如果没什么问题,直接点击“Next”。
3. 如下图所示,选择“Create Design”,在“Component Name”一栏设置该 IP 元件的名称,这里取默认软件的名称,再往下选择控制器数量,默认为“1”即可。最后关于 AXI4 接口,因为本工程不去使用AXI4 接口,所以不勾选。配置完成点击“Next”。
4. 如下图所示,该页主要是选择可以兼容的芯片,本工程默认不勾选,即不需要兼容其他的 FPGA芯片。配置完成点击“Next”。
5. 如下图所示,因为我们要用 DDR3 芯片,所以选择第一个选项“DDR3 SDRAM”,配置完成后点击“Next”。
6. 如下图所示,从这页开始,就开始正式配置MIG IP 核的各个参数了。
7.上面的配置好之后,点击“NEXT”按钮,进入如下界面:
8.上面的配置好之后,点击“NEXT”按钮,进入如下界面:
9.继续点击“NEXT”按钮,界面如下图所示。
10.以上是高性能 bank 端接匹配阻抗的设置,这里不去改它,默认 50 欧姆即可。接下来点击“NEXT”按钮,界面如下图所示。
这里第一个选项是系统分配它认为的最合适的管脚(如果只是仿真,可以选择这个),第二个选项是由用户自己分配管脚。我这里只看仿真,固选择了第一个。
11.接下来一直点击next即可。
12.点击next即可。
13.点击next即可。
14.先点击accept,再点击next即可。
15.点击next即可。
16.点击generate即可。
17.点击generate生成MIG IP核。
18.等待综合完成后,如下图所示,右键选择Open IP Example Design,即可打开Xilinx官方提供的MIG IP核读写例程。
19.紧接着选择MIG IP核读写例程的存放路径 ,点击OK。
只有在app接口上的app_rdy端口输出为高时,才能操作命令。当app_rdy为高,app_en拉高后,命令会写入命令FIFO中。读写指令如下:
有些兄弟可能不太明白命令FIFO是怎么回事,看下面这个PHY interface 的图就明白了,在用户和DDR3 SDRAM之间的PHY就是这样的结构。
之前我们说过,PHY to Controller Clock Ratio 这个参数分4:1和2:1两个mode,两者的写时序不同。
有三种写模式,要注意的是第三种方式:数据最晚在命令有效后的两个时钟周期写入。
连续写入就如下图所示:
数据手册上还列举的数据在DRAM接口的采样示例(手册上的图片也不清楚,看文字说明吧):在应用程序界面,如果64位数据驱动为0000_0806_0000_0805 (Hex),则DRAM界面的数据如图1-75所示。这是针对突发长度8 (BL8)事务。
DDR模式,上下沿采样,共用了四个时钟:
对于2:1模式,应用程序数据宽度为32位。因此,对于BL8事务,应用程序接口上的数据必须在两个时钟周期内提供。第二个数据拉高app_wdf_end信号,如中所示图1 - 76。在本例中,第一个周期提供的应用程序数据是0000_0405(十六进制),,而最后一个周期提供的数据是0000_080A (Hex)。这是针对BL8事务的。如下图:app_wdf_end信号必须用于指示内存写入突发事件的结束。对于2:1模式下的8个内存突发类型,app_wdf_end信号必须在第二个写数据字上拉高。
DRAM接口数据采样,如图:
对于读时序没啥好说的,app_rd_data_valid输出高时,数据有效,如下图:(2:1和4:1没区别,当app_rd_data_valid为高时,接收数据就行了)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。