FPGA——DDR3的IP核

news2024/9/24 21:20:03

FPGA——DDR3的ip核

  • IP核配置
  • 基于MIG核代码
  • 基于AXI接口的DDR3

IP核配置

1
在这里插入图片描述
在这里插入图片描述
2
在这里插入图片描述
3
在这里插入图片描述

4
在这里插入图片描述

5
在这里插入图片描述
6
在这里插入图片描述

基于MIG核代码

控制MIG核的信号进行读写

module MIG_APP_Drive(
    input               i_ui_clk            ,
    input               i_ui_rst            ,
    input			    init_calib_complete ,
    output [28:0]		app_addr            ,    
    output [2 :0]		app_cmd             ,                        
    output				app_en              ,                    
    output [255:0]		app_wdf_data        ,                    
    output				app_wdf_end         ,                    
    output				app_wdf_wren        ,                
    input  [255:0]		app_rd_data         ,                    
    input			    app_rd_data_end     ,                        
    input			    app_rd_data_valid   ,                    
    input			    app_rdy             ,                    
    input			    app_wdf_rdy         ,                
    output [31:0]		app_wdf_mask        ,    

    input  [1 :0]       i_operation_cmd     ,
    input  [15:0]       i_operation_len     ,
    input  [28:0]       i_operation_addr    ,
    input               i_operation_valid   ,
    output              o_operation_ready   ,
    input  [255:0]      i_write_data        ,
    input               i_write_last        ,
    input               i_write_valid       ,
    output [255:0]      o_read_data         ,
    output              o_read_valid                     
);

/***************function**************/

/***************parameter*************/
localparam              P_ST_INIT       =   0   ,
                        P_ST_IDLE       =   1   ,
                        P_ST_WAIT       =   2   ,
                        P_ST_WRITE      =   3   ,
                        P_ST_READ       =   4   ,
                        P_ST_READ_WAIT  =   5   ;

/***************port******************/             

/***************mechine***************/
(* mark_debug = "true" *)reg  [7 :0]             r_st_current        ;
reg  [7 :0]             r_st_next           ;
reg  [15:0]             r_st_cnt            ;

/***************reg*******************/
reg  [28:0]		        ro_app_addr         ;
reg  [2 :0]		        ro_app_cmd          ;
reg  				    ro_app_en           ;
reg  				    ro_app_wdf_wren     ;
reg  [31:0]             ro_app_wdf_mask     ;
reg                     ro_operation_ready  ;
reg  [255:0]            ro_read_data        ;
reg                     ro_read_valid       ;
reg  [1 :0]             ri_operation_cmd    ;
reg  [15:0]             ri_operation_len    ;
reg  [28:0]             ri_operation_addr   ;
reg                     r_op_act            ;
reg  [15:0]             r_write_cnt         ;
reg  [15:0]             r_read_cnt          ;
(* mark_debug = "true" *)reg  [15:0]             r_read_data_cnt     ;
reg  [7 :0]             r_init              ;

/***************wire******************/
wire                    w_op_act            ;
wire [255:0]            w_write_fifo_dout   ;
wire                    w_write_fifo_empty  ;
wire                    w_write_fifo_full   ;
wire                    w_mig_wvalid        ;
wire                    w_mig_rvalid        ;
wire                    w_write_fifo_rd_en  ;

/***************component*************/
FIFO_256X512 FIFO_256X512_U0 (
  .clk                  (i_ui_clk           ),      // input wire clk
  .din                  (i_write_data       ),      // input wire [63 : 0] din
  .wr_en                (i_write_valid      ),  // input wire wr_en
  .rd_en                (w_write_fifo_rd_en ),  // input wire rd_en
  .dout                 (w_write_fifo_dout  ),    // output wire [63 : 0] dout
  .full                 (w_write_fifo_full  ),    // output wire full
  .empty                (w_write_fifo_empty )  // output wire empty
);
/***************assign****************/
assign app_addr             = ro_app_addr           ;
assign app_cmd              = ro_app_cmd            ;
assign app_en               = ro_app_en & app_rdy   ;
assign app_wdf_data         = w_write_fifo_dout     ;
assign app_wdf_end          = app_wdf_wren          ; 
assign app_wdf_wren         = ro_app_wdf_wren & app_rdy & app_wdf_rdy;
assign app_wdf_mask         = ro_app_wdf_mask       ;
assign o_operation_ready    = ro_operation_ready    ;
assign o_read_data          = ro_read_data          ;
assign o_read_valid         = ro_read_valid         ;
assign w_op_act             = i_operation_valid & o_operation_ready;
assign w_mig_wvalid         = app_rdy & app_wdf_rdy & app_en & ro_app_wdf_wren & app_cmd == 0;
assign w_write_fifo_rd_en   = w_mig_wvalid          ;
assign w_mig_rvalid         = app_rdy & app_en & app_cmd == 1;


/***************always****************/
always@(posedge i_ui_clk,posedge i_ui_rst) 
begin
    if(i_ui_rst)
        r_st_current <= P_ST_INIT;
    else 
        r_st_current <= r_st_next;
end

always@(*)
begin
    case(r_st_current)
        P_ST_INIT       : r_st_next = &r_init   ? P_ST_IDLE     : P_ST_INIT;
        P_ST_IDLE       : r_st_next = r_op_act  ?
                                      ri_operation_cmd == 0 ? P_ST_WAIT     : P_ST_READ
                                      : P_ST_IDLE ;
        P_ST_WAIT       : r_st_next = r_st_cnt    == 4                          ? P_ST_WRITE    : P_ST_WAIT         ;
        P_ST_WRITE      : r_st_next = r_write_cnt == ri_operation_len - 1 & w_mig_wvalid    ? P_ST_IDLE     : P_ST_WRITE        ;
        P_ST_READ       : r_st_next = r_read_cnt  == ri_operation_len - 2 & w_mig_rvalid    ? P_ST_READ_WAIT: P_ST_READ         ;
        P_ST_READ_WAIT  : r_st_next = r_read_data_cnt >= ri_operation_len - 2 & app_rd_data_valid ? P_ST_IDLE     : P_ST_READ_WAIT    ;
        default         : r_st_next = P_ST_INIT;
    endcase
end

always@(posedge i_ui_clk,posedge i_ui_rst) 
begin
    if(i_ui_rst)
        r_init <= 'd0;
    else
        r_init <= {r_init[6 :0],init_calib_complete};
end

always@(posedge i_ui_clk,posedge i_ui_rst) 
begin
    if(i_ui_rst)
        r_st_cnt <= 'd0;
    else if(r_st_current != r_st_next)
        r_st_cnt <= 'd0;
    else 
        r_st_cnt <= r_st_cnt  + 1;
end

always@(posedge i_ui_clk,posedge i_ui_rst) 
begin
    if(i_ui_rst) begin
        ri_operation_cmd  <= 'd0;
        ri_operation_len  <= 'd0;
        ri_operation_addr <= 'd0;
    end else if(w_op_act) begin
        ri_operation_cmd  <= i_operation_cmd ;
        ri_operation_len  <= i_operation_len ;
        ri_operation_addr <= i_operation_addr;
    end else begin
        ri_operation_cmd  <= ri_operation_cmd ;
        ri_operation_len  <= ri_operation_len ;
        ri_operation_addr <= ri_operation_addr;
    end

end

always@(posedge i_ui_clk,posedge i_ui_rst) 
begin
    if(i_ui_rst)
        r_op_act <= 'd0;
    else 
        r_op_act <= w_op_act;
end
 
always@(posedge i_ui_clk,posedge i_ui_rst) 
begin
    if(i_ui_rst) begin
        ro_app_cmd <= 'd0;
        ro_app_en  <= 'd0;
    end else if(r_st_current == P_ST_WRITE) begin
        ro_app_cmd <= 'd0;
        ro_app_en  <= 'd1;
    end else if(r_st_current == P_ST_READ) begin
        ro_app_cmd <= 'd1;
        ro_app_en  <= 'd1;
    end else begin
        ro_app_cmd <= 'd0;
        ro_app_en  <= 'd0;
    end
    
end

always@(posedge i_ui_clk,posedge i_ui_rst) 
begin
    if(i_ui_rst)
        ro_app_addr <= 'd0;
    else if(w_op_act)
        ro_app_addr <= i_operation_addr;
    else if(w_mig_wvalid)
        ro_app_addr <= ro_app_addr + 8 ;
    else if(w_mig_rvalid)
        ro_app_addr <= ro_app_addr + 8 ;
    else 
        ro_app_addr <= ro_app_addr;
end

always@(posedge i_ui_clk,posedge i_ui_rst) 
begin
    if(i_ui_rst)
        ro_app_wdf_mask <= 'd0;
    else 
        ro_app_wdf_mask <= 'd0;
end

always@(posedge i_ui_clk,posedge i_ui_rst) 
begin
    if(i_ui_rst)
        ro_app_wdf_wren <= 'd0;
    else if(r_st_current == P_ST_WRITE)
        ro_app_wdf_wren <= 'd1;
    else 
        ro_app_wdf_wren <= 'd0;
end

always@(posedge i_ui_clk,posedge i_ui_rst) 
begin
    if(i_ui_rst) begin
        ro_read_data  <= 'd0;
        ro_read_valid <= 'd0;
    end else  begin
        ro_read_data  <= app_rd_data;
        ro_read_valid <= app_rd_data_valid;
    end 
end

always@(posedge i_ui_clk,posedge i_ui_rst) 
begin
    if(i_ui_rst)
        ro_operation_ready <= 'd0;
    else if(w_op_act)
        ro_operation_ready <= 'd0;
    else if(r_st_next == P_ST_IDLE)
        ro_operation_ready <= 'd1;
    else 
        ro_operation_ready <= ro_operation_ready;
end
 
always@(posedge i_ui_clk,posedge i_ui_rst) 
begin
    if(i_ui_rst)
        r_write_cnt <= 'd0;
    else if(r_st_current == P_ST_IDLE)
        r_write_cnt <= 'd0;
    else if(w_mig_wvalid)
        r_write_cnt <= r_write_cnt + 1;
    else 
        r_write_cnt <= r_write_cnt;
end

always@(posedge i_ui_clk,posedge i_ui_rst) 
begin
    if(i_ui_rst)
        r_read_cnt <= 'd0;
    else if(r_st_current == P_ST_IDLE)
        r_read_cnt <= 'd0;
    else if(w_mig_rvalid)
        r_read_cnt <= r_read_cnt + 1;
    else 
        r_read_cnt <= r_read_cnt;
end

always@(posedge i_ui_clk,posedge i_ui_rst)
begin
    if(i_ui_rst)
        r_read_data_cnt <= 'd0;
    else if(r_st_current == P_ST_IDLE)
        r_read_data_cnt <= 'd0;
    else if(app_rd_data_valid) 
        r_read_data_cnt <= r_read_data_cnt + 1;
    else 
        r_read_data_cnt <= r_read_data_cnt;
end

endmodule

示列

DDR3_MIG u_DDR3_MIG (
    // Memory interface ports
    .ddr3_addr                      (ddr3_addr                  ),
    .ddr3_ba                        (ddr3_ba                    ),
    .ddr3_cas_n                     (ddr3_cas_n                 ),
    .ddr3_ck_n                      (ddr3_ck_n                  ),
    .ddr3_ck_p                      (ddr3_ck_p                  ),
    .ddr3_cke                       (ddr3_cke                   ),
    .ddr3_ras_n                     (ddr3_ras_n                 ),
    .ddr3_reset_n                   (ddr3_reset_n               ),
    .ddr3_we_n                      (ddr3_we_n                  ),
    .ddr3_dq                        (ddr3_dq                    ),
    .ddr3_dqs_n                     (ddr3_dqs_n                 ),
    .ddr3_dqs_p                     (ddr3_dqs_p                 ),
	.ddr3_cs_n                      (ddr3_cs_n                  ),
    .ddr3_dm                        (ddr3_dm                    ),
    .ddr3_odt                       (ddr3_odt                   ),
    // Application interface ports
    .init_calib_complete            (w_init_calib_complete      ),
    .app_addr                       (w_app_addr                 ),
    .app_cmd                        (w_app_cmd                  ),
    .app_en                         (w_app_en                   ),
    .app_wdf_data                   (w_app_wdf_data             ),
    .app_wdf_end                    (w_app_wdf_end              ),
    .app_wdf_wren                   (w_app_wdf_wren             ),
    .app_rd_data                    (w_app_rd_data              ),
    .app_rd_data_end                (w_app_rd_data_end          ),
    .app_rd_data_valid              (w_app_rd_data_valid        ),
    .app_rdy                        (w_app_rdy                  ),
    .app_wdf_rdy                    (w_app_wdf_rdy              ),
    .app_wdf_mask                   (w_app_wdf_mask             ),
    .app_sr_req                     (0                          ),
    .app_ref_req                    (0                          ),
    .app_zq_req                     (0                          ),
    .app_sr_active                  (                           ),
    .app_ref_ack                    (                           ),
    .app_zq_ack                     (                           ),
    .ui_clk                         (ui_clk                     ),
    .ui_clk_sync_rst                (ui_clk_sync_rst            ),
    // System Clock Ports
    .sys_clk_p                      (i_clk_200m_p               ),
    .sys_clk_n                      (i_clk_200m_n               ),
    .sys_rst                        (0                          ) 
);

MIG_APP_Drive MIG_APP_Drive_u0(
    .i_ui_clk                       (ui_clk                     ),
    .i_ui_rst                       (ui_clk_sync_rst            ),
    .init_calib_complete            (w_init_calib_complete      ),
    .app_addr                       (w_app_addr                 ),    
    .app_cmd                        (w_app_cmd                  ),                        
    .app_en                         (w_app_en                   ),                    
    .app_wdf_data                   (w_app_wdf_data             ),                    
    .app_wdf_end                    (w_app_wdf_end              ),                    
    .app_wdf_wren                   (w_app_wdf_wren             ),                
    .app_rd_data                    (w_app_rd_data              ),                    
    .app_rd_data_end                (w_app_rd_data_end          ),                        
    .app_rd_data_valid              (w_app_rd_data_valid        ),                    
    .app_rdy                        (w_app_rdy                  ),                    
    .app_wdf_rdy                    (w_app_wdf_rdy              ),                
    .app_wdf_mask                   (w_app_wdf_mask             ),    

    .i_operation_cmd                (w_app_operation_cmd        ),
    .i_operation_len                (w_app_operation_len        ),
    .i_operation_addr               (w_app_operation_addr       ),
    .i_operation_valid              (w_app_operation_valid      ),
    .o_operation_ready              (w_app_operation_ready      ),           
    .i_write_data                   (w_app_write_data           ),
    .i_write_last                   (w_app_write_last           ),
    .i_write_valid                  (w_app_write_valid          ),
    .o_read_data                    (w_app_read_data            ),
    .o_read_valid                   (w_app_read_valid           )             
);

基于AXI接口的DDR3

module AXI_Master_Drive(
    input                   i_clk                   ,
    input                   i_rst                   ,

(* mark_debug = "true" *)    input                   i_init_calib_complete   ,

    output [3 :0]           m_axi_awid              ,
    output [29:0]			m_axi_awaddr            ,
    output [7 :0]			m_axi_awlen             ,
    output [2 :0]			m_axi_awsize            ,           
    output [1 :0]			m_axi_awburst           ,           
    output [0 :0]			m_axi_awlock            ,              
    output [3 :0]			m_axi_awcache           ,          
    output [2 :0]			m_axi_awprot            ,                  
    output [3 :0]			m_axi_awqos             ,         
    output 		            m_axi_awvalid           ,                 
(* mark_debug = "true" *)    input 			        m_axi_awready           ,   

    output [255:0]			m_axi_wdata             ,                 
    output [31:0]			m_axi_wstrb             ,             
    output			        m_axi_wlast             ,       
    output			        m_axi_wvalid            ,   
(* mark_debug = "true" *)    input			        m_axi_wready            ,  

    input [3 :0]			m_axi_bid               ,       
    input [1 :0]			m_axi_bresp             ,   
(* mark_debug = "true" *)    input			        m_axi_bvalid            ,       
    output			        m_axi_bready            ,  

    output  [3 :0]			m_axi_arid              ,       
    output  [29:0]			m_axi_araddr            ,   
    output  [7 :0]			m_axi_arlen             ,
    output  [2 :0]			m_axi_arsize            ,   
    output  [1 :0]			m_axi_arburst           ,       
    output  [0 :0]			m_axi_arlock            ,       
    output  [3 :0]			m_axi_arcache           ,       
    output  [2 :0]			m_axi_arprot            ,       
    output  [3 :0]			m_axi_arqos             ,   
    output			        m_axi_arvalid           ,   
(* mark_debug = "true" *)    input			        m_axi_arready           ,  

    input [3 :0]			m_axi_rid               ,       
    input [255:0]			m_axi_rdata             ,       
    input [1 :0]			m_axi_rresp             ,       
    input			        m_axi_rlast             ,       
    input			        m_axi_rvalid            ,       
    output			        m_axi_rready                       
);

/***************function**************/

/***************parameter*************/
localparam                  P_ST_INIT   =   0   ,
                            P_ST_IDLE   =   1   ,
                            P_ST_WRITE  =   2   ,
                            P_ST_READ   =   3   ;

localparam                  P_LEN       =   16  ;

/***************port******************/             

/***************mechine***************/
(* mark_debug = "true" *)reg  [7 :0]                 r_st_current        ;
reg  [7 :0]                 r_st_next           ;
reg  [15:0]                 r_st_cnt            ;

/***************reg*******************/
reg  [3 :0]                 ro_m_axi_awid       ;
(* mark_debug = "true" *)reg  [29:0]			        ro_m_axi_awaddr     ;
(* mark_debug = "true" *)reg  [7 :0]			        ro_m_axi_awlen      ;
reg  [2 :0]			        ro_m_axi_awsize     ;
reg  [1 :0]			        ro_m_axi_awburst    ;
reg  [0 :0]			        ro_m_axi_awlock     ;
reg  [3 :0]			        ro_m_axi_awcache    ;
reg  [2 :0]			        ro_m_axi_awprot     ;
reg  [3 :0]			        ro_m_axi_awqos      ;
(* mark_debug = "true" *)reg  		                ro_m_axi_awvalid    ;
(* mark_debug = "true" *)reg  [255:0]			    ro_m_axi_wdata      ;
reg  [31:0]			        ro_m_axi_wstrb      ;
(* mark_debug = "true" *)reg  			            ro_m_axi_wlast      ;
(* mark_debug = "true" *)reg  			            ro_m_axi_wvalid     ;
(* mark_debug = "true" *)reg                         ro_m_axi_bready     ;
reg  [3 :0]			        ro_m_axi_arid       ;
(* mark_debug = "true" *)reg  [29:0]			        ro_m_axi_araddr     ;
(* mark_debug = "true" *)reg  [7 :0]			        ro_m_axi_arlen      ;
reg  [2 :0]			        ro_m_axi_arsize     ;
reg  [1 :0]			        ro_m_axi_arburst    ;
reg  [0 :0]			        ro_m_axi_arlock     ;
reg  [3 :0]			        ro_m_axi_arcache    ;
reg  [2 :0]			        ro_m_axi_arprot     ;
reg  [3 :0]			        ro_m_axi_arqos      ;
(* mark_debug = "true" *)reg  		                ro_m_axi_arvalid    ;
(* mark_debug = "true" *)reg                         ro_m_axi_rready     ;
reg  [3 :0]			        ri_m_axi_rid        ;
(* mark_debug = "true" *)reg  [255:0]			    ri_m_axi_rdata      ;
reg  [1 :0]			        ri_m_axi_rresp      ;
(* mark_debug = "true" *)reg  			            ri_m_axi_rlast      ;
(* mark_debug = "true" *)reg  			            ri_m_axi_rvalid     ;
reg  [15:0]     r_read_cnt;

/***************wire******************/
wire                        w_aw_act            ;
wire                        w_w_act             ;
wire                        w_br_act            ;
wire                        w_ar_act            ;
wire                        w_r_act             ;

/***************component*************/

/***************assign****************/
assign m_axi_awid    = ro_m_axi_awid                    ;
assign m_axi_awaddr  = ro_m_axi_awaddr                  ;
assign m_axi_awlen   = ro_m_axi_awlen                   ;
assign m_axi_awsize  = ro_m_axi_awsize                  ;
assign m_axi_awburst = ro_m_axi_awburst                 ;
assign m_axi_awlock  = ro_m_axi_awlock                  ;
assign m_axi_awcache = ro_m_axi_awcache                 ;
assign m_axi_awprot  = ro_m_axi_awprot                  ;
assign m_axi_awqos   = ro_m_axi_awqos                   ;
assign m_axi_awvalid = ro_m_axi_awvalid                 ;
assign m_axi_wdata   = ro_m_axi_wdata                   ;
assign m_axi_wstrb   = ro_m_axi_wstrb                   ;
assign m_axi_wlast   = ro_m_axi_wlast                   ;
assign m_axi_wvalid  = ro_m_axi_wvalid                  ;
assign m_axi_bready  = ro_m_axi_bready                  ;
assign m_axi_arid    = ro_m_axi_arid                    ;
assign m_axi_araddr  = ro_m_axi_araddr                  ;
assign m_axi_arlen   = ro_m_axi_arlen                   ;
assign m_axi_arsize  = ro_m_axi_arsize                  ;
assign m_axi_arburst = ro_m_axi_arburst                 ;
assign m_axi_arlock  = ro_m_axi_arlock                  ;
assign m_axi_arcache = ro_m_axi_arcache                 ;
assign m_axi_arprot  = ro_m_axi_arprot                  ;
assign m_axi_arqos   = ro_m_axi_arqos                   ;
assign m_axi_arvalid = ro_m_axi_arvalid                 ;
assign m_axi_rready  = ro_m_axi_rready                  ;
assign w_aw_act      = m_axi_awvalid & m_axi_awready    ;//写地址激活信号
assign w_w_act       = m_axi_wvalid  & m_axi_wready     ;//写数据激活信号
assign w_br_act      = m_axi_bvalid  & m_axi_bready     ;//响应激活信号
assign w_ar_act      = m_axi_arvalid & m_axi_arready    ;//读地址激活信号
assign w_r_act       = m_axi_rvalid  & m_axi_rready     ;//读数据信号

/***************always****************/
//第一段状态机
always@(posedge i_clk,posedge i_rst)
begin
    if(i_rst)
        r_st_current <= P_ST_IDLE;
    else
        r_st_current <= r_st_next;    
end

//第二段
always@(*)
begin
    case(r_st_current)
        P_ST_INIT   : r_st_next <= i_init_calib_complete ? P_ST_IDLE : P_ST_INIT;
        P_ST_IDLE   : r_st_next <= P_ST_WRITE;
        P_ST_WRITE  : r_st_next <= w_br_act     ? P_ST_READ : P_ST_WRITE;
        P_ST_READ   : r_st_next <= r_read_cnt == P_LEN - 1 && w_r_act  ? P_ST_IDLE : P_ST_READ;
        default     : r_st_next <= P_ST_IDLE;
    endcase
end

always@(posedge i_clk,posedge i_rst)
begin
    if(i_rst)
        r_st_cnt <= 'd0;
    else if(r_st_current != r_st_next)
        r_st_cnt <= 'd0;
    else 
        r_st_cnt <= r_st_cnt + 1;
end

always@(posedge i_clk,posedge i_rst)
begin
    if(i_rst) begin
        ro_m_axi_awid    <= 'd0;
        ro_m_axi_awaddr  <= 'd0;
        ro_m_axi_awlen   <= 'd0;
        ro_m_axi_awsize  <= 'd0;
        ro_m_axi_awburst <= 'd0;
        ro_m_axi_awlock  <= 'd0;
        ro_m_axi_awcache <= 'd0;
        ro_m_axi_awprot  <= 'd0;
        ro_m_axi_awqos   <= 'd0;
        ro_m_axi_awvalid <= 'd0;
    end else if(w_aw_act) begin
        ro_m_axi_awid    <= 'd0;
        ro_m_axi_awaddr  <= 'd0;
        ro_m_axi_awlen   <= 'd0;
        ro_m_axi_awsize  <= 'd0;
        ro_m_axi_awburst <= 'd0;
        ro_m_axi_awlock  <= 'd0;
        ro_m_axi_awcache <= 'd0;
        ro_m_axi_awprot  <= 'd0;
        ro_m_axi_awqos   <= 'd0;
        ro_m_axi_awvalid <= 'd0;
    end else if(r_st_current == P_ST_WRITE && r_st_cnt == 0) begin
        ro_m_axi_awid    <= 'd0;
        ro_m_axi_awaddr  <= 'd0;
        ro_m_axi_awlen   <= P_LEN - 1;
        ro_m_axi_awsize  <= 3'b101;//32byte
        ro_m_axi_awburst <= 'd1;//突发模式
        ro_m_axi_awlock  <= 'd0;
        ro_m_axi_awcache <= 4'b0010;//无缓存
        ro_m_axi_awprot  <= 'd0;
        ro_m_axi_awqos   <= 'd0;
        ro_m_axi_awvalid <= 'd1;//有效拉高
    end else begin
        ro_m_axi_awid    <= ro_m_axi_awid   ;
        ro_m_axi_awaddr  <= ro_m_axi_awaddr ;
        ro_m_axi_awlen   <= ro_m_axi_awlen  ;
        ro_m_axi_awsize  <= ro_m_axi_awsize ;
        ro_m_axi_awburst <= ro_m_axi_awburst;
        ro_m_axi_awlock  <= ro_m_axi_awlock ;
        ro_m_axi_awcache <= ro_m_axi_awcache;
        ro_m_axi_awprot  <= ro_m_axi_awprot ;
        ro_m_axi_awqos   <= ro_m_axi_awqos  ;
        ro_m_axi_awvalid <= ro_m_axi_awvalid;
    end 
end

always@(posedge i_clk,posedge i_rst)
begin
    if(i_rst)
        ro_m_axi_wdata <= 'd0;
    else if(ro_m_axi_wdata == P_LEN - 1 && w_w_act)
        ro_m_axi_wdata <= 'd0;
    else if(w_w_act)
        ro_m_axi_wdata <= ro_m_axi_wdata + 1;
    else 
        ro_m_axi_wdata <= ro_m_axi_wdata;
end

always@(posedge i_clk,posedge i_rst)
begin
    if(i_rst)
        ro_m_axi_wvalid <= 'd0;
    else if(ro_m_axi_wdata == P_LEN - 1 && w_w_act)
        ro_m_axi_wvalid <= 'd0;
    else if(w_aw_act)       
        ro_m_axi_wvalid <= 'd1;
    else 
        ro_m_axi_wvalid <= ro_m_axi_wvalid;
end

always@(posedge i_clk,posedge i_rst)
begin
    if(i_rst)
        ro_m_axi_wlast <= 'd0;
    else if(ro_m_axi_wdata == P_LEN - 1 && w_w_act)
        ro_m_axi_wlast <= 'd0;
    else if(ro_m_axi_wdata == P_LEN - 2)   
        ro_m_axi_wlast <= 'd1;
    else 
        ro_m_axi_wlast <= ro_m_axi_wlast;
end

always@(posedge i_clk,posedge i_rst)
begin
    if(i_rst)
        ro_m_axi_wstrb <= 32'hffffffff;
    else 
        ro_m_axi_wstrb <= 32'hffffffff;
end

always@(posedge i_clk,posedge i_rst)
begin
    if(i_rst)
        ro_m_axi_bready <= 'd0;
    else if(w_br_act)
        ro_m_axi_bready <= 'd0;
    else if(ro_m_axi_wlast)
        ro_m_axi_bready <= 'd1;
    else 
        ro_m_axi_bready <= ro_m_axi_bready;
end

always@(posedge i_clk,posedge i_rst)
begin
    if(i_rst) begin
        ro_m_axi_arid    <= 'd0;
        ro_m_axi_araddr  <= 'd0;
        ro_m_axi_arlen   <= 'd0;
        ro_m_axi_arsize  <= 'd0;
        ro_m_axi_arburst <= 'd0;
        ro_m_axi_arlock  <= 'd0;
        ro_m_axi_arcache <= 'd0;
        ro_m_axi_arprot  <= 'd0;
        ro_m_axi_arqos   <= 'd0;
        ro_m_axi_arvalid <= 'd0;
    end else if(w_ar_act) begin
        ro_m_axi_arid    <= 'd0;
        ro_m_axi_araddr  <= 'd0;
        ro_m_axi_arlen   <= 'd0;
        ro_m_axi_arsize  <= 'd0;
        ro_m_axi_arburst <= 'd0;
        ro_m_axi_arlock  <= 'd0;
        ro_m_axi_arcache <= 'd0;
        ro_m_axi_arprot  <= 'd0;
        ro_m_axi_arqos   <= 'd0;
        ro_m_axi_arvalid <= 'd0;
    end else if(r_st_current == P_ST_READ && r_st_cnt == 0) begin
        ro_m_axi_arid    <= 'd0;
        ro_m_axi_araddr  <= 'd0;
        ro_m_axi_arlen   <= P_LEN - 1;
        ro_m_axi_arsize  <= 3'b101;
        ro_m_axi_arburst <= 'd1;
        ro_m_axi_arlock  <= 'd0;
        ro_m_axi_arcache <= 4'b0010;
        ro_m_axi_arprot  <= 'd0;
        ro_m_axi_arqos   <= 'd0;
        ro_m_axi_arvalid <= 'd1;
    end else begin
        ro_m_axi_arid    <= ro_m_axi_arid   ;
        ro_m_axi_araddr  <= ro_m_axi_araddr ;
        ro_m_axi_arlen   <= ro_m_axi_arlen  ;
        ro_m_axi_arsize  <= ro_m_axi_arsize ;
        ro_m_axi_arburst <= ro_m_axi_arburst;
        ro_m_axi_arlock  <= ro_m_axi_arlock ;
        ro_m_axi_arcache <= ro_m_axi_arcache;
        ro_m_axi_arprot  <= ro_m_axi_arprot ;
        ro_m_axi_arqos   <= ro_m_axi_arqos  ;
        ro_m_axi_arvalid <= ro_m_axi_arvalid;
    end 
end

always@(posedge i_clk,posedge i_rst)
begin
    if(i_rst)
        ro_m_axi_rready <= 'd0;
    else if(r_read_cnt == P_LEN - 1 && w_r_act)
        ro_m_axi_rready <= 'd0;
    else if(w_ar_act)
        ro_m_axi_rready <= 'd1;
    else 
        ro_m_axi_rready <= ro_m_axi_rready;
end

always@(posedge i_clk,posedge i_rst)
begin
    if(i_rst) begin
        ri_m_axi_rid    <= 'd0;
        ri_m_axi_rdata  <= 'd0;
        ri_m_axi_rresp  <= 'd0;
        ri_m_axi_rlast  <= 'd0;
        ri_m_axi_rvalid <= 'd0;
    end else begin
        ri_m_axi_rid    <= m_axi_rid   ;
        ri_m_axi_rdata  <= m_axi_rdata ;
        ri_m_axi_rresp  <= m_axi_rresp ;
        ri_m_axi_rlast  <= m_axi_rlast ;
        ri_m_axi_rvalid <= m_axi_rvalid;
    end
end

always@(posedge i_clk,posedge i_rst)
begin
    if(i_rst)
        r_read_cnt <= 'd0;
    else if(r_read_cnt == P_LEN - 1 && w_r_act)
        r_read_cnt <= 'd0;
    else if(w_r_act)
        r_read_cnt <= r_read_cnt + 1;
    else 
        r_read_cnt <= r_read_cnt;
end
endmodule

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

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

相关文章

SpringCloud Alibaba Nacos 服务注册和配置中心

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第十二篇&#xff0c;即介绍 SpringCloud Alibaba Nacos 服务注册和配置中心。 二、Nacos 简介 2.1 为…

【DataWhale】灵境Agent开发——低代码创建AI智能体

灵境Agent开发——低代码创建AI智能体 3 灵境 Agent 低代码开发 ​ 低代码模式支持开发者通过编排工作流的方式快速构建智能体&#xff0c;您可以通过拖拽和组合模型、提示词、代码等模块&#xff0c;实现准确的、复杂的业务流程。 ​ 个人体验下来&#xff0c;目前这个低代…

华为OD机22道试题

华为OD机试题 2.查找小朋友的好朋友位置 在学校中&#xff0c;N 个小朋友站成一队&#xff0c;第 i 个小朋友的身高为 height[i]&#xff0c;第 i 个小朋友可以看到第一个比自己身高更高的小朋友j&#xff0c;那么 j 是 i 的好朋友 (要求&#xff1a;j>i) 。 请重新生成一个…

[运维] 可视化爬虫易采集-EasySpider(笔记)

一、下载 ​下载地址 下滑到Assets页面&#xff0c;选择下载 二、解压运 ​解压压缩包&#xff0c;打开文件夹 在此文件夹下打开Linux Terimal, 并输入以下命令运行软件&#xff1a; ./easy-spider.sh 注意软件运行过程中不要关闭terminal。 三、使用 1.开始 首先点击…

机器学习算法那些事 | 数据算法工程师必须掌握的5个Python库

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;数据算法工程师必须掌握的5个Python库 如果你是一名初学者或中级机器学习工程师或数据科学家&#xff0c;这篇文章非常适合你。你已经选择了自…

【C语言】动态内存分配

1、为什么要有动态内存分配 不管是C还是C中都会大量的使用&#xff0c;使用C/C实现数据结构的时候&#xff0c;也会使用动态内存管理。 我们已经掌握的内存开辟方式有&#xff1a; int val 20; //在栈空间上开辟四个字节 char arr[10] { 0 }; //在栈空间…

[SAP ABAP] SE11查询数据库表中的数据

我们可以通过事务码SE11查询对应数据库表中的详细数据 本次查询使用的数据库表名为MARA&#xff0c;具体操作如下所示: ① 输入事务码SE11进入ABAP字典操作界面&#xff0c;在数据库表搜索框中输入目标表名MARA&#xff0c;并点击【显示】按钮 ② 进入到显示表界面&#xff0…

阿里云服务器租用一年多少钱?2024年最新阿里云租用价格

2024年阿里云服务器租用费用&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核4G服务…

HarmonyOS NEXT应用开发—使用绘制组件实现自定义进度动画

介绍 本示例介绍使用绘制组件中的Circle组件以及Path组件实现实时进度效果。该场景多用于手机电池电量、汽车油量、水位变化等动态变化中。 效果预览图 使用说明 加载完成后初始显示进度为0%&#xff0c;颜色为红色&#xff0c;且有充电、放电两个按钮。点击充电按钮&#x…

C++中的std::for_each并行执行探索

在C标准库中&#xff0c;std::for_each是一个用于遍历容器或可迭代序列并对每个元素执行特定操作的强大工具。传统的std::for_each是顺序执行的&#xff0c;即它会按照元素在序列中的顺序&#xff0c;逐个应用函数对象或lambda表达式。然而&#xff0c;随着多线程编程的普及和硬…

升级 HarmonyOS 4 版本,腕上智慧更进一步

HUAWEI WATCH GT 3 系列升级 HarmonyOS 4 新版本后&#xff0c;手表体验更进一步&#xff0c;快来看看有哪些变化吧~

Vue2(八):TodoList案例

一、整体思路 1.分析结构 我们对大盒子拆分&#xff0c;分成header、list、footer&#xff0c;但是list最好也进行拆分&#xff0c;因为它里面的每个小盒子结构一样就是字不一样&#xff0c;可以用一个组件多次调用完成&#xff0c;所以分成app>header、list、footer>i…

Stability AI发布Stable Video 3D模型:可从单张图像创建多视图3D视频,视频扩散模型史诗级提升!

Stability AI发布了Stable Video 3D (SV3D)&#xff0c;这是一种基于稳定视频扩散的生成模型&#xff0c;推动了3D技术领域的发展&#xff0c;并大大提高了质量和视图一致性。 该版本有两个版本: SV3D_u:该变体基于单图像输入生成轨道视频&#xff0c;无需相机调节。 SV3D_p:扩…

yolov6实现遥感影像目标识别|以DIOR数据集为例

1 目标检测是计算机视觉领域中的一项重要任务&#xff0c;它的目标是在图像或视频中检测出物体的位置和类别。YOLO&#xff08;You Only Look Once&#xff09;是一系列经典的目标检测算法&#xff0c;最初由Joseph Redmon等人于2016年提出。YOLO算法具有快速、简单、端到端的特…

QT学习第一天,创建工程文件,创建按钮,对象树的概念

创建qt 方式一&#xff1a;欢迎》project》new project 方式二&#xff1a;菜单栏》文件》新建文件或项目 打开项目 方式1&#xff1a; 欢迎》project》open project 方式2&#xff1a;打开目录&#xff08;页面上不存在的项目&#xff09; 创建工程时需要注意&#xff1…

YOLOv5全网首发改进: 注意力机制改进 | 上下文锚点注意力(CAA) | CVPR2024 PKINet 遥感图像目标检测

💡💡💡本文独家改进:引入了CAA模块来捕捉长距离的上下文信息,利用全局平均池化和1D条形卷积来增强中心区域的特征,从而提升检测精度,CAA和C3进行结合实现二次创新,改进思路来自CVPR2024 PKINet,2024年前沿最新改进,抢先使用 💡💡💡小目标数据集,涨点近两个…

opencv图片处理基础

文章目录 计算机中图片构成红绿蓝边界填充色彩图片转二值图腐蚀操作sobel算子滤波图像阈值函数 边缘检测轮廓检测轮廓特征与轮廓近似轮廓特征轮廓近似 计算机中图片构成红绿蓝 图片由像素点构成&#xff0c;每个像素点有三个通道&#xff0c;分别是RGB&#xff0c;对应红绿蓝颜…

DFS深度优先搜索刷题(一)

一.P2089 烤鸡 算法思想&#xff1a; 指数型枚举&#xff0c;可以通过dfs深度优先搜索暴力枚举出所有可能的情况&#xff0c;在通过剪枝去除错误的方案来减少时间开销。主要用一个循环枚举每个调料放几克&#xff08;每个位置的分支情况都相同&#xff09;&#xff0c;注意回溯…

分类预测 | Matlab实现PSO-KELM粒子群优化算法优化核极限学习机分类预测

分类预测 | Matlab实现PSO-KELM粒子群优化算法优化核极限学习机分类预测 目录 分类预测 | Matlab实现PSO-KELM粒子群优化算法优化核极限学习机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现PSO-KELM粒子群优化算法优化核极限学习机分类预测(完整源…

【c++初阶】C++入门(下)

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…