FPGA_AXI4总线

本文介绍了AXI4总线的基础知识,包括AXI4、AXI4-Lite及AXI4-Stream的不同应用场景,详细解释了它们的工作原理与优势。重点分析了AXI4-Lite和AXI4-Stream在NetFPGA10G中的应用,以及它们如何分别处理控制层面和数据层面的通信。

    (一)AXI总线是什么?

    AXI是ARM 1996年提出的微控制器总线家族AMBA中的一部分。AXI的第一个版本出现在AMBA3.0,发布于2003年。当前的最新的版本发布于2010年。

    AXI4:主要面向高性能地址映射通信的需求;

    AXI4-Lite:是一个简单地吞吐量地址映射性通信总线;

    AXI4-Stream:面向高速流数据传输;

    AXI4总线分为主、从两端,两者间可以连续的进行通信。

    ISE从12.3版本,Virtex6,Spartan6芯片开始对AXI4总线提供支持,并且随着Xilinx与ARM的合作面逐渐展开而得到大力推广。

    (二)AXI4的优势

    1.通过统一的AXI接口,开发者为开发ip core只需要学习一种协议即可;

    2.AXI4是面向地址映射的接口,允许最大256轮的数据突发传输;

    3.AXI4-Lite是一个轻量级的地址映射单次传输接口,占用很少的逻辑单元;

    4.AXI4-Stream去掉了地址项,允许无限制的数据突发传输规模;

   

    NetFPGA10G采用了AXI4系列总线架构,而Xilinx从Virtex6,Spartan6才开始支持AXI4。因此斯坦福的开发人员对在Virtex6上编译出的带有AXI4总线的ngc文件进行了修改加载到NetFPGA10G的ipcore中,使之骗过ISE,继续网表映射流程。

    NetFPGA10G主要使用了其中的轻量级AXI4-lite(后文简写为axi)以及AXI4-stream(后文简写为axis)两者。前者用于CPU与ip core之间的通信;后者用于各ip core之间进行高速数据传输。如果将整个构架分为控制层面与数据层面,则axi主要负责控制层面,axis主要负责数据层面。

     本文后续内容主要对轻量级axi以及axis总线进行介绍,如需AXI4整体总线通信模式,请参看ARM AXI4 Specification,  Xilinx UG761 AXI Reference Guide.

    (三)AXI4的工作模式

    1.握手机制

     AXI4所采用的是一种READY,VALID握手通信机制,即主从模块进行数据通信前,新根据操作对各所用到的数据、地址通道进行握手。主要操作包括传输发送者A等到传输接受者B的READY信号后,A将数据与VALID信号同时发送给B。如下图所示:

    2.axi的工作模式:

    axi总线分为五个通道:

  • 读地址通道,包含ARVALID, ARADDR, ARREADY信号;
  • 写地址通道,包含AWVALID,AWADDR, AWREADY信号;
  • 读数据通道,包含RVALID, RDATA, RREADY, RRESP信号;
  • 写数据通道,包含WVALID, WDATA,WSTRB, WREADY信号;
  • 写应答通道,包含BVALID, BRESP, BREADY信号;
  • 系统通道,包含:ACLK,ARESETN信号;

    其中ACLK为axi总线时钟,ARESETN是axi总线复位信号,低电平有效;读写数据与读写地址类信号宽度都为32bit;READY与VALID是对应的通道握手信号;WSTRB信号为1的bit对应WDATA有效数据字节,WSTRB宽度是32bit/8=4bit;BRESP与RRESP分别为写回应信号,读回应信号,宽度都为2bit,‘h0代表成功,其他为错误。

    A.读操作:

    顺序为主与从进行读地址通道握手并传输地址内容,然后在读数据通道握手并传输所读内容以及读取操作的回应,时钟上升沿有效。如图所示:

    B.写操作:

    顺序为主与从进行写地址通道握手并传输地址内容,然后在写数据通道握手并传输所读内容,最后再写回应通道握手,并传输写回应数据,时钟上升沿有效。如图所示:

    3.axis工作模式

    axis分为:

  • tready信号:从告诉主做好传输准备;
  • tvalid信号:主告诉从数据传输有效;
  • tlast信号:主告诉从该次传输为突发传输结尾;
  • tdata信号:数据,可选宽度32,64,128,256bit
  • tstrb信号:为1的bit为对应tdata有效字节,宽度为tdata/8
  • tuser信号  :用户定义信号,宽度为128bit
  • aclk信号:总线时钟,上升沿有效;
  • aresetn信号:总线复位,低电平有效;

    通信时序如图所示:

 

    axi与axis是AXI4总线中通信复杂度较低的两条总线,最大开发难度存在于axi的控制平面向axis的数据平面下发参数时,由于axi与axis时钟频率不同而产生的跨时钟域数据传输问题。

虽然给定引用未直接提及 FPGA 使用 AXI_HP 接口读写 DDR3 的方法和原理,但可以结合相关信息进行一定的推导。 ### AXI 协议基础 AXI 协议是一种高性能、高带宽、低延迟的片内总线AXI4 协议支持突发传输,适用于处理器访问存储器等需要指定地址的高速数据传输场景,这为 FPGA 通过 AXI_HP 接口读写 DDR3 提供了基础的协议支撑。AXI_HP 接口AXI 协议下的高速接口,能够满足 DDR3 高速读写的需求 [^1][^3]。 ### 原理 - **高速传输**:AXI_HP 接口作为高速接口,与 DDR3 的高速读写特性相匹配。它支持突发传输,就像 AXI4 协议一样,可以在一次传输中连续传输多个数据,减少了传输的开销,提高了数据传输效率,满足 DDR3 大容量数据快速读写的要求。 - **缓存机制**:在 AXI 协议中有缓存属性的定义,如 M_AXI_AWCACHE 信号用于定义写传输的缓存属性,决定数据在写入时是否经过缓存以及缓存的管理策略。在 FPGA 通过 AXI_HP 接口读写 DDR3 时,也会涉及到缓存机制,合理配置缓存属性可以优化读写性能 [^4]。 ### 方法 - **接口选择与配置**:在 FPGA 设计中,需要选择 AXI_HP 接口。由于 Xilinx 的 mig ddr Ip 核集成了 AXI4 接口,后续可以兼容 Xilinx 的其他 FPGA,可复用性更强。在配置时,要开启 AXI 接口,若使用 AXI_HP 接口则要进行相应的参数设置。例如,在选择可以兼容的芯片时,要确保所选芯片支持 AXI_HP 接口与 DDR3 的连接 [^1][^2]。 - **封装与驱动**:可以将 AXI_HP 接口封装成更易于使用的接口形式,如 fifo 接口。不同的接口选择会影响 FPGA 的驱动程序,使用 AXI_HP 接口时需要编写相应的驱动程序来实现对 DDR3 的读写操作 [^2]。 ### 代码示例(伪代码) ```verilog // 定义 AXI_HP 接口信号 module axi_hp_ddr3 ( // 时钟和复位信号 input wire clk, input wire rst_n, // AXI_HP 接口信号 // 写地址通道 output reg [31:0] M_AXI_AWADDR, output reg [7:0] M_AXI_AWLEN, output reg [2:0] M_AXI_AWSIZE, output reg [1:0] M_AXI_AWBURST, output reg M_AXI_AWVALID, input wire M_AXI_AWREADY, // 写数据通道 output reg [63:0] M_AXI_WDATA, output reg [7:0] M_AXI_WSTRB, output reg M_AXI_WLAST, output reg M_AXI_WVALID, input wire M_AXI_WREADY, // 写响应通道 input wire [1:0] M_AXI_BRESP, input wire M_AXI_BVALID, output reg M_AXI_BREADY, // 读地址通道 output reg [31:0] M_AXI_ARADDR, output reg [7:0] M_AXI_ARLEN, output reg [2:0] M_AXI_ARSIZE, output reg [1:0] M_AXI_ARBURST, output reg M_AXI_ARVALID, input wire M_AXI_ARREADY, // 读数据通道 input wire [63:0] M_AXI_RDATA, input wire [1:0] M_AXI_RRESP, input wire M_AXI_RLAST, input wire M_AXI_RVALID, output reg M_AXI_RREADY ); // 状态机定义 parameter IDLE = 2'b00; parameter WRITE = 2'b01; parameter READ = 2'b10; reg [1:0] state; always @(posedge clk or negedge rst_n) begin if (!rst_n) begin state <= IDLE; // 初始化信号 M_AXI_AWADDR <= 32'b0; M_AXI_AWLEN <= 8'b0; M_AXI_AWSIZE <= 3'b0; M_AXI_AWBURST <= 2'b0; M_AXI_AWVALID <= 1'b0; M_AXI_WDATA <= 64'b0; M_AXI_WSTRB <= 8'b0; M_AXI_WLAST <= 1'b0; M_AXI_WVALID <= 1'b0; M_AXI_BREADY <= 1'b0; M_AXI_ARADDR <= 32'b0; M_AXI_ARLEN <= 8'b0; M_AXI_ARSIZE <= 3'b0; M_AXI_ARBURST <= 2'b0; M_AXI_ARVALID <= 1'b0; M_AXI_RREADY <= 1'b0; end else begin case (state) IDLE: begin // 可以根据条件切换到写或读状态 if (write_enable) begin state <= WRITE; // 设置写地址通道信号 M_AXI_AWADDR <= write_address; M_AXI_AWLEN <= write_length; M_AXI_AWSIZE <= write_size; M_AXI_AWBURST <= write_burst; M_AXI_AWVALID <= 1'b1; end else if (read_enable) begin state <= READ; // 设置读地址通道信号 M_AXI_ARADDR <= read_address; M_AXI_ARLEN <= read_length; M_AXI_ARSIZE <= read_size; M_AXI_ARBURST <= read_burst; M_AXI_ARVALID <= 1'b1; end end WRITE: begin if (M_AXI_AWREADY) begin M_AXI_AWVALID <= 1'b0; // 发送写数据 M_AXI_WDATA <= write_data; M_AXI_WSTRB <= 8'hFF; M_AXI_WLAST <= 1'b1; M_AXI_WVALID <= 1'b1; end if (M_AXI_WREADY && M_AXI_WVALID) begin M_AXI_WVALID <= 1'b0; M_AXI_BREADY <= 1'b1; if (M_AXI_BVALID) begin M_AXI_BREADY <= 1'b0; state <= IDLE; end end end READ: begin if (M_AXI_ARREADY) begin M_AXI_ARVALID <= 1'b0; M_AXI_RREADY <= 1'b1; end if (M_AXI_RVALID && M_AXI_RREADY) begin // 处理读数据 read_data <= M_AXI_RDATA; if (M_AXI_RLAST) begin M_AXI_RREADY <= 1'b0; state <= IDLE; end end end endcase end end endmodule ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值