DDR3:使用流程
一. 配置过程
1>首先找到IP核

2>选择兼容的片子,这个ddr兼容K7系列的三个片子

3>选择ddr3

4>配置工作时钟部分
配置时钟前我们先了解一下ddr3的ip核的时钟关系,如下图,共三个时钟。Ip核心的工作时钟和参考时钟,必须直接连在电路板上,不可由IP核分频得到。
IP核的工作时钟常用频率:50M/200M(不必再选参考时钟)


①:通过周期调整DDR3工作时钟
②: 4:1和2:1部分,是选择用户的工作时钟
4:1 表示在DDR3工作时钟400M情况下用户时钟为100M
2:1 表示在DDR3工作时钟400M的情况下用户时钟为200M
③:选择DDR3器件型号
④:选择数据的位宽,需要根据器件而定,比如64M*16bit=128M的ddr3芯片,挂两片的位宽就是32bit

⑤:表示数据掩膜,与keep线类似。
⑥:DDR3的bank数量
5>配置IP核时钟

①表示:IP核的工作时钟,常用时钟50M、200M(可以不选择参考时钟) 必须直连板子
②表示:数据顺序
③表示:地址类型
6>继续配置时钟

①选择系统时钟的输入方式:单端or差分
②选择参考时钟,如果选择200M系统时钟,可以不选参考时钟直接使用系统时钟作为参考时钟
③选择复位高低有效
7>该配置引脚了

8>配置引脚
分别为:信号名称(由原理图决定)/bank号/Byte号/引脚号/然后校对一下

分配参考时钟引脚
二. ip核引脚说明
引脚名称 |
引脚方向 |
备注 |
ddr3_addr |
output |
|
ddr3_ba |
output |
|
ddr3_cas_n |
output |
|
ddr3_ck_n |
output |
|
ddr3_ck_p |
output |
|
ddr3_cke |
output |
|
ddr3_ras_n |
output |
|
ddr3_reset_n |
output |
复位状态信号 |
ddr3_we_n |
output |
|
ddr3_dq |
inout |
|
ddr3_dqs_n |
inout |
|
ddr3_dqs_p |
inout |
|
init_calib_complete |
output |
初始化完成信号 |
ddr3_cs_n |
output |
|
ddr3_dm |
output |
|
ddr3_odt |
output |
|
|
|
|
app_addr |
input |
要操作地址每次step为8 |
app_cmd |
Input |
写000读001 |
app_en |
Input |
使能信号 |
app_wdf_data |
input |
写入的数据【255:0】 |
app_wdf_end |
input |
last |
app_wdf_wren |
input |
写使能 |
app_rd_data |
output |
读出的数据【255:0】 |
app_rd_data_end |
output |
最后一行一个上升沿last |
app_rd_data_valid |
output |
读有效 |
app_rdy |
output |
|
app_wdf_rdy |
output |
|
app_sr_req |
input |
赋0 |
app_ref_req |
input |
赋0 |
app_zq_req |
input |
赋0 |
app_sr_active |
Output |
|
app_ref_ack |
Output |
|
app_zq_ack |
Output |
|
ui_clk |
output |
Usr的always时钟 |
ui_clk_sync_rst |
output |
Usr的复位信号 |
app_wdf_mask |
input |
Keep信号 |
|
|
|
sys_clk_i |
input |
直连板子时钟 |
clk_ref_i |
input |
直连板子时钟 |
sys_rst |
input |
直连板子系统复位 |
|
|
|
|
|
|
三.时序分析
1>写时序:在app_rdy与app_wdf_ready都拉高后,便可以进行操作。下达写数据cmd拉一个app_en同时输入写入的数据和地址,值得注意的是:DDR允许写使能信号落后cmd两个时钟后期之内。但是还是建议写的数据和地址都在一个周期之内

2>读时序
先下达读命令,同时拉高一个app_en和addr。然后就等着有效信号等着读数据。下几个周期的指令,回几个周期的数据。

四.效果
做了一个往AADR0写入全F的数据,再读出的程序。效果如下:

文章转载自: https://blog.csdn.net/fzhykx/article/details/79642327