一、接口简介
打开官方文件,官方已经给出接口和例化方式。
这里下载官方文件 ug586-7Series-MIS.pdf
下图是官方文档的接口示意图。ddr3开头的都是要接到ddr3上的只需要按照电路设置IO口即可,我们只需要控制左侧接口。
每个接口的详细介绍可以去看官方文档
下面是我对每个接口的简单理解
module mig_7series_0 (
// Inouts
inout [31:0] ddr3_dq,
inout [3:0] ddr3_dqs_n,
inout [3:0] ddr3_dqs_p,
// Outputs
output [14:0] ddr3_addr,
output [2:0] ddr3_ba,
output ddr3_ras_n,
output ddr3_cas_n,
output ddr3_we_n,
output ddr3_reset_n,
output [0:0] ddr3_ck_p,
output [0:0] ddr3_ck_n,
output [0:0] ddr3_cke,
output [0:0] ddr3_cs_n,
output [3:0] ddr3_dm,
output [0:0] ddr3_odt,
// Inputs
// Single-ended system clock
input sys_clk_i, //ip核设置时定下的时钟,200MHz
// user interface signals
input [28:0] app_addr, //显然是ddr3地址
input [2:0] app_cmd, //读写控制:1读,0写。从哪看的不用我说了吧
input app_en,//使能信号,无论读写或者操作什么都需要拉高
input [255:0] app_wdf_data,//写数据
input app_wdf_end,//写数据结束信号,1数据有效,0数据无效
input [31:0] app_wdf_mask,//写数据掩码,第一篇已经介绍,32位对应32个字节,0有效,1无效
input app_wdf_wren,//写数据有效信号,1数据有效,0数据无效
output [255:0] app_rd_data,//读数据
output app_rd_data_end,//写数据结束信号,可以说是用不着,毕竟有下面的valid信号
output app_rd_data_valid,//1数据有效,0数据无效
output app_rdy,//1:MIGip核准备好了;0:没准备好
output app_wdf_rdy,//1:可以写了;0:不能写
//无用六兄弟
input app_sr_req,
input app_ref_req,
input app_zq_req,
output app_sr_active,
output app_ref_ack,
output app_zq_ack,
//给我们用的
output ui_clk,//之前设置ip核时设定好的,需要400MHz,设置4:1,输出100MHz,写入数据的 //时候就用100MHz的时钟来写
output ui_clk_sync_rst,//控制接口程序的复位信号
output init_calib_complete,//ddr3初始化完成信号,1:完成
//这些也没用
output [11:0] device_temp,//设备温度
`ifdef SKIP_CALIB
output calib_tap_req,
input calib_tap_load,
input [6:0] calib_tap_addr,
input [7:0] calib_tap_val,
input calib_tap_load_done,
`endif
//migip核复位,可选择设置为高有效或者低有效,第一篇有介绍
input sys_rst
);
用户端接口可以分为五部分:①输出给控制函数用的时钟、复位、初始化完成信号;②读写复用的地址、读写控制、使能信号;③5个写数据专用信号;④3个读数据专用信号;⑤ip核使用的时钟、复位信号。
二、写数据
图1-74 告诉我们只有app_rdy和app_en都拉高时,控制信号和地址信号才能有效传输给ddr3。
图1-75 告诉我们写入数据一共有三种方式,选择第一种全部信息在同一时钟周期内写入,这样代码写起来简单一点。
app_wdf_end和app_wdf_wren的用法:时钟工作在4:1模式下时 app_wdf_end和app_wdf_wren同步拉高
三、读数据
读数据就很简单了,app_en、app_addr、app_cmd一给,等着数据和有效信号就可以了。