FPGA-基于AXI4接口的DDR3读写顶层模块

一、AXI4简介

AXI4(Advancede Xtensible Interface 4)是一种高性能、高带宽的总线接口协议,用于在系统级芯片设计中连接不同的IP核(Intellectual Property)或模块。它是由ARM公司开发的,被广泛应用于各种SoC(System-on-Chip)设计中。

AXI4接口协议定义了一组规范,用于描述数据传输、地址传输、控制信号和时序等方面的要求。它提供了一种灵活的、可扩展的接口,支持高性能和低功耗的系统设计。以下是AXI4接口的一些关键特性:

  1. 高性能:AXI4接口支持并行数据传输和乱序传输,可以实现高带宽和低延迟的数据传输。它使用独立的读写通道,可以同时进行读写操作,提高了系统的吞吐量。
  2. 灵活性:AXI4接口支持多种传输模式,包括单个传输、突发传输和流传输。它还支持不同的传输宽度和字节顺序,可以适应不同的应用需求。

  3. 可扩展性:AXI4接口支持多个主设备和多个从设备的连接,可以构建复杂的系统结构。它使用ID信号来标识不同的传输,支持乱序传输和乱序应答,提高了系统的并行性能。

  4. 低功耗:AXI4接口使用了一些低功耗技术,如低功耗模式和时钟门控等,可以降低系统的功耗消耗。

AXI4接口广泛应用于各种SoC设计中,包括嵌入式系统、网络设备、图像处理器、数字信号处理器等。它可以连接处理器核、存储器、外设和其他IP核。Xilinx 的 mig ddr Ip 核,无论是 6 系列还是 7 系列还是最新的FPGA,都集成了 AXI4 接口,采用 AXI4 接口进行读写,后续可以兼容 xilinx的其他fpga,可复用性更强。

AXI4 协议支持突发传输,为存储映射接口(如果一个协议是存储映射的,那么主机所发出的会话(无论读或写)就会标明一个地址,这个地址对应于系统存储空间中的一个地址,表明是针对该存储空间的读写操作),主要用于处理器访问存储器等需要指定地址的高速数据传输场景。同样属于存储映射的接口AXI-Lite 为外设提供单个数据传输,主要用于访问一些低速外设中的寄存器。而 AXI-Stream 接口则像 FIFO 一样,数据传输时不需要地址,在主从设备之间直接连续读写数据,主要用于如视频、高速AD、PCIe、DMA接口等需要高速数据传输的场合。

AXI4接口由5个独立通道构成:写地址、写数据、写响应、读地址、读数据

写传输过程如图1所示,主机在写地址通道给出写地址和控制信号,然后在写数据通道连续突发写4个数据。从机在接收数据之后,在写响应通道给出响应信号。

图1 AXI4 写过程示意

 

图2 写数据时序图

读传输过程如图3所示, 在一个读传输过程中,主机首先在读地址通道给出读地址和控制信号,然后从机由读数据通道返回读出的数据。

图3 AXI4读取过程示意

 

图4 读数据时序图

二、 建立MIG的IP核工程

打开 IP Catalog 在搜索栏输入 mig(Memory Interface Generator),双击直接打开。Mig IP
核如名字所示,是一种存储器接口,可简易控制 ddr2,ddr3,ddr4 等存储器,7系列的 mig
ip 核只支持 ddr3,ddr2。

在IP核的Clock Period设置时,选择3125ps,对应320M,它是DDR3 芯片运行时钟周期,这个参数的范围和 FPGA 的芯片类型以及具体类型的速度等级有关,这个时钟是 MIGIP 核产生,并输出给 DDR3 物理芯片使用的,它关系到 DDR3 芯片具体的运行带宽,本次实验的开发板板载了 2 颗 DDR3 芯片,单个芯片数据位宽为16位,数据位宽总共 32 位,因为是双沿触发,这里带宽达到了20.48Gb/s(640M*32bit)

IP核的PHY to Controller Clock Ratio设置:DDR3 物理芯片运行时钟和 MIG IP 核的用户端(FPGA)的时钟之比,一般有 4:1 和 2:1 两个选项,高速传输的场合选择 4:1,要求低延时的场合选择 2:1。注意,当DDR3时钟选择选择了350M 到最高的400M时,比例默认只为4:1,低于350M才有4:1和2:1两个选项。由于 DDR 芯片的运行时钟是 320Mhz,因此 MIG IP 核的用户时钟(ui_clk)就是 160Mhz,该时钟是IP核 2:1 生成的时钟160M,而我们采用的 axi4 接口数据位宽设置为 64 位,用户端口带宽为10.48Gb/s(160M*64bit),刚好为 1 半物理带宽, ddr3 存储器物理上不能同时写与读, 而 axi4是可同时读与写的协议,因此我们为用户端口的读与写各自分配物理带宽的 1 半,如果用户端带宽大于物理端,会产生数据错误,本设计为读与写各自分配一半带宽,那么即便读与写同时进行操作,总带宽也只是达到DDR3的物理带宽,不会发生数据错误。
 

 三、AXI4写主机模块

AXI4 写模块将复杂的 AXI4 接口的写接口进行封装成简易的用户接口,用户接口包括fifo 端数据接口与若干控制信号。 AXI4 写接口包括写通道的写地址通道,写通道写数据通道,写通道写响应通道这三个接口,其中每组最重要的还是握手信号接口,主机发出 valid 告诉从机本数据有效,从机接收到 valid 发送 ready 告诉主机,准备已经就绪,就这样主机与从机完成了一个握手信号。
 

图5 写主机模块框图

 AXI4 写主机模块将左边的用户控制接口转换为标准的 AXI4 接口信号,用以控制基于AXI4 的 XILINX 存储器控制的MIG IP 核,完成 DDR3 DRAM 的写数据控制。

`timescale 1ns/1ps


module axi_master_write (
input         ARESETN              ,//axi reset
input         ACLK                 ,//axi clock

  //AXI write passageway for addr
output [3:0]  M_AXI_awid        ,//wr addr ID,for mark a group wr_signal
(*mark_debug="true"*)output [31:0] M_AXI_awaddr      ,
(*mark_debug="true"*)output [7:0]  M_AXI_awlen       ,//transmission times
output [2:0]  M_AXI_awsize      ,//byte volume of every transmission 
output [1:0]  M_AXI_awburst     ,//burst type,'01'represent increase,'10' opposite
output        M_AXI_awlock      ,//总线锁信号
output [3:0]  M_AXI_awcache     ,//存储类型
output [2:0]  M_AXI_awprot      ,//保护类型
output [3:0]  M_AXI_awqos       ,//质量服务Qos
(*mark_debug="true"*)output        M_AXI_awvalid     ,//passageway addr ctrl signal valid
(*mark_debug="true"*)input         M_AXI_awready     ,//slave machine allow accept addr and order
  //AXI write passageway for wr_data
(*mark_debug="true"*)output [63:0] M_AXI_wdata       ,
output [7:0]  M_AXI_wstrb       ,//wr_data valid byte line,explain which 8bit is valid
(*mark_debug="true"*)output        M_AXI_wlast       ,
(*mark_debug="true"*)output        M_AXI_wvalid      ,//the write valid
(*mark_debug="true"*)input         M_AXI_wready      ,//slave machine allow accept data
  //AXI write passageway for response
input  [3:0]  M_AXI_bid         ,//wr_resp ID TAG
input  [1:0]  M_AXI_bresp       ,//transmission state
(*mark_debug="true"*)input         M_AXI_bvalid      ,//response valid
output        M_AXI_bready      ,//lead plane can accept response

  //user port signal
input         WR_start             ,//write burst signal
input  [31:0] WR_adrs              ,//addr
input  [9:0]  WR_len               ,
output        WR_ready             ,//write idle,to axi_ctrl module
output        WR_FIFO_re           ,//connect to FIFO read enable
input  [63:0] WR_FIFO_data         ,//connect to FIFO read data
output        WR_done               //finish burst,给读写控制模块
);
    

//****************** Parameter and Internal Signal *******************//
localparam S_WR_IDLE  =  3'd0;
localparam S_WA_WAIT  =  3'd1;
localparam S_WA_START =  3'd2;
localparam S_WD_WAIT  =  3'd3;
localparam S_WD_PROC  =  3'd4;//write data process
localparam S_WR_WAIT  =  3'd5;//write response
localparam S_WR_DONE  =  3'd6;
//reg define
reg [2:0]     wr_state         ;
reg [31:0]    reg_wr_adrs      ;//addr reg
reg           reg_awvalid      ;//addr valid handshaking
reg           reg_wvalid       ;//data valid handshaking
reg           reg_w_last       ;
reg [7:0]     reg_w_len        ;//max of burst len is 256,but 128 is best
reg [7:0]     reg_w_stb        ;

//***************************** Main Code ****************************//
assign   WR_done = (wr_state == S_WR_DONE);
assign   WR_FIFO_re             = (reg_wvalid & M_AXI_wready);
assign   M_AXI_awid             = 4'b1111;//lead plane ID
assign   M_AXI_awaddr[31:0]     = reg_wr_adrs[31:0];
assign   M_AXI_awlen[7:0]       = WR_len - 'd1;
//represent AXI4 bus every data width is 8byte,64bit
assign   M_AXI_awsize[2:0]      = 3'b011; //3'b000为1字节、b001为2字节、b010为4字节
//'01' for increase,'10' opposite
assign   M_AXI_awburst[1:0]     = 2'b01;//地址递增型
assign   M_AXI_awlock           = 1'b0;
assign   M_AXI_awcache[3:0]     = 4'b0010;
assign   M_AXI_awprot[2:0]      = 3'b000;
assign   M_AXI_awqos[3:0]       = 4'b0000;
assign   M_AXI_awvalid          = reg_awvalid;

assign   M_AXI_wdata[63:0]      = WR_FIFO_data[63:0];
assign   M_AXI_wstrb[7:0]       = 8'hFF;
assign   M_AXI_wlast            = reg_w_last;     //(reg_w_len[7:0] == 8'd0)?'b1:'b0;
assign   M_AXI_wvalid           = reg_wvalid;     //data handshaking

assign   M_AXI_bready           = M_AXI_bvalid;   //lead plane accept ack
//axi state machine idle
assign   WR_ready               = (wr_state == S_WR_IDLE)?'b1:'b0;

//axi write process state machine
always @(posedge ACLK or negedge ARESETN)
  if(!ARESETN)
   begin 
    wr_state         
  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
FPGA(现场可编程门阵列)是一种灵活可编程的硬件平台,可以用于实现各种不同的电路功能。而AXI(Advanced eXtensible Interface)是一种高性能、低功耗的总线接口协议,用于连接FPGA与外部设备,如DDR3(双倍数据速率3代)内存。 要通过AXI读取DDR3内存数据,首先需要在FPGA上实例化AXI接口DDR3控制器模块。AXI接口模块负责与外部设备通信,而DDR3控制器模块则负责管理DDR3内存存取操作。 在设计中,需要按照AXI协议规范进行接口的连接和配置。AXI协议定义了读写操作的时序和数据传输约束。通过连接AXI接口DDR3控制器,FPGA可以通过AXI总线发送读取指令到DDR3内存,然后读取数据返回。 具体而言,通过AXI读取DDR3的操作步骤如下: 1. 配置AXI接口DDR3控制器模块,并确保其正确连接。 2. 在FPGA中编写相应的代码,按照AXI协议要求构建读取指令。 3. 将读取指令通过AXI接口发送到DDR3控制器模块。 4. DDR3控制器模块接收到读取指令后,根据指令的地址信息,从DDR3内存中读取相应数据。 5. 读取的数据通过AXI接口返回给FPGA,供后续处理使用。 需要注意的是,AXI与DDR3之间的通信速度和性能受到FPGA资源、时钟频率、数据宽度等因素的影响。因此,在设计中需要根据实际情况进行综合考虑,以保证数据的准确读取和传输。同时,还需要确保AXI接口DDR3控制器模块接口匹配和正确配置,以确保数据的正确传输和存取。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值