Zynq PL DDR4读写测试工程

news2024/12/26 10:42:47

基于XCZU21DR-2FFVD1156E开发,本文介绍对PL DDR4的读写操作,代码全部经过上板测试。

目录

 添加DDR4 IP

Basic

Mode and Interface & Clocking

Controller Options

 Advanced Clocking

VIO IP配置

 ILA IP配置

General Options

Probe_Ports(0..7)

Probe_Ports(8..15)

Probe_Ports(16..18)

top代码

ddr4_rw代码

 top.xdc内容


系统框图如下:

 添加DDR4 IP

DDR4颗粒采用MT40A2G8VA-062E IT,配置如下:

Basic

Mode and Interface & Clocking

Controller Options

 Advanced Clocking

VIO IP配置

 ILA IP配置

General Options

Probe_Ports(0..7)

Probe_Ports(8..15)

Probe_Ports(16..18)

top代码

module ddr4_rw_top(
    output                             c0_ddr4_act_n   ,
	output [16:0]                      c0_ddr4_adr     ,
	output [1:0]                       c0_ddr4_ba      ,
	output [1:0]                       c0_ddr4_bg      ,
	output [0:0]                       c0_ddr4_cke     ,
	output [0:0]                       c0_ddr4_odt     ,
	output [0:0]                       c0_ddr4_cs_n    ,
	output [0:0]                       c0_ddr4_ck_t    ,
	output [0:0]                       c0_ddr4_ck_c    ,
	output                             c0_ddr4_reset_n ,
	inout  [7:0]                       c0_ddr4_dm_dbi_n,
	inout  [63:0]                      c0_ddr4_dq      ,
	inout  [7:0]                       c0_ddr4_dqs_c   ,
	inout  [7:0]                       c0_ddr4_dqs_t   ,               
	
	//Differential system clocks
	input                              c0_sys_clk_p,
	input                              c0_sys_clk_n,
	output                             led,
	input                              sys_rst_n
    );                
                      
 //wire define  

wire                 error_flag;

wire c0_ddr4_ui_clk                ;
wire c0_ddr4_ui_clk_sync_rst       ;
wire c0_ddr4_app_en                ;
wire c0_ddr4_app_hi_pri            ;
wire c0_ddr4_app_wdf_end           ;
wire c0_ddr4_app_wdf_wren          ;
wire c0_ddr4_app_rd_data_end       ; 
wire c0_ddr4_app_rd_data_valid     ; 
wire c0_ddr4_app_rdy               ; 
wire c0_ddr4_app_wdf_rdy           ; 
wire [27 : 0] c0_ddr4_app_addr     ;
wire [2 : 0] c0_ddr4_app_cmd       ;
wire [127 : 0] c0_ddr4_app_wdf_data;
wire [15 : 0] c0_ddr4_app_wdf_mask ;
wire [127 : 0] c0_ddr4_app_rd_data ;
wire c0_init_calib_complete;


wire                  addn_ui_clkout1;
wire                  ui_clk_sync_rst;     //用户复位信号
wire                  init_calib_complete; //校准完成信号
wire [20:0]           rd_cnt;              //实际读地址计数
wire [1 :0]           state;                //状态计数器
wire [23:0]           rd_addr_cnt;         //用户读地址计数器
wire [23:0]           wr_addr_cnt;         //用户写地址计数器
wire                  out_sys_rst_n;
wire                  probe_out0_n;

//读写模块
 ddr4_rw u_ddr4_rw(
    .ui_clk               (c0_ddr4_ui_clk),                
    .ui_clk_sync_rst      (c0_ddr4_ui_clk_sync_rst),       
    .init_calib_complete  (c0_init_calib_complete),
    .app_rdy              (c0_ddr4_app_rdy),
    .app_wdf_rdy          (c0_ddr4_app_wdf_rdy),
    .app_rd_data_valid    (c0_ddr4_app_rd_data_valid),
    .app_rd_data          (c0_ddr4_app_rd_data),
    
    .app_addr             (c0_ddr4_app_addr),
    .app_en               (c0_ddr4_app_en),
    .app_wdf_wren         (c0_ddr4_app_wdf_wren),
    .app_wdf_end          (c0_ddr4_app_wdf_end),
    .app_cmd              (c0_ddr4_app_cmd),
    .app_wdf_data         (c0_ddr4_app_wdf_data),
    .state                (state),
    .rd_addr_cnt          (rd_addr_cnt),
    .wr_addr_cnt          (wr_addr_cnt),
    .rd_cnt               (rd_cnt),
    .error_flag           (error_flag),
    .led                  (led)
    );

ddr4_0 u_ddr4_0 (
  .c0_init_calib_complete(c0_init_calib_complete),        // 初始化完成信号
  .dbg_clk(),                                             
  .c0_sys_clk_p(c0_sys_clk_p),                            // 系统差分时钟p
  .c0_sys_clk_n(c0_sys_clk_n),                            // 系统差分时钟n
  .dbg_bus(),                                           
  .c0_ddr4_adr(c0_ddr4_adr),                              // 行列地址
  .c0_ddr4_ba(c0_ddr4_ba),                                // bank地址
  .c0_ddr4_cke(c0_ddr4_cke),                              // 时钟使能
  .c0_ddr4_cs_n(c0_ddr4_cs_n),                            // 片选信号
  .c0_ddr4_dm_dbi_n(c0_ddr4_dm_dbi_n),                    // 数据掩码
  .c0_ddr4_dq(c0_ddr4_dq),                                // 数据线
  .c0_ddr4_dqs_c(c0_ddr4_dqs_c),                          // inout wire [7 : 0] c0_ddr4_dqs_c
  .c0_ddr4_dqs_t(c0_ddr4_dqs_t),                          // inout wire [7 : 0] c0_ddr4_dqs_t
  .c0_ddr4_odt(c0_ddr4_odt),                              // output wire [0 : 0] c0_ddr4_odt
  .c0_ddr4_bg(c0_ddr4_bg),                                // output wire [1 : 0] c0_ddr4_bg
  .c0_ddr4_reset_n(c0_ddr4_reset_n),                      // output wire c0_ddr4_reset_n
  .c0_ddr4_act_n(c0_ddr4_act_n),                          // output wire c0_ddr4_act_n
  .c0_ddr4_ck_c(c0_ddr4_ck_c),                            // output wire [0 : 0] c0_ddr4_ck_c
  .c0_ddr4_ck_t(c0_ddr4_ck_t),                            // output wire [0 : 0] c0_ddr4_ck_t
  //user interface
  .c0_ddr4_ui_clk(c0_ddr4_ui_clk),                        // output wire c0_ddr4_ui_clk            用户时钟
  .c0_ddr4_ui_clk_sync_rst(c0_ddr4_ui_clk_sync_rst),      // output wire c0_ddr4_ui_clk_sync_rst   用户复位
  .c0_ddr4_app_en(c0_ddr4_app_en),                        // input wire c0_ddr4_app_en
  .c0_ddr4_app_hi_pri(1'b0),                              // input wire c0_ddr4_app_hi_pri
  .c0_ddr4_app_wdf_end(c0_ddr4_app_wdf_end),              // input wire c0_ddr4_app_wdf_end
  .c0_ddr4_app_wdf_wren(c0_ddr4_app_wdf_wren),            // input wire c0_ddr4_app_wdf_wren
  .c0_ddr4_app_rd_data_end(c0_ddr4_app_rd_data_end),      // output wire c0_ddr4_app_rd_data_end
  .c0_ddr4_app_rd_data_valid(c0_ddr4_app_rd_data_valid),  // output wire c0_ddr4_app_rd_data_valid
  .c0_ddr4_app_rdy(c0_ddr4_app_rdy),                      // output wire c0_ddr4_app_rdy
  .c0_ddr4_app_wdf_rdy(c0_ddr4_app_wdf_rdy),              // output wire c0_ddr4_app_wdf_rdy
  .c0_ddr4_app_addr(c0_ddr4_app_addr),                    // input wire [27 : 0] c0_ddr4_app_addr
  .c0_ddr4_app_cmd(c0_ddr4_app_cmd),                      // input wire [2 : 0] c0_ddr4_app_cmd
  .c0_ddr4_app_wdf_data(c0_ddr4_app_wdf_data),            // input wire [127 : 0] c0_ddr4_app_wdf_data
  .c0_ddr4_app_wdf_mask(16'b0),                           // input wire [15 : 0] c0_ddr4_app_wdf_mask
  .c0_ddr4_app_rd_data(c0_ddr4_app_rd_data),              // output wire [127 : 0] c0_ddr4_app_rd_data
  .addn_ui_clkout1(addn_ui_clkout1),                      // output wire addn_ui_clkout1
  .sys_rst(~sys_rst_n)                                    // input wire sys_rst
  //.sys_rst(~probe_out0_n)                               // input wire sys_rst
);    
vio_0 vio_0_inst (
  .clk(addn_ui_clkout1),                 // input wire clk
  .probe_in0(error_flag),                // input wire [0 : 0] probe_in0
  .probe_out0(probe_out0_n)              // output wire [0 : 0] probe_out0
);


endmodule

ddr4_rw代码

 module ddr4_rw (          
     input                    ui_clk,                //用户时钟
     input                    ui_clk_sync_rst,       //复位,高有效
     input                    init_calib_complete,   //DDR4初始化完成
     input                    app_rdy,               //MIG 命令接收准备好标致
     input                    app_wdf_rdy,           //MIG数据接收准备好
     input                    app_rd_data_valid,     //读数据有效
     input          [127:0]   app_rd_data,           //用户读数据
     output reg     [27:0]    app_addr,              //DDR4地址                      
     output                   app_en,                //MIG IP发送命令使能
     output                   app_wdf_wren,          //用户写数据使能
     output                   app_wdf_end,           //突发写当前时钟最后一个数据 
     output         [2:0]     app_cmd,               //MIG IP核操作命令,读或者写
     output reg     [127:0]   app_wdf_data,          //用户写数据
     output reg     [1 :0]    state,                 //读写状态
     output reg     [23:0]    rd_addr_cnt,           //用户读地址计数
     output reg     [23:0]    wr_addr_cnt,           //用户写地址计数
     output reg     [20:0]    rd_cnt,                //实际读地址标记
     output reg               error_flag,            //读写错误标志
     output reg               led                    //读写测试结果指示灯
     );
 
 //parameter define
 parameter  TEST_LENGTH = 1000;
 parameter  L_TIME = 25'd25_000_000;
 parameter  IDLE        = 2'd0;            //空闲状态
 parameter  WRITE       = 2'd1;            //写状态
 parameter  WAIT        = 2'd2;            //读到写过度等待
 parameter  READ        = 2'd3;            //读状态
 
 //reg define
 reg  [24:0]  led_cnt;    //led计数
 
 //wire define
 wire         error;     //读写错误标记
 wire         rst_n;     //复位,低有效
 

 assign rst_n = ~ui_clk_sync_rst;
 //读信号有效,且读出的数不是写入的数时,将错误标志位拉高
assign error = (app_rd_data_valid && (rd_cnt!=app_rd_data));
 
 //在写状态MIG IP 命令接收和数据接收都准备好,或者在读状态命令接收准备好,此时拉高使能信号,
 assign app_en = ((state == WRITE && (app_rdy && app_wdf_rdy))
                 ||(state == READ && app_rdy)) ? 1'b1:1'b0;
                 
 //在写状态,命令接收和数据接收都准备好,此时拉高写使能
 assign app_wdf_wren = (state == WRITE && (app_rdy && app_wdf_rdy)) ? 1'b1:1'b0;
 
 //由于DDR4芯片时钟和用户时钟的分频选择4:1,突发长度为8,故两个信号相同
 assign app_wdf_end = app_wdf_wren; 
 
 //处于读的时候命令值为1,其他时候命令值为0
 assign app_cmd = (state == READ) ? 3'd1 :3'd0;  
     
 //DDR4读写逻辑实现
 always @(posedge ui_clk or negedge rst_n) begin
     if((~rst_n)||(error_flag)) begin 
         state    <= IDLE;          
         app_wdf_data <= 128'd0;     
         wr_addr_cnt  <= 24'd0;      
         rd_addr_cnt  <= 24'd0;       
         app_addr     <= 28'd0;          
     end
     else if(init_calib_complete)begin               //MIG IP核初始化完成
         case(state)
             IDLE:begin
                 state    <= WRITE;
                 app_wdf_data <= 128'd0;   
                 wr_addr_cnt  <= 24'd0;     
                 rd_addr_cnt  <= 24'd0;       
                 app_addr     <= 28'd0;        
              end
             WRITE:begin
                 if(wr_addr_cnt == TEST_LENGTH - 1 &&(app_rdy && app_wdf_rdy))
                     state    <= WAIT;                  //写到设定的长度跳到等待状态
                 else if(app_rdy && app_wdf_rdy)begin   //写条件满足
                     app_wdf_data <= app_wdf_data + 1;  //写数据自加
                     wr_addr_cnt  <= wr_addr_cnt + 1;   //写地址自加
                     app_addr     <= app_addr + 8;      //DDR4地址加8
                 end
                 else begin                             //写条件不满足,保持当前值
                     app_wdf_data <= app_wdf_data;      
                     wr_addr_cnt  <= wr_addr_cnt;
                     app_addr     <= app_addr; 
                 end
               end
             WAIT:begin                                                  
                 state   <= READ;                     //下一个时钟,跳到读状态
                 rd_addr_cnt <= 24'd0;                //读地址复位
                 app_addr    <= 28'd0;                //DDR4读从地址0开始
               end
             READ:begin                               //读到设定的地址长度    
                 if(rd_addr_cnt == TEST_LENGTH - 1 && app_rdy)
                     state   <= IDLE;                   //则跳到空闲状态 
                 else if(app_rdy)begin                  //若MIG已经准备好,则开始读
                     rd_addr_cnt <= rd_addr_cnt + 1'd1; //用户地址每次加一
                     app_addr    <= app_addr + 8;       //DDR4地址加8
                 end
                 else begin                             //若MIG没准备好,则保持原值
                     rd_addr_cnt <= rd_addr_cnt;
                     app_addr    <= app_addr; 
                 end
               end
             default:begin
                 state    <= IDLE;
                 app_wdf_data <= 128'd0;
                 wr_addr_cnt  <= 24'd0;
                 rd_addr_cnt  <= 24'd0;
                 app_addr     <= 28'd0;
             end
         endcase
     end
 end   
                         
 //对DDR4实际读数据个数编号计数
 always @(posedge ui_clk or negedge rst_n) begin
     if(~rst_n) 
         rd_cnt  <= 0;              //若计数到读写长度,且读有效,地址计数器则置0                                    
     else if(app_rd_data_valid && rd_cnt == TEST_LENGTH - 1)
          rd_cnt <= 0;              //其他条件只要读有效,每个时钟自增1
     else if (app_rd_data_valid )
         rd_cnt <= rd_cnt + 1;
 end
 
 //寄存状态标志位
 always @(posedge ui_clk or negedge rst_n) begin
     if(~rst_n) 
         error_flag <= 0;
     else if(error)
         error_flag <= 1;
     else
         error_flag <= 0;
  end
  
 //led指示效果控制
 always @(posedge ui_clk or negedge rst_n) begin
      if((~rst_n) || (~init_calib_complete )) begin
         led_cnt <= 25'd0;
         led <= 1'b0;
     end
     else begin
         if(~error_flag)                        //读写测试正确         
             led <= 1'b1;                       //led灯常亮
          else begin                            //读写测试错误
             led_cnt <= led_cnt + 25'd1;
             if(led_cnt == L_TIME - 1'b1) begin
             led_cnt <= 25'd0;
             led <= ~led;                      //led灯闪烁
             end                    
          end
       end
 end

ila_0 ila_0_inst (
	.clk(ui_clk), // input wire clk
	.probe0(app_rd_data_valid), // input wire [0:0]  probe0  
	.probe1(app_rd_data), // input wire [127:0]  probe1 
	.probe2(app_addr), // input wire [27:0]  probe2 
	.probe3(app_cmd), // input wire [2:0]  probe3 
	.probe4(app_wdf_data), // input wire [127:0]  probe4 
	.probe5(state), // input wire [1:0]  probe5 
	.probe6(rd_addr_cnt), // input wire [23:0]  probe6 
	.probe7(wr_addr_cnt), // input wire [23:0]  probe7 
	.probe8(rd_cnt), // input wire [20:0]  probe8 
	.probe9(error_flag), // input wire [0:0]  probe9 
	.probe10(led), // input wire [0:0]  probe10 
	.probe11(ui_clk_sync_rst), // input wire [0:0]  probe11 
	.probe12(init_calib_complete), // input wire [0:0]  probe12 
	.probe13(app_rdy), // input wire [0:0]  probe13 
	.probe14(app_wdf_rdy), // input wire [0:0]  probe14 
	.probe15(app_wdf_end), // input wire [0:0]  probe15 
	.probe16(app_en), // input wire [0:0]  probe16 
	.probe17(app_wdf_wren), // input wire [0:0]  probe17
	.probe18(error) // input wire [0:0]  probe18
);
 endmodule

 top.xdc内容

set_property PACKAGE_PIN L14 [get_ports led]

set_property PACKAGE_PIN T3 [get_ports sys_rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports sys_rst_n]

set_property PACKAGE_PIN AK1 [get_ports {c0_ddr4_adr[16]}]
set_property PACKAGE_PIN AH6 [get_ports {c0_ddr4_adr[6]}]
set_property PACKAGE_PIN AG3 [get_ports {c0_ddr4_adr[11]}]
set_property PACKAGE_PIN AK2 [get_ports {c0_ddr4_adr[12]}]
set_property PACKAGE_PIN AJ3 [get_ports {c0_ddr4_adr[10]}]
set_property PACKAGE_PIN AG2 [get_ports {c0_ddr4_adr[2]}]
set_property PACKAGE_PIN AH2 [get_ports {c0_ddr4_adr[4]}]
set_property PACKAGE_PIN AP3 [get_ports {c0_ddr4_adr[0]}]
set_property PACKAGE_PIN AP4 [get_ports {c0_ddr4_adr[8]}]
set_property PACKAGE_PIN AN4 [get_ports {c0_ddr4_adr[3]}]
set_property PACKAGE_PIN AN5 [get_ports {c0_ddr4_adr[7]}]
set_property PACKAGE_PIN AP2 [get_ports {c0_ddr4_adr[15]}]
set_property PACKAGE_PIN AN2 [get_ports {c0_ddr4_adr[14]}]
set_property PACKAGE_PIN AM2 [get_ports {c0_ddr4_adr[9]}]
set_property PACKAGE_PIN AM3 [get_ports {c0_ddr4_adr[13]}]
set_property PACKAGE_PIN AH7 [get_ports {c0_ddr4_adr[5]}]
set_property PACKAGE_PIN AG1 [get_ports {c0_ddr4_adr[1]}]
set_property PACKAGE_PIN AH1 [get_ports {c0_ddr4_ba[1]}]
set_property PACKAGE_PIN AM4 [get_ports {c0_ddr4_ba[0]}]
set_property PACKAGE_PIN AJ2 [get_ports {c0_ddr4_bg[1]}]
set_property PACKAGE_PIN AL4 [get_ports {c0_ddr4_bg[0]}]
set_property PACKAGE_PIN AK6 [get_ports {c0_ddr4_ck_t[0]}]
set_property PACKAGE_PIN AL1 [get_ports {c0_ddr4_cke[0]}]
set_property PACKAGE_PIN AL6 [get_ports {c0_ddr4_cs_n[0]}]
set_property PACKAGE_PIN C5 [get_ports {c0_ddr4_dm_dbi_n[7]}]
set_property PACKAGE_PIN F6 [get_ports {c0_ddr4_dm_dbi_n[6]}]
set_property PACKAGE_PIN J5 [get_ports {c0_ddr4_dm_dbi_n[5]}]
set_property PACKAGE_PIN M7 [get_ports {c0_ddr4_dm_dbi_n[4]}]
set_property PACKAGE_PIN AA3 [get_ports {c0_ddr4_dm_dbi_n[3]}]
set_property PACKAGE_PIN AA6 [get_ports {c0_ddr4_dm_dbi_n[2]}]
set_property PACKAGE_PIN AD8 [get_ports {c0_ddr4_dm_dbi_n[1]}]
set_property PACKAGE_PIN AE1 [get_ports {c0_ddr4_dm_dbi_n[0]}]
set_property PACKAGE_PIN A9 [get_ports {c0_ddr4_dq[63]}]
set_property PACKAGE_PIN B4 [get_ports {c0_ddr4_dq[62]}]
set_property PACKAGE_PIN B9 [get_ports {c0_ddr4_dq[61]}]
set_property PACKAGE_PIN A6 [get_ports {c0_ddr4_dq[60]}]
set_property PACKAGE_PIN A8 [get_ports {c0_ddr4_dq[59]}]
set_property PACKAGE_PIN A5 [get_ports {c0_ddr4_dq[58]}]
set_property PACKAGE_PIN B8 [get_ports {c0_ddr4_dq[57]}]
set_property PACKAGE_PIN A4 [get_ports {c0_ddr4_dq[56]}]
set_property PACKAGE_PIN E5 [get_ports {c0_ddr4_dq[55]}]
set_property PACKAGE_PIN E8 [get_ports {c0_ddr4_dq[54]}]
set_property PACKAGE_PIN F5 [get_ports {c0_ddr4_dq[53]}]
set_property PACKAGE_PIN D9 [get_ports {c0_ddr4_dq[52]}]
set_property PACKAGE_PIN E7 [get_ports {c0_ddr4_dq[51]}]
set_property PACKAGE_PIN C6 [get_ports {c0_ddr4_dq[50]}]
set_property PACKAGE_PIN C7 [get_ports {c0_ddr4_dq[49]}]
set_property PACKAGE_PIN C9 [get_ports {c0_ddr4_dq[48]}]
set_property PACKAGE_PIN F8 [get_ports {c0_ddr4_dq[47]}]
set_property PACKAGE_PIN J7 [get_ports {c0_ddr4_dq[46]}]
set_property PACKAGE_PIN G8 [get_ports {c0_ddr4_dq[45]}]
set_property PACKAGE_PIN H9 [get_ports {c0_ddr4_dq[44]}]
set_property PACKAGE_PIN G6 [get_ports {c0_ddr4_dq[43]}]
set_property PACKAGE_PIN G7 [get_ports {c0_ddr4_dq[42]}]
set_property PACKAGE_PIN G9 [get_ports {c0_ddr4_dq[41]}]
set_property PACKAGE_PIN J8 [get_ports {c0_ddr4_dq[40]}]
set_property PACKAGE_PIN L6 [get_ports {c0_ddr4_dq[39]}]
set_property PACKAGE_PIN K6 [get_ports {c0_ddr4_dq[38]}]
set_property PACKAGE_PIN M8 [get_ports {c0_ddr4_dq[37]}]
set_property PACKAGE_PIN J10 [get_ports {c0_ddr4_dq[36]}]
set_property PACKAGE_PIN L8 [get_ports {c0_ddr4_dq[35]}]
set_property PACKAGE_PIN J9 [get_ports {c0_ddr4_dq[34]}]
set_property PACKAGE_PIN L10 [get_ports {c0_ddr4_dq[33]}]
set_property PACKAGE_PIN K10 [get_ports {c0_ddr4_dq[32]}]
set_property PACKAGE_PIN V1 [get_ports {c0_ddr4_dq[31]}]
set_property PACKAGE_PIN AB1 [get_ports {c0_ddr4_dq[30]}]
set_property PACKAGE_PIN W3 [get_ports {c0_ddr4_dq[29]}]
set_property PACKAGE_PIN AB2 [get_ports {c0_ddr4_dq[28]}]
set_property PACKAGE_PIN W2 [get_ports {c0_ddr4_dq[27]}]
set_property PACKAGE_PIN Y1 [get_ports {c0_ddr4_dq[26]}]
set_property PACKAGE_PIN V2 [get_ports {c0_ddr4_dq[25]}]
set_property PACKAGE_PIN AA1 [get_ports {c0_ddr4_dq[24]}]
set_property PACKAGE_PIN Y5 [get_ports {c0_ddr4_dq[23]}]
set_property PACKAGE_PIN W7 [get_ports {c0_ddr4_dq[22]}]
set_property PACKAGE_PIN Y7 [get_ports {c0_ddr4_dq[21]}]
set_property PACKAGE_PIN W9 [get_ports {c0_ddr4_dq[20]}]
set_property PACKAGE_PIN Y6 [get_ports {c0_ddr4_dq[19]}]
set_property PACKAGE_PIN W5 [get_ports {c0_ddr4_dq[18]}]
set_property PACKAGE_PIN W4 [get_ports {c0_ddr4_dq[17]}]
set_property PACKAGE_PIN W8 [get_ports {c0_ddr4_dq[16]}]
set_property PACKAGE_PIN AB6 [get_ports {c0_ddr4_dq[15]}]
set_property PACKAGE_PIN AC6 [get_ports {c0_ddr4_dq[14]}]
set_property PACKAGE_PIN AD9 [get_ports {c0_ddr4_dq[13]}]
set_property PACKAGE_PIN AB7 [get_ports {c0_ddr4_dq[12]}]
set_property PACKAGE_PIN AB4 [get_ports {c0_ddr4_dq[11]}]
set_property PACKAGE_PIN AC7 [get_ports {c0_ddr4_dq[10]}]
set_property PACKAGE_PIN AA4 [get_ports {c0_ddr4_dq[9]}]
set_property PACKAGE_PIN AC9 [get_ports {c0_ddr4_dq[8]}]
set_property PACKAGE_PIN AE5 [get_ports {c0_ddr4_dq[7]}]
set_property PACKAGE_PIN AC1 [get_ports {c0_ddr4_dq[6]}]
set_property PACKAGE_PIN AD5 [get_ports {c0_ddr4_dq[5]}]
set_property PACKAGE_PIN AC4 [get_ports {c0_ddr4_dq[4]}]
set_property PACKAGE_PIN AD4 [get_ports {c0_ddr4_dq[3]}]
set_property PACKAGE_PIN AD2 [get_ports {c0_ddr4_dq[2]}]
set_property PACKAGE_PIN AE2 [get_ports {c0_ddr4_dq[1]}]
set_property PACKAGE_PIN AC2 [get_ports {c0_ddr4_dq[0]}]
set_property PACKAGE_PIN Y3 [get_ports {c0_ddr4_dqs_t[3]}]
set_property PACKAGE_PIN Y8 [get_ports {c0_ddr4_dqs_t[2]}]
set_property PACKAGE_PIN AB9 [get_ports {c0_ddr4_dqs_t[1]}]
set_property PACKAGE_PIN AD3 [get_ports {c0_ddr4_dqs_t[0]}]
set_property PACKAGE_PIN B7 [get_ports {c0_ddr4_dqs_t[7]}]
set_property PACKAGE_PIN D8 [get_ports {c0_ddr4_dqs_t[6]}]
set_property PACKAGE_PIN H7 [get_ports {c0_ddr4_dqs_t[5]}]
set_property PACKAGE_PIN K8 [get_ports {c0_ddr4_dqs_t[4]}]
set_property PACKAGE_PIN AL3 [get_ports {c0_ddr4_odt[0]}]
set_property PACKAGE_PIN AJ7 [get_ports c0_ddr4_act_n]
set_property PACKAGE_PIN AK3 [get_ports c0_ddr4_reset_n]
set_property PACKAGE_PIN G12 [get_ports c0_sys_clk_p]

set_property IOSTANDARD SSTL12_DCI [get_ports {c0_ddr4_cke[0]}]

####################################################################################
# Constraints from file : 'bd_9054_microblaze_I_0.xdc'
####################################################################################

current_instance u_ddr4_0/inst
set_property LOC MMCM_X0Y2 [get_cells -hier -filter {NAME =~ */u_ddr4_infrastructure/gen_mmcme*.u_mmcme_adv_inst}]
set_property CLOCK_DEDICATED_ROUTE BACKBONE [get_pins -hier -filter {NAME =~ */u_ddr4_infrastructure/gen_mmcme*.u_mmcme_adv_inst/CLKIN1}]
current_instance -quiet
set_property INTERNAL_VREF 0.84 [get_iobanks 67]
set_property INTERNAL_VREF 0.84 [get_iobanks 66]
set_property INTERNAL_VREF 0.84 [get_iobanks 65]

set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]
set_property IOSTANDARD LVCMOS18 [get_ports led]

set_property C_CLK_INPUT_FREQ_HZ 300000000 [get_debug_cores dbg_hub]
set_property C_ENABLE_CLK_DIVIDER false [get_debug_cores dbg_hub]
set_property C_USER_SCAN_CHAIN 1 [get_debug_cores dbg_hub]
connect_debug_port dbg_hub/clk [get_nets clk]

约束文件无需手动填入约束代码,在执行Open Implemented Design后, 在I/O Ports中填入引脚位置和电平约束,Ctrl+S后自动保存到xdc中。

以上代码经过上板测试通过。

本文完。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/150379.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

爬虫的基本使用

文章目录urllib库1、基本使用2、一个类型、六个方法3、下载操作4、请求对象的定制5、get请求的quote方法6、get请求的urlencode方法7、post请求百度翻译8、post请求百度翻译之详细翻译小技巧&#xff1a;正则替换9、agax的get请求豆瓣电影第一页**10、agax的get请求豆瓣电影的前…

使用容器跑一个zabbix 监控另外一个虚机的基础项

目录 安装docker mysql数据库部署 拉取mysql镜像 运行mysql服务器 创建zabbix用户和数据库 进入docker容器登陆数据库 创建zabbix数据库创建zabbix用户 zabbix用户授权 复制mysql初始化数据库文件到容器 导入zabbix初始化数据 zabbix服务器部署 拉取镜像 运行容器 效果…

Linux环境下,JAVA环境调用C++的动态链接库so

1、使用QT开发一个动态链接库.so&#xff08;本次使用linux环境&#xff0c;在windows下是.dll&#xff09; 代码文件包含 testdll.cpp testdll.h testdll.pro testdll_global.h testdll.pro #------------------------------------------------- # # Project created by QtC…

苹果手机怎么清理内存垃圾?2个方法,快速解决

很多小伙伴在生活中会使用手机来看视频、聊天、学习等等。不管是苹果手机还是安卓手机&#xff0c;使用手机的时间长了&#xff0c;里面就会产生很多垃圾占据手机空间。苹果手机怎么清理内存垃圾&#xff1f;今天小编就来分享2个方法&#xff0c;教你快速解决。 一、删除不常用…

ansible(第五天)

五、实施任务控制 161 1.循环&#xff08;迭代&#xff09;--- loop --item 1.利用loop----item循环迭代任务 with_* 通过循环管理员不需要编写多个使用同一模块的任务。例&#xff1a;他们不需要编写五个任务来确保存在五个用 户&#xff0c;而是只需要编写一个任务来对含有…

R语言应用xgboost进行机器学习(2)

XGBoost 机器学习模型是一种高效且可扩的展的机器学习分类器&#xff0c;由 Chen 和 Guestrin 在 2016 年推广。XGBoost原理是是在决策树的基础上产生迭代&#xff0c;它以 boosting 的方式结合了多个决策树。通常创建每棵新树是为了通过梯度提升来减少先前模型的误差&#xff…

(day4) 自学Java——字符串

ctrlaltT 选择语句包裹 目录 1.API 2.String创建 3.字符串的比较 4.字符串——练习 (1):用户登录 (2)遍历字符串和统计字符个数 (3)字符串拼接和反转 (4)金额转换 (5)手机号屏蔽&#xff0c;游戏敏感词替换 5.StringBuilder 6.字符串相关类的底层原理 7.较难练习 …

苹果手机发热发烫怎么办?常见原因及解决办法

很多小伙伴都喜欢使用苹果手机&#xff0c;有时候正在玩着苹果手机的时候&#xff0c;发现自己的苹果手机温度很高&#xff0c;很烫手&#xff0c;这是怎么一回事呢&#xff1f;苹果手机发热发烫怎么办&#xff1f;别担心&#xff0c;下面跟着小编一起来看看苹果手机发热发烫常…

Java之集合概述、ArrayList的使用、常见API和集合案例

目录集合概述总结ArrayList集合快速入门总结ArrayList对于泛型的支持总结ArrayList常用API、遍历集合案例遍历并删除元素值总结存储自定义类型的对象元素搜索集合概述 总结 1、数组和集合的元素存储的个数问题? 数组定义后类型确定&#xff0c;长度固定集合类型可以不固定&a…

MyBatis 动态SQL使用

动态 sql 是Mybatis的强⼤特性之⼀&#xff0c;能够完成不同条件下不同的 sql 拼接。 1.<if>标签 运行结果&#xff1a; 2.<trim>标签 之前的插⼊⽤户功能&#xff0c;只是有⼀个 photo 字段可能是选填项&#xff0c;如果有多个字段&#xff0c;⼀般考虑使⽤&l…

VS Code安装教程

一、下载 1、官网 下载地址 2、下载 根据自己电脑型号下载&#xff0c;此处以Windows为例。 二、安装 1、下载完成后&#xff0c;直接点击安装包安装&#xff0c;即可。 2、开始安装&#xff0c;然后下一步 3、可以在此处自定义地址&#xff0c;然后下一步 4、默认设置&am…

数据结构课程设计

数据结构课程设计 文章目录数据结构课程设计1.1问题描述1.2需求分析1.3概要设计1.4详细设计1.5调试分析1.6测试结果1.7参考文献1.8源码1.1问题描述 编制一个能演示执行集合的交、并和差运算的程序。 要求&#xff1a; 集合元素用小写英文字母&#xff0c;执行各种操作应以对话…

iOS 系统校园无线WIFI认证上网指南

无为WiFi介绍一下IOS手机怎么连接校园网&#xff0c;本介绍为普通途径连接使用校园网&#xff0c;想了解绕过校园网请看其他贴文。1. 打开无线网络&#xff08;WLAN&#xff09;开关2. 连接校园无线WiFi网络进入“设置”->“无线局域网”->在无线WiFi信号列表中选择“SWJ…

【从零开始学习深度学习】40. 算法优化之AdaGrad算法介绍及其Pytorch实现

之前介绍的梯度下降算法中&#xff0c;目标函数自变量的每一个元素在相同时间步都使用同一个学习率来自我迭代。例如&#xff0c;假设目标函数为fff&#xff0c;自变量为一个二维向量[x1,x2]⊤[x_1, x_2]^\top[x1​,x2​]⊤&#xff0c;该向量中每一个元素在迭代时都使用相同的…

线程安全详解

线程安全 线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中&#xff0c;线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行&#xff0c;不会出现数据污染等意外情况。 多个线程访问同一个对象时&#xff0c;如…

【docker11】docker安装常用软件

docker安装常用软件 1.安装软件说明 框架图 总体步骤&#xff1a; 搜索镜像拉去镜像查看镜像启动镜像 - 服务端口映射停止容器移除容器 1.安装tomcat docker hub上查找tomcat镜像 从docker hub上拉取tomcat镜像到本地 docker images查看是否有拉取到的tomcat 使用to…

Spring Security 导致 Spring Boot 跨域失效问题

1、CORS 是什么首先我们要明确&#xff0c;CORS 是什么&#xff0c;以及规范是如何要求的。这里只是梳理一下流程。CORS 全称是 Cross-Origin Resource Sharing&#xff0c;直译过来就是跨域资源共享。要理解这个概念就需要知道域、资源和同源策略这三个概念。域&#xff0c;指…

sahrding-jdbc的雪花算法取模为0或1的问题

工作时无意间发现sahrding-jdbc使用雪花算法生成的id 在某一业务分库分表 永远在那两个库表里面,排查后这里做下分享 环境、配置、问题介绍 16库16表使用的是org.apache.shardingsphere.core.strategy.keygen下面generateKey生成id分库表算法是对16取模生成数据永远在0库0表 0…

如何有效的防护暴力破解和撞库攻击

在网络威胁领域&#xff0c;暴力破解攻击仍然是网络犯罪分子非常喜爱且有利可图的攻击方法。&#xff0c;黑客通过收集互联网已泄露的用户和密码信息&#xff0c;生成对应的字典表&#xff0c;由于许多用户重复使用相同的用户名和密码&#xff0c;攻击者可以使用撞库攻击获得对…

前缀和算法

目录1.概述2.代码实现2.1.一维前缀和2.2.二维前缀和3.应用本文参考&#xff1a; LABULADONG 的算法网站 1.概述 前缀和算法分为一维和二维&#xff0c;一维前缀和可以快速求序列中某一段的和&#xff0c;而二维前缀和可以快速求一个矩阵中某个子矩阵的和。 2.代码实现 2.1.一…