在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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?