FPGA——DDR3的IP核

2024-03-19 04:36
文章标签 ip fpga ddr3

本文主要是介绍FPGA——DDR3的IP核,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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) 
beginif(i_ui_rst)r_st_current <= P_ST_INIT;else r_st_current <= r_st_next;
endalways@(*)
begincase(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
endalways@(posedge i_ui_clk,posedge i_ui_rst) 
beginif(i_ui_rst)r_init <= 'd0;elser_init <= {r_init[6 :0],init_calib_complete};
endalways@(posedge i_ui_clk,posedge i_ui_rst) 
beginif(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;
endalways@(posedge i_ui_clk,posedge i_ui_rst) 
beginif(i_ui_rst) beginri_operation_cmd  <= 'd0;ri_operation_len  <= 'd0;ri_operation_addr <= 'd0;end else if(w_op_act) beginri_operation_cmd  <= i_operation_cmd ;ri_operation_len  <= i_operation_len ;ri_operation_addr <= i_operation_addr;end else beginri_operation_cmd  <= ri_operation_cmd ;ri_operation_len  <= ri_operation_len ;ri_operation_addr <= ri_operation_addr;endendalways@(posedge i_ui_clk,posedge i_ui_rst) 
beginif(i_ui_rst)r_op_act <= 'd0;else r_op_act <= w_op_act;
endalways@(posedge i_ui_clk,posedge i_ui_rst) 
beginif(i_ui_rst) beginro_app_cmd <= 'd0;ro_app_en  <= 'd0;end else if(r_st_current == P_ST_WRITE) beginro_app_cmd <= 'd0;ro_app_en  <= 'd1;end else if(r_st_current == P_ST_READ) beginro_app_cmd <= 'd1;ro_app_en  <= 'd1;end else beginro_app_cmd <= 'd0;ro_app_en  <= 'd0;endendalways@(posedge i_ui_clk,posedge i_ui_rst) 
beginif(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;
endalways@(posedge i_ui_clk,posedge i_ui_rst) 
beginif(i_ui_rst)ro_app_wdf_mask <= 'd0;else ro_app_wdf_mask <= 'd0;
endalways@(posedge i_ui_clk,posedge i_ui_rst) 
beginif(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;
endalways@(posedge i_ui_clk,posedge i_ui_rst) 
beginif(i_ui_rst) beginro_read_data  <= 'd0;ro_read_valid <= 'd0;end else  beginro_read_data  <= app_rd_data;ro_read_valid <= app_rd_data_valid;end 
endalways@(posedge i_ui_clk,posedge i_ui_rst) 
beginif(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;
endalways@(posedge i_ui_clk,posedge i_ui_rst) 
beginif(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;
endalways@(posedge i_ui_clk,posedge i_ui_rst) 
beginif(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;
endalways@(posedge i_ui_clk,posedge i_ui_rst)
beginif(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;
endendmodule

示列

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)
beginif(i_rst)r_st_current <= P_ST_IDLE;elser_st_current <= r_st_next;    
end//第二段
always@(*)
begincase(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
endalways@(posedge i_clk,posedge i_rst)
beginif(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;
endalways@(posedge i_clk,posedge i_rst)
beginif(i_rst) beginro_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) beginro_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) beginro_m_axi_awid    <= 'd0;ro_m_axi_awaddr  <= 'd0;ro_m_axi_awlen   <= P_LEN - 1;ro_m_axi_awsize  <= 3'b101;//32bytero_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 beginro_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 
endalways@(posedge i_clk,posedge i_rst)
beginif(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;
endalways@(posedge i_clk,posedge i_rst)
beginif(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;
endalways@(posedge i_clk,posedge i_rst)
beginif(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;
endalways@(posedge i_clk,posedge i_rst)
beginif(i_rst)ro_m_axi_wstrb <= 32'hffffffff;else ro_m_axi_wstrb <= 32'hffffffff;
endalways@(posedge i_clk,posedge i_rst)
beginif(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;
endalways@(posedge i_clk,posedge i_rst)
beginif(i_rst) beginro_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) beginro_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) beginro_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 beginro_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 
endalways@(posedge i_clk,posedge i_rst)
beginif(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;
endalways@(posedge i_clk,posedge i_rst)
beginif(i_rst) beginri_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 beginri_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
endalways@(posedge i_clk,posedge i_rst)
beginif(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

这篇关于FPGA——DDR3的IP核的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/824804

相关文章

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重

Linux配置IP地址的三种实现方式

《Linux配置IP地址的三种实现方式》:本文主要介绍Linux配置IP地址的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录环境RedHat9第一种安装 直接配置网卡文件第二种方式 nmcli(Networkmanager command-line

Linux虚拟机不显示IP地址的解决方法(亲测有效)

《Linux虚拟机不显示IP地址的解决方法(亲测有效)》本文主要介绍了通过VMware新装的Linux系统没有IP地址的解决方法,主要步骤包括:关闭虚拟机、打开VM虚拟网络编辑器、还原VMnet8或修... 目录前言步骤0.问题情况1.关闭虚拟机2.China编程打开VM虚拟网络编辑器3.1 方法一:点击还原VM

Nginx实现动态封禁IP的步骤指南

《Nginx实现动态封禁IP的步骤指南》在日常的生产环境中,网站可能会遭遇恶意请求、DDoS攻击或其他有害的访问行为,为了应对这些情况,动态封禁IP是一项十分重要的安全策略,本篇博客将介绍如何通过NG... 目录1、简述2、实现方式3、使用 fail2ban 动态封禁3.1 安装 fail2ban3.2 配

Ubuntu固定虚拟机ip地址的方法教程

《Ubuntu固定虚拟机ip地址的方法教程》本文详细介绍了如何在Ubuntu虚拟机中固定IP地址,包括检查和编辑`/etc/apt/sources.list`文件、更新网络配置文件以及使用Networ... 1、由于虚拟机网络是桥接,所以ip地址会不停地变化,接下来我们就讲述ip如何固定 2、如果apt安

查询SQL Server数据库服务器IP地址的多种有效方法

《查询SQLServer数据库服务器IP地址的多种有效方法》作为数据库管理员或开发人员,了解如何查询SQLServer数据库服务器的IP地址是一项重要技能,本文将介绍几种简单而有效的方法,帮助你轻松... 目录使用T-SQL查询方法1:使用系统函数方法2:使用系统视图使用SQL Server Configu

使用Java实现获取客户端IP地址

《使用Java实现获取客户端IP地址》这篇文章主要为大家详细介绍了如何使用Java实现获取客户端IP地址,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 首先是获取 IP,直接上代码import org.springframework.web.context.request.Requ

C++实现获取本机MAC地址与IP地址

《C++实现获取本机MAC地址与IP地址》这篇文章主要为大家详细介绍了C++实现获取本机MAC地址与IP地址的两种方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实际工作中,项目上常常需要获取本机的IP地址和MAC地址,在此使用两种方案获取1.MFC中获取IP和MAC地址获取

C/C++通过IP获取局域网网卡MAC地址

《C/C++通过IP获取局域网网卡MAC地址》这篇文章主要为大家详细介绍了C++如何通过Win32API函数SendARP从IP地址获取局域网内网卡的MAC地址,感兴趣的小伙伴可以跟随小编一起学习一下... C/C++通过IP获取局域网网卡MAC地址通过win32 SendARP获取MAC地址代码#i

shell脚本快速检查192.168.1网段ip是否在用的方法

《shell脚本快速检查192.168.1网段ip是否在用的方法》该Shell脚本通过并发ping命令检查192.168.1网段中哪些IP地址正在使用,脚本定义了网络段、超时时间和并行扫描数量,并使用... 目录脚本:检查 192.168.1 网段 IP 是否在用脚本说明使用方法示例输出优化建议总结检查 1