XILINX DDR3 VIVADO(一) 初始化

文章目录

  • mig ip初始化
    • DDR3 IP核的调取
    • 代码
    • 仿真
    • 总结

mig ip初始化

DDR3 IP核的调取

第一步
XILINX DDR3 VIVADO(一) 初始化_第1张图片
第二步
XILINX DDR3 VIVADO(一) 初始化_第2张图片
第三步
XILINX DDR3 VIVADO(一) 初始化_第3张图片
点击next
第四步
XILINX DDR3 VIVADO(一) 初始化_第4张图片
点击next
第五步
XILINX DDR3 VIVADO(一) 初始化_第5张图片
1.clock period:这是输入到ddr3存储芯片的时钟,mig ip一共输出两路,输入一路时钟,除了输出给ddr3存储芯片的时钟外,还输出一个用户时钟给用户控制ip核的时钟,如图所示
XILINX DDR3 VIVADO(一) 初始化_第6张图片
2.phy to controller clock radio:说明CLK1与CLK0的比值。,、这里是4:1,也就是CLK1 = 400M CLK0 = 100M喵,。、
第六步
XILINX DDR3 VIVADO(一) 初始化_第7张图片
这个时钟也就是CLK2,。即给mig ip时钟,但是不知道是不是vivado的bug,我设置明明200M,但是每次它都显示400M,不过实际上还是200M,.、
第七步
XILINX DDR3 VIVADO(一) 初始化_第8张图片
system clock :有三个选择
differential:差分。说明该时钟是差分时钟。
single-ended:单端。说明该时钟是单端时钟。
no buffer:说明是fpga内部的时钟,比如pll ip生成的。
这里我们选择no buffer,。、因为我想用pll 生成200m时钟。

(注意:system-clock就是上一页200m的输入时钟,这是选择输入时钟的类型,因为我们是pll生成的,所以我们选择no buff)

在这里插入图片描述
reference clock:只有输入给mig 的时钟是200m才可以选择use system clock,因为这是mig的规定喵(MIG要求200M的固定参考时钟,。)。
第八步
都next即可。

代码

  1. IP核的例化
    这里我们调用了两个ip mig,pll,所以我们新建顶层文件来调用这两个ip。
     ```
          ```
               ```
      `timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2021/06/01 09:33:58
// Design Name: chaojiwudidamiaomiao
// Module Name: ddr_ctrl
// Project Name: mig_7series_0
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module ddr_ctrl(
input 			wire                        sclk,
					                        
input 			wire                        sys_rst,


output  		wire             [13: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            [15:0]		ddr3_dq,
				            
inout   		wire            [1:0]		ddr3_dqs_n,
				            
inout   		wire            [1:0]		ddr3_dqs_p,
				           
output  		wire             [0:0]		ddr3_cs_n,
				            
output  		wire             [1:0]		ddr3_dm,
				           
output  		wire             [0:0]		ddr3_odt

    );
	
	
wire[27:0]		app_addr;	
	
	
wire[2:0]		app_cmd	;
	
	
wire				app_en;	
	
	
wire[127:0]		app_wdf_data;	
	
	
wire				app_wdf_end	;
	
	
wire				app_wdf_wren;	
	
	
wire [127:0]		app_rd_data;	
	
	
wire			app_rd_data_end	;
	
	
wire			app_rd_data_valid	;
	
	
wire			app_rdy	;
	
	
wire			app_wdf_rdy	;
	
	
wire			app_sr_req	;
	
	
wire			app_ref_req	;
	
	
wire			app_zq_req	;
	
	
wire			app_sr_active	;
	
	
wire			app_ref_ack	;
	
	
wire			app_zq_ack	;
	
	
wire			ui_clk	;
	
	
wire			ui_clk_sync_rst	;
	
	
wire[15:0]		app_wdf_mask	;
	

	mig_7series_0 u_mig_7series_0 (

    // Memory interface ports


    .ddr3_addr                      (ddr3_addr),  // 	output [13: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 [15:0]		ddr3_dq


    .ddr3_dqs_n                     (ddr3_dqs_n),  // 	inout [1:0]		ddr3_dqs_n


    .ddr3_dqs_p                     (ddr3_dqs_p),  // 	inout [1: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 [1:0]		ddr3_dm


    .ddr3_odt                       (ddr3_odt),  // 			output [0:0]		ddr3_odt


    // Application interface ports


    .app_addr                       (app_addr),  // 			input [27: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 [127: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 [127: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 [15:0]		app_wdf_mask


    // System Clock Ports
    .sys_clk_i                       (clk_out1),
    .sys_rst                        (sys_rst) // 				input sys_rst
    );
    clk_wiz_0 instance_name
    (
    .clk_out1(clk_out1),
    .clk_in1(sclk));     
    
    endmodule

因为现在只是初始化,不需要读写操作,也就无需user logic那就是不需要app,只需要ddr部分连接到ddr3存储芯片,我们在仿真的时候调用ddr3 model即可。

仿真

仿真只需要调用ddr model即可

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2021/06/01 10:10:07
// Design Name: 
// Module Name: tb_ddr3_mig
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module tb_ddr3_mig(

    );
reg sclk;
		
reg rst_n;
	
wire   [13:0]		ddr3_addr;

wire   [2:0]		ddr3_ba;

wire  			ddr3_cas_n;

wire   [0:0]		ddr3_ck_n;

wire   [0:0]		ddr3_ck_p;

wire   [0:0]		ddr3_cke;

wire  			ddr3_ras_n;

wire  			ddr3_reset_n;

wire  			ddr3_we_n;

wire  [15:0]		ddr3_dq;

wire  [1:0]		ddr3_dqs_n;

wire  [1:0]		ddr3_dqs_p;

wire   [0:0]		ddr3_cs_n;

wire   [1:0]		ddr3_dm;

wire   [0:0]		ddr3_odt;





initial 
begin
sclk <= 1'b0;
rst_n <= 1'b0;
#120;
rst_n <= 1'b1;
end 

always #10 sclk <= ~sclk;

ddr_ctrl   ins_ddr_ctrl    (
     .ddr3_dq              (ddr3_dq),

     .ddr3_dqs_n           (ddr3_dqs_n),

     .ddr3_dqs_p           (ddr3_dqs_p),



     .ddr3_addr            (ddr3_addr),

     .ddr3_ba              (ddr3_ba),

     .ddr3_ras_n           (ddr3_ras_n),

     .ddr3_cas_n           (ddr3_cas_n),

     .ddr3_we_n            (ddr3_we_n),

     .ddr3_reset_n         (ddr3_reset_n),

     .ddr3_ck_p            (ddr3_ck_p),

     .ddr3_ck_n            (ddr3_ck_n),

     .ddr3_cke             (ddr3_cke),

     .ddr3_cs_n            (ddr3_cs_n),

    

     .ddr3_dm              (ddr3_dm),

    

     .ddr3_odt             (ddr3_odt),

    

     

     .sclk            (sclk),

    



      .sys_rst             (rst_n)

     );	
	
	 ddr3_model u_comp_ddr3

            (

             .rst_n   (ddr3_reset_n),

             .ck      (ddr3_ck_p),

             .ck_n    (ddr3_ck_n),

             .cke     (ddr3_cke),

             .cs_n    (ddr3_cs_n),

             .ras_n   (ddr3_ras_n),

             .cas_n   (ddr3_cas_n),

             .we_n    (ddr3_we_n),

             .dm_tdqs (ddr3_dm),

             .ba      (ddr3_ba),

             .addr    (ddr3_addr),

             .dq      (ddr3_dq),

             .dqs     (ddr3_dqs_p),

             .dqs_n   (ddr3_dqs_n),

             .tdqs_n  (),

             .odt     (ddr3_odt)

             );
endmodule

总结

***mig ip初始化只需要上电及复位就可以自动完成初始化,***初始化的标志是init_calib_complete拉高。XILINX DDR3 VIVADO(一) 初始化_第9张图片

你可能感兴趣的:(FPGA,SDRAM,fpga,ddr,芯片)