Xilinx-- 7系列--DDR3(1)

2 篇文章 0 订阅

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拉高,则初始化成功。
在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值