1调取IP核:使用软件:vivado2018.2
首先在IP Catalog中搜MIG,调出DDR IP核
50M是时钟是外部输入PLL模块的时钟;
200M:是由PLL分出来的上面一路是通过IP核内部的PLL给DDR3芯片产生的差分时钟
下面的一路200M,实质是参考时钟,因为IP核配置时输入的时钟为200M,而参考时钟(199~201M)可以直接选用如初IP的时钟200M,然后通过IP核内部的PLL产生两个成比例的时钟4:1(或2:1)快的400M用来作为芯片写datapath的时钟,慢的100M用来输出,作为用户时钟(ui_clk),可以用来往IP核写入数据。
2.自建仿真
(1)将IP核例化到ddr_drive
module ddr3_drive(
//system signals
input sys_clk_p ,
input sys_clk_n ,
input s_rst_n ,
//DDR3 Interference
output wire[14:0] ddr3_addr ,
output wire[2:0] ddr3_ba ,
output wire ddr3_cas_n ,
output wire [0:0] ddr3_ck_n ,
output wire [0:0] ddr3_ck_p ,
output wire [0:0] ddr3_cke ,
output wire ddr3_ras_n ,
output wire ddr3_reset_n ,
output wire ddr3_we_n ,
inout wire[31:0] ddr3_dq ,
inout wire[3:0] ddr3_dqs_n ,
inout wire[3:0] ddr3_dqs_p ,
output wire[0:0] ddr3_cs_n ,
output wire[3:0] ddr3_dm ,
output wire[0:0] ddr3_odt
);
//=====================================================================
//============Define parameter and Interference signal======
//=====================================================================
wire init_calib_complete;
mig_7series_0 u_mig_7series_0 (
// Memory interface ports
.ddr3_addr (ddr3_addr), // output [14:0] ddr3_addr
.ddr3_ba (ddr3_ba), // output [2:0] ddr3_ba
.ddr3_cas_n (ddr3_cas_n), // output ddr3_cas_n
.ddr3_ck_n (ddr3_ck_n), // output [0:0] ddr3_ck_n
.ddr3_ck_p (ddr3_ck_p), // output [0:0] ddr3_ck_p
.ddr3_cke (ddr3_cke), // output [0:0] ddr3_cke
.ddr3_ras_n (ddr3_ras_n), // output ddr3_ras_n
.ddr3_reset_n (ddr3_reset_n), // output ddr3_reset_n
.ddr3_we_n (ddr3_we_n), // output ddr3_we_n
.ddr3_dq (ddr3_dq), // inout [31:0] ddr3_dq
.ddr3_dqs_n (ddr3_dqs_n), // inout [3:0] ddr3_dqs_n
.ddr3_dqs_p (ddr3_dqs_p), // inout [3:0] ddr3_dqs_p
.init_calib_complete (init_calib_complete), // output init_calib_complete
.ddr3_cs_n (ddr3_cs_n), // output [0:0] ddr3_cs_n
.ddr3_dm (ddr3_dm), // output [3:0] ddr3_dm
.ddr3_odt (ddr3_odt), // output [0:0] ddr3_odt
// Application interface ports
.app_addr (app_addr), // input [28:0] app_addr
.app_cmd (app_cmd), // input [2:0] app_cmd
.app_en (app_en), // input app_en
.app_wdf_data (app_wdf_data), // input [255:0] app_wdf_data
.app_wdf_end (app_wdf_end), // input app_wdf_end
.app_wdf_wren (app_wdf_wren), // input app_wdf_wren
.app_rd_data (app_rd_data), // output [255:0] app_rd_data
.app_rd_data_end (app_rd_data_end), // output app_rd_data_end
.app_rd_data_valid (app_rd_data_valid), // output app_rd_data_valid
.app_rdy (app_rdy), // output app_rdy
.app_wdf_rdy (app_wdf_rdy), // output app_wdf_rdy
.app_sr_req (app_sr_req), // input app_sr_req
.app_ref_req (app_ref_req), // input app_ref_req
.app_zq_req (app_zq_req), // input app_zq_req
.app_sr_active (app_sr_active), // output app_sr_active
.app_ref_ack (app_ref_ack), // output app_ref_ack
.app_zq_ack (app_zq_ack), // output app_zq_ack
.ui_clk (ui_clk), // output ui_clk
.ui_clk_sync_rst (ui_clk_sync_rst), // output ui_clk_sync_rst
.app_wdf_mask (app_wdf_mask), // input [31:0] app_wdf_mask
// System Clock Ports
.sys_clk_p (sys_clk_p), // input sys_clk_p
.sys_clk_n (sys_clk_n), // input sys_clk_n
.sys_rst (s_rst_n) // input sys_rst
);
endmodule
(2)用ip和提供的仿真模板,建立tb文件
tb_ddr3_drive();
parameter CLKIN_PERIOD = 5000;
localparam RESET_PERIOD = 200000; //in pSec
parameter CS_WIDTH = 1;
parameter DQ_WIDTH = 32;
localparam MEMORY_WIDTH = 16;
localparam NUM_COMP = DQ_WIDTH/MEMORY_WIDTH;
parameter DM_WIDTH = 4;
parameter DQS_WIDTH = 4;
reg sys_clk_i;
wire sys_clk_p;
wire sys_clk_n;
reg s_rst_n;
initial begin
s_rst_n <= 1'b0;
#RESET_PERIOD
s_rst_n <= 1'b1;
end
initial
sys_clk_i = 1'b0;
always
sys_clk_i = #(CLKIN_PERIOD/2.0) ~sys_clk_i;
assign sys_clk_p = sys_clk_i;
assign sys_clk_n = ~sys_clk_i;
//--------------------------------------------------
wire [1-1:0] ddr3_ck_p_sdram;
wire [1-1:0] ddr3_ck_n_sdram;
wire [1-1:0] ddr3_cke_sdram;
wire [(CS_WIDTH*1)-1:0] ddr3_cs_n_sdram;
wire ddr3_ras_n_sdram;
wire ddr3_cas_n_sdram;
wire ddr3_we_n_sdram;
wire [DM_WIDTH-1:0] ddr3_dm_sdram;
wire [3-1:0] ddr3_ba_sdram;
wire [15-1:0] ddr3_addr_sdram;
wire [DQ_WIDTH-1:0] ddr3_dq_sdram;
wire [4-1:0] ddr3_dqs_p_sdram;
wire [4-1:0] ddr3_dqs_n_sdram;
wire [2-1:0] ddr3_odt_sdram;
wire ddr3_reset_n;
ddr3_drive ddr3_drive(
//system signals
.sys_clk_p (sys_clk_p ),
.sys_clk_n (sys_clk_n ),
. s_rst_n ( s_rst_n ),
//DDR3 Interference
.ddr3_addr (ddr3_addr_sdram ),
.ddr3_ba (ddr3_ba_sdram ),
.ddr3_cas_n (ddr3_cas_n_sdram ),
.ddr3_ck_n (ddr3_ck_n_sdram ),
.ddr3_ck_p (ddr3_ck_p_sdram ),
.ddr3_cke (ddr3_cke_sdram ),
.ddr3_ras_n (ddr3_ras_n_sdram ),
.ddr3_reset_n (ddr3_reset_n),
.ddr3_we_n (ddr3_we_n_sdram ),
.ddr3_dq (ddr3_dq_sdram ),
.ddr3_dqs_n (ddr3_dqs_n_sdram ),
.ddr3_dqs_p (ddr3_dqs_p_sdram ),
.ddr3_cs_n (ddr3_cs_n_sdram ),
.ddr3_dm (ddr3_dm_sdram ),
.ddr3_odt (ddr3_odt_sdram )
);
genvar i;
generate
for (i = 0; i < NUM_COMP; i = i + 1) begin: gen_mem
ddr3_model u_comp_ddr3
(
.rst_n (ddr3_reset_n),
.ck (ddr3_ck_p_sdram),
.ck_n (ddr3_ck_n_sdram),
.cke (ddr3_cke_sdram),
.cs_n (ddr3_cs_n_sdram),
.ras_n (ddr3_ras_n_sdram),
.cas_n (ddr3_cas_n_sdram),
.we_n (ddr3_we_n_sdram),
.dm_tdqs (ddr3_dm_sdram[(2*(i+1)-1):(2*i)]),
.ba (ddr3_ba_sdram),
.addr (ddr3_addr_sdram),
.dq (ddr3_dq_sdram[16*(i+1)-1:16*(i)]),
.dqs (ddr3_dqs_p_sdram[(2*(i+1)-1):(2*i)]),
.dqs_n (ddr3_dqs_n_sdram[(2*(i+1)-1):(2*i)]),
.tdqs_n (),
.odt (ddr3_odt_sdram)
);
end
endgenerate
endmodule
将这两个仿真文件添加到工程中的仿真模块,然后仿真
仿真结果:
观察到init_calib_complete拉高,则初始化成功。