DDR3:使用流程
一. 配置过程
1>首先找到IP核
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201808/13290-388…; alt=""></center>
2>选择兼容的片子,这个ddr兼容K7系列的三个片子
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201808/13290-388…; alt=""></center>
3>选择ddr3
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201808/13290-388…; alt=""></center>
4>配置工作时钟部分
配置时钟前我们先了解一下ddr3的ip核的时钟关系,如下图,共三个时钟。Ip核心的工作时钟和参考时钟,必须直接连在电路板上,不可由IP核分频得到。
IP核的工作时钟常用频率:50M/200M(不必再选参考时钟)
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201808/13290-388…; alt="" width="670"></center>
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201808/13290-388…; alt=""></center>
①:通过周期调整DDR3工作时钟
②: 4:1和2:1部分,是选择用户的工作时钟
4:1 表示在DDR3工作时钟400M情况下用户时钟为100M
2:1 表示在DDR3工作时钟400M的情况下用户时钟为200M
③:选择DDR3器件型号
④:选择数据的位宽,需要根据器件而定,比如64M*16bit=128M的ddr3芯片,挂两片的位宽就是32bit
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201808/13290-388…; alt=""></center>
⑤:表示数据掩膜,与keep线类似。
⑥:DDR3的bank数量
5>配置IP核时钟
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201808/13290-388…; alt=""></center>
①表示:IP核的工作时钟,常用时钟50M、200M(可以不选择参考时钟) 必须直连板子
②表示:数据顺序
③表示:地址类型
6>继续配置时钟
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201808/13290-388…; alt=""></center>
①选择系统时钟的输入方式:单端or差分
②选择参考时钟,如果选择200M系统时钟,可以不选参考时钟直接使用系统时钟作为参考时钟
③选择复位高低有效
7>该配置引脚了
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201808/13290-388…; alt=""></center>
8>配置引脚
分别为:信号名称(由原理图决定)/bank号/Byte号/引脚号/然后校对一下
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201808/13290-388…; alt=""></center>
分配参考时钟引脚
二. ip核引脚说明
<div id="mytable">
<body>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top"><p align="center"><strong>引脚名称</strong></p></td>
<td valign="top"><p align="center"><strong>引脚方向</strong></p></td>
<td valign="top"><p align="center"><strong>备注</strong></p></td>
</tr>
<tr>
<td valign="top"><p>ddr3_addr</p></td>
<td valign="top"><p>output</p></td>
<td valign="top"><p> </p></td>
</tr>
<tr>
<td valign="top"><p>ddr3_ba</p></td>
<td valign="top"><p>output</p></td>
<td valign="top"><p> </p></td>
</tr>
<tr>
<td valign="top"><p>ddr3_cas_n</p></td>
<td valign="top"><p>output</p></td>
<td valign="top"><p> </p></td>
</tr>
<tr>
<td valign="top"><p>ddr3_ck_n</p></td>
<td valign="top"><p>output</p></td>
<td valign="top"><p> </p></td>
</tr>
<tr>
<td valign="top"><p>ddr3_ck_p</p></td>
<td valign="top"><p>output</p></td>
<td valign="top"><p> </p></td>
</tr>
<tr>
<td valign="top"><p>ddr3_cke</p></td>
<td valign="top"><p>output</p></td>
<td valign="top"><p> </p></td>
</tr>
<tr>
<td valign="top"><p>ddr3_ras_n</p></td>
<td valign="top"><p>output</p></td>
<td valign="top"><p> </p></td>
</tr>
<tr>
<td valign="top"><p>ddr3_reset_n</p></td>
<td valign="top"><p>output</p></td>
<td valign="top"><p>复位状态信号</p></td>
</tr>
<tr>
<td valign="top"><p>ddr3_we_n</p></td>
<td valign="top"><p>output</p></td>
<td valign="top"><p> </p></td>
</tr>
<tr>
<td valign="top"><p>ddr3_dq</p></td>
<td valign="top"><p>inout</p></td>
<td valign="top"><p> </p></td>
</tr>
<tr>
<td valign="top"><p>ddr3_dqs_n</p></td>
<td valign="top"><p>inout</p></td>
<td valign="top"><p> </p></td>
</tr>
<tr>
<td valign="top"><p>ddr3_dqs_p</p></td>
<td valign="top"><p>inout</p></td>
<td valign="top"><p> </p></td>
</tr>
<tr>
<td valign="top"><p>init_calib_complete</p></td>
<td valign="top"><p>output</p></td>
<td valign="top"><p>初始化完成信号</p></td>
</tr>
<tr>
<td valign="top"><p>ddr3_cs_n</p></td>
<td valign="top"><p>output</p></td>
<td valign="top"><p align="center"> </p></td>
</tr>
<tr>
<td valign="top"><p>ddr3_dm</p></td>
<td valign="top"><p>output</p></td>
<td valign="top"><p> </p></td>
</tr>
<tr>
<td valign="top"><p>ddr3_odt</p></td>
<td valign="top"><p>output</p></td>
<td valign="top"><p> </p></td>
</tr>
<tr>
<td valign="top"><p> </p></td>
<td valign="top"><p> </p></td>
<td valign="top"><p> </p></td>
</tr>
<tr>
<td valign="top"><p>app_addr</p></td>
<td valign="top"><p>input</p></td>
<td valign="top"><p>要操作地址每次step为8</p></td>
</tr>
<tr>
<td valign="top"><p>app_cmd</p></td>
<td valign="top"><p>Input</p></td>
<td valign="top"><p align="left">写000读001</p></td>
</tr>
<tr>
<td valign="top"><p>app_en</p></td>
<td valign="top"><p>Input</p></td>
<td valign="top"><p>使能信号</p></td>
</tr>
<tr>
<td valign="top"><p>app_wdf_data</p></td>
<td valign="top"><p>input</p></td>
<td valign="top"><p>写入的数据【255:0】</p></td>
</tr>
<tr>
<td valign="top"><p>app_wdf_end</p></td>
<td valign="top"><p>input</p></td>
<td valign="top"><p>last</p></td>
</tr>
<tr>
<td valign="top"><p>app_wdf_wren</p></td>
<td valign="top"><p>input</p></td>
<td valign="top"><p>写使能</p></td>
</tr>
<tr>
<td valign="top"><p>app_rd_data</p></td>
<td valign="top"><p>output</p></td>
<td valign="top"><p align="left">读出的数据【255:0】</p></td>
</tr>
<tr>
<td valign="top"><p>app_rd_data_end</p></td>
<td valign="top"><p>output</p></td>
<td valign="top"><p>最后一行一个上升沿last</p></td>
</tr>
<tr>
<td valign="top"><p>app_rd_data_valid</p></td>
<td valign="top"><p>output</p></td>
<td valign="top"><p>读有效</p></td>
</tr>
<tr>
<td valign="top"><p>app_rdy</p></td>
<td valign="top"><p>output</p></td>
<td valign="top"><p> </p></td>
</tr>
<tr>
<td valign="top"><p>app_wdf_rdy</p></td>
<td valign="top"><p>output</p></td>
<td valign="top"><p> </p></td>
</tr>
<tr>
<td valign="top"><p>app_sr_req</p></td>
<td valign="top"><p>input</p></td>
<td valign="top"><p>赋0</p></td>
</tr>
<tr>
<td valign="top"><p>app_ref_req</p></td>
<td valign="top"><p>input</p></td>
<td valign="top"><p>赋0</p></td>
</tr>
<tr>
<td valign="top"><p>app_zq_req</p></td>
<td valign="top"><p>input</p></td>
<td valign="top"><p align="left">赋0</p></td>
</tr>
<tr>
<td valign="top"><p>app_sr_active</p></td>
<td valign="top"><p>Output</p></td>
<td valign="top"><p> </p></td>
</tr>
<tr>
<td valign="top"><p>app_ref_ack</p></td>
<td valign="top"><p>Output</p></td>
<td valign="top"><p> </p></td>
</tr>
<tr>
<td valign="top"><p>app_zq_ack</p></td>
<td valign="top"><p>Output</p></td>
<td valign="top"><p> </p></td>
</tr>
<tr>
<td valign="top"><p>ui_clk</p></td>
<td valign="top"><p>output</p></td>
<td valign="top"><p>Usr的always时钟</p></td>
</tr>
<tr>
<td valign="top"><p>ui_clk_sync_rst</p></td>
<td valign="top"><p>output</p></td>
<td valign="top"><p>Usr的复位信号</p></td>
</tr>
<tr>
<td valign="top"><p>app_wdf_mask</p></td>
<td valign="top"><p>input</p></td>
<td valign="top"><p>Keep信号</p></td>
</tr>
<tr>
<td valign="top"><p> </p></td>
<td valign="top"><p> </p></td>
<td valign="top"><p> </p></td>
</tr>
<tr>
<td valign="top"><p>sys_clk_i</p></td>
<td valign="top"><p>input</p></td>
<td valign="top"><p>直连板子时钟</p></td>
</tr>
<tr>
<td valign="top"><p>clk_ref_i</p></td>
<td valign="top"><p>input</p></td>
<td valign="top"><p>直连板子时钟</p></td>
</tr>
<tr>
<td valign="top"><p>sys_rst</p></td>
<td valign="top"><p>input</p></td>
<td valign="top"><p>直连板子系统复位</p></td>
</tr>
<tr>
<td valign="top"><p> </p></td>
<td valign="top"><p> </p></td>
<td valign="top"><p> </p></td>
</tr>
<tr>
<td valign="top"><p> </p></td>
<td valign="top"><p> </p></td>
<td valign="top"><p> </p></td>
</tr>
</tbody>
</table>
</body>
</div>
三.时序分析
1>写时序:在app_rdy与app_wdf_ready都拉高后,便可以进行操作。下达写数据cmd拉一个app_en同时输入写入的数据和地址,值得注意的是:DDR允许写使能信号落后cmd两个时钟后期之内。但是还是建议写的数据和地址都在一个周期之内
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201808/13290-388…; alt="" width="670"></center>
2>读时序
先下达读命令,同时拉高一个app_en和addr。然后就等着有效信号等着读数据。下几个周期的指令,回几个周期的数据。
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201808/13290-388…; alt="" width="670"></center>
四.效果
做了一个往AADR0写入全F的数据,再读出的程序。效果如下:
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201808/13290-388…; alt="" width="670"></center>
文章转载自: https://blog.csdn.net/fzhykx/article/details/79642327