您当前的位置: 首页 > 

FPGA硅农

暂无认证

  • 1浏览

    0关注

    282博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

DDR3 MIG IP核仿真与学习

FPGA硅农 发布时间:2022-01-03 19:49:02 ,浏览量:1

MIG IP核介绍

在Xilinx系列的FPGA中,为了方便用户对DDR进行读写,官方提供了用于访问DDR的IP核MIG,全称为Memory Interface Generator,具体可参考赛灵思官方文档参考手册:ug586(7 Series Devices Memory Interface Solutions v4.1)。下图是MIG IP核的架构,从图中可以看出,MIG主要有面向用户的端口和面向DDR的端口,用户通过使用MIG能够通过用户端口的信号,来完成对DDR SDRAM的访问,达到简化操作的目的。 在这里插入图片描述 在本文中,我们仅关注某些面向用户的端口,即以下端口: clk,rst app_addr,app_cmd,app_en,app_rdy app_wdf_wren,app_wdf_end,app_wdf_rdy,app_wdf_data app_rd_data,app_rd_data_valid 其中,第一行信号为全局的时钟和复位信号,第二行信号为命令通道信号,用于发出读写命令,第三行信号为写数据通道信号,最后一行信号为读数据通道信号。

命令通道

在这里插入图片描述 如上图所示,app_cmd用于指定是何命令,3’b000为写命令,而3’b001为读命令,app_addr为相应的读写地址,命令只会在app_en和app_rdy同时为高时,才会被接受。

读数据通道

在这里插入图片描述

如上图所示,读数据的时序比较简单,当读命令发出后,过若干时钟周期,app_rd_data_valid信号便会拉高,此时对应的app_rd_data就是读出的数据。

写数据通道

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

上图是一张MIG控制器的写时序图和官方对这几种写操作的解释,通过官方文档的介绍我们可以知道写入的数据可以在写命令给出之前,之时或者之后给出,但是在写命令之后给出的写数据不能超过两个时钟周期。在写命令之前给出写数据则没有这些限制。之所以能过这样操作,是因为在IP核内部有写入数据的FIFO能够对数据实现缓冲。 在本文中,我们采用1这种方式的数据写入。

DDR3 MIG实验

在本实验中,我们实现了一个接口转换:将MIG用户侧的app_*接口信号转化为AXI4接口信号,以供用户更方便的进行调用。 转化的代码如下:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/01/03 10:38:32
// Design Name: 
// Module Name: mig2axi4
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module mig2axi4(
//AXI4接口
//全局信号
input logic ACLK,
input logic ARESETn,
//读地址通道
input logic [31:0] ARADDR,
input logic [7:0] ARLEN,
input logic [2:0] ARSIZE,               //2^7=128
input logic [1:0] ARBURST,
input logic [2:0] ARPROT,
input logic ARVALID,
output logic ARREADY,
//读数据通道
output logic RVALID,
output logic [127:0] RDATA,
output logic [1:0] RRESP,
output logic RLAST,
input logic RREADY,
//写地址通道                 
input logic [31:0] AWADDR,
input logic [7:0] AWLEN,
input logic [2:0] AWSIZE,
input logic [1:0] AWBURST,
input logic [2:0] AWPROT,            
input logic AWVALID,
output logic AWREADY,
//写数据通道
input logic [127:0]WDATA,
input logic [15:0] WSTRB,
input logic WLAST,
input logic WVALID,
output logic WREADY,
//写应答通道
output logic [1:0] BRESP,
output logic BVALID,
input logic BREADY,
//MIG侧接口        
input  logic ui_clk,                
input  logic ui_clk_sync_rst,       
input  logic init_calib_complete,   
input  logic app_rdy,               
input  logic app_wdf_rdy,           
input  logic app_rd_data_valid,     
input  logic [127:0]   app_rd_data,           
output logic [27:0]    app_addr,                                 
output logic app_en,                
output logic app_wdf_wren,          
output logic app_wdf_end,           
output logic [2:0]     app_cmd,               //3'b000为写数据,3'b001为读数据           
output logic [127:0]   app_wdf_data
    );

logic [31:0] rd_base_addr;                       //地址每次递增128/16=8
logic [8:0]  rd_len;
logic [31:0] wr_base_addr;
logic [8:0] wr_len;
logic [127:0] rd_buffer [0:255];                  //读数据缓存
logic [31:0] rd_cnt;                              //数据缓存中数据个数
logic [31:0] rd_cmd_cnt;                          //读命令个数
logic [31:0] wr_cnt;                             
logic [31:0] send_cnt;                            //数据发送个数
typedef enum bit [7:0] { 
    IDLE,
    READ,
    WRITE
} State;
State cur_state,next_state;
//cur_state
always_ff@(posedge ACLK,negedge ARESETn)
if(!ARESETn)
    cur_state            
关注
打赏
1658642721
查看更多评论
0.0436s