赞
踩
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拉高,则初始化成功。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。