ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

FPGA——VIVADO DDR3 MIG IP核读写接口

2022-03-05 22:03:47  阅读:217  来源: 互联网

标签:wdf input FPGA IP app MIG ddr3 output data


一、DDR3


ddrio_mod u_ddrio_mod (
    // 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 (write 000,read 001,write bytes 011)
    .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                     ('b0                ),  // input			app_sr_req(This input is reserved and should be tied to 0.)
    .app_ref_req                    ('b0                ),  // input			app_ref_req
    .app_zq_req                     ('b0                ),  // input			app_zq_req
    .app_sr_active                  (                   ),  // output			app_sr_active
    .app_ref_ack                    (                   ),  // output			app_ref_ack
    .app_zq_ack                     (                   ),  // output			app_zq_ack

    .ui_clk                         (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                      (sys_clk_i          ),
    .sys_rst                        (sys_rst            )   // input sys_rst
);

二、写

//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2022/03/05 15:56:56
// Design Name  CNLUZT: 
// Module Name: ddr_wrapp
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module ddr_wrapp(
    //sys port
    clk         ,
    rst_n       ,
    en          ,
    addr        ,
    dat_i       ,
    done        ,
    busy        ,
    //ddrctr interface port
    app_cmd     ,
    app_addr    ,
    app_en      ,
    app_wdf_data,
    app_wdf_end ,
    app_wdf_wren,
    app_rdy     ,
    app_wdf_rdy  
);
//sys param
parameter   ADDR_W  =   28;
parameter   DATA_W  =   128;

//state mechine param
parameter   STATE_W =   3       ,
            IDLE    =   3'b001  ,
            WR      =   3'b010  ,
            ADDR    =   3'b100  ;



//sys port
input                   clk             ;
input                   rst_n           ;
input                   en              ;
input   [ADDR_W-1:0]    addr            ;
input   [DATA_W-1:0]    dat_i           ;
output                  done            ;
output                  busy            ;

//ddrctr interface port
output  [2:0]           app_cmd         ;
output  [ADDR_W-1:0]    app_addr        ;
output                  app_en          ;
output  [DATA_W-1:0]    app_wdf_data    ;
output                  app_wdf_end     ;
output                  app_wdf_wren    ;
input                   app_rdy         ;
input                   app_wdf_rdy     ;

//ddrctr interface signal
reg     [2:0]           app_cmd         = 'b0;
reg     [27:0]          app_addr        = 'b0;
wire                    app_en          ;
reg     [127:0]         app_wdf_data    = 'b0;
wire                    app_wdf_end     ;
wire                    app_wdf_wren    ;

//sys signal
reg                     done            ;
reg                     busy            ;

//state mechine singal
reg     [STATE_W-1:0]   state_c         ;
reg     [STATE_W-1:0]   state_n         ;
wire                    idl2wr_start    ;
wire                    wr2addr_start   ;
wire                    addr2idl_start  ;

//flag singal
wire                    wr_end          ;
wire                    cmd_end         ;

always@(posedge clk or negedge rst_n)begin  
    if(!rst_n)begin   
        state_c <= IDLE;
    end 
    else begin
        state_c <= state_n; 
    end
end

always@(*)begin 
case(state_c)   
    IDLE: begin  
        if(idl2wr_start)begin 
            state_n = WR;
        end
        else begin
            state_n = state_c; 
        end
    end
    WR:begin
        if(wr2addr_start)begin
            state_n = ADDR;
        end
        else begin
            state_n = state_c;
        end
    end
    ADDR:begin
        if(addr2idl_start)begin 
            state_n = IDLE;
        end
        else begin
            state_n = state_c;
        end
    end
    default:begin
        state_n = IDLE;
    end 
    endcase
end

assign idl2wr_start     =   state_c == IDLE   && en;
assign wr2addr_start    =   state_c == WR     && wr_end;
assign addr2idl_start   =   state_c == ADDR   && cmd_end;

//flag
assign wr_end           =   (app_rdy & app_wdf_rdy & app_wdf_wren & state_c == WR);
assign cmd_end          =   (app_rdy & app_wdf_rdy & app_en & (state_c == ADDR));

always @(posedge clk)begin
    if(state_c == IDLE & en)begin
        app_cmd <= 3'b000;
        app_addr <= addr;
        app_wdf_data <= dat_i;
    end
end



assign app_wdf_wren = (state_c == WR)   & app_rdy & app_wdf_rdy;
assign app_wdf_end  = (state_c == WR)   & app_rdy & app_wdf_rdy;
assign app_en       = (state_c == ADDR) & app_rdy & app_wdf_rdy;

always @(posedge clk or negedge rst_n)begin
    if(!rst_n)
        done <= 0;
    else if(cmd_end)
        done <= 1;
    else
        done <= 0;
end

always @(posedge clk or negedge rst_n)begin
    if(!rst_n)
        busy <= 0;
    else if(state_c == IDLE & en)
        busy <= 1;
    else if(done)
        busy <= 0;
end

endmodule

三、读

//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2022/03/05 15:56:56
// Design Name: CNLUZT 
// Module Name: ddr_wrapp
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module ddr_rdapp(
    //sys port
    clk                 ,
    rst_n               ,
    en                  ,
    addr                ,
    dat_o               ,
    nd                  ,
    busy                ,
    //ddrctr interface port
    app_cmd             ,
    app_addr            ,
    app_en              ,
    app_rd_data         ,
    app_rd_data_end     ,
    app_rdy             ,
    app_rd_data_valid    
);
//sys param
parameter   ADDR_W  =   28;
parameter   DATA_W  =   128;

//state mechine param
parameter   STATE_W =   3       ,
            IDLE    =   3'b001  ,
            RD      =   3'b010  ,
            ADDR    =   3'b100  ;



//sys port
input                   clk                 ;
input                   rst_n               ;
input                   en                  ;
input   [ADDR_W-1:0]    addr                ;
output  [DATA_W-1:0]    dat_o               ;
output                  nd                  ;
output                  busy                ;

//ddrctr interface port
output  [2:0]           app_cmd             ;
output  [ADDR_W-1:0]    app_addr            ;
output                  app_en              ;
input   [DATA_W-1:0]    app_rd_data         ;
input                   app_rd_data_end     ;
input                   app_rdy             ;
input                   app_rd_data_valid   ;


//ddrctr interface signal
reg     [2:0]           app_cmd         = 'b0;
reg     [27:0]          app_addr        = 'b0;
wire                    app_en              ;

//sys signal
reg     [DATA_W-1:0]    dat_o               ;
reg                     nd                  ;
reg                     busy                ;

//state mechine singal
reg     [STATE_W-1:0]   state_c             ;
reg     [STATE_W-1:0]   state_n             ;
wire                    idl2addr_start      ;
wire                    addr2rd_start       ;
wire                    rd2idl_start        ;

//flag singal
wire                    rd_end              ;
wire                    cmd_end             ;

always@(posedge clk or negedge rst_n)begin  
    if(!rst_n)begin   
        state_c <= IDLE;
    end 
    else begin
        state_c <= state_n; 
    end
end

always@(*)begin 
case(state_c)   
    IDLE: begin  
        if(idl2addr_start)begin 
            state_n = ADDR;
        end
        else begin
            state_n = state_c; 
        end
    end
    ADDR:begin
        if(addr2rd_start)begin 
            state_n = RD;
        end
        else begin
            state_n = state_c;
        end
    end
    RD:begin
        if(rd2idl_start)begin
            state_n = ADDR;
        end
        else begin
            state_n = state_c;
        end
    end
    default:begin
        state_n = IDLE;
    end 
    endcase
end

assign idl2addr_start   =   state_c == IDLE     && en;
assign addr2rd_start    =   state_c == ADDR     && cmd_end;
assign rd2idl_start     =   state_c == RD       && rd_end;

//flag
assign rd_end           =   (app_rdy  & app_rd_data_end & (state_c == RD)   );
assign cmd_end          =   (app_rdy  & app_en          & (state_c == ADDR) );

always @(posedge clk)begin
    if(state_c == IDLE & en)begin
        app_cmd <= 3'b001;
        app_addr <= addr;
    end
end

assign app_en           =   (state_c == ADDR) & app_rdy;

always @(posedge clk or negedge rst_n)begin
    if(!rst_n)
        dat_o <= 0;
    else if((state_c == RD) & app_rd_data_valid)
        dat_o <= app_rd_data;
    else if(nd)
        dat_o <= 0;
end

always @(posedge clk or negedge rst_n)begin
    if(!rst_n)
        nd <= 0;
    else if(cmd_end)
        nd <= 1;
    else
        nd <= 0;
end

always @(posedge clk or negedge rst_n)begin
    if(!rst_n)
        busy <= 0;
    else if(state_c == IDLE & en)
        busy <= 1;
    else if(nd)
        busy <= 0;
end

endmodule

标签:wdf,input,FPGA,IP,app,MIG,ddr3,output,data
来源: https://www.cnblogs.com/cnlntr/p/15969553.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有