FPGA教程系列-Vivado AXI4-Full接口

FPGA教程系列-Vivado AXI4-Full接口

换换脑子,回过头来再看看AXI-Full协议,概念就不在唠叨了,反正就是AXI有三种,这个是最全乎的。

多出来一个总线的概念:

一般情况下,AXI4-Full总线也被直接简称为AXI4总线。AXI4-Full、AXI4-Lite都是内存映射型总线(需要地址),其是多主多从的拓扑结构,可通过Interconnect(AXI4交换设备)来进行互联。具体到XILINX的AXI4应用,一般使用这两个IP来进行多主多从的AXI接口互联:AXI Interconnect(一般使用这个)、AXI SmartConnect。 拓扑结构图如下:

通道与AXI-Lite一致,其实有个事务的概念比较模糊,所以学习下,为什么读,写都叫做事务。

传输事务

传输事务(Transaction)是指一次完整的、不可分割的读写操作过程。

在 AXI 协议中,仅仅发送一个地址,或者仅仅发送一个数据,都不能算作一个事务。事务是这些步骤的组合。

"Transaction"这个词最初大量用于商业数据库领域(比如银行转账),引入到电子工程和总线协议中非常贴切,原因如下:

A. 强调"完整性" (Completeness)

在商业中,一手交钱一手交货才叫一个 Transaction。如果你给了钱(发送了写数据),但对方没给你收据(没有写响应),这笔交易就不算完成。

在 AXI 中,使用"事务"这个词是为了强调:地址、数据、响应虽然是在不同的通道(Channel)上独立传输的,但它们在逻辑上是一个整体。 缺少任何一个环节,这个操作就是失败的。

B. 强调"解耦"与"逻辑关联"

早期的简单总线(如 SPI 或简单的 SRAM 接口),地址线和数据线是绑定在一起的,发地址的同时必须发数据。

而在 AXI 这种高级协议中,​通道是独立的

  • 可以先发地址,过一会再发数据。
  • 可以连续发 10 个写地址(10 个写事务的开头),然后再慢慢发这 10 个事务的数据。
  • 为什么不会乱? 因为这些分散在不同时间、不同通道上的动作,都属于特定的"事务"。系统通过 ID(Transaction ID)把它们关联起来。

C. 区分"一次操作"与"一次传输" (Burst vs Beat)

  • Beat (拍/传输): 时钟跳一下,传送一个数据(例如 32-bit)。
  • Burst (突发): 一次"事务"可以包含很多个"Beat"。比如我发一个地址,要求读 1KB 的数据,这可能需要传送 256 次数据(Beat)。
  • Transaction (事务): = 1 个地址请求 + N 次数据传输 (Burst) + 1 次响应

什么是突发?

再说个题外话,看到突发,总是不太理解,为什么要用这个词,再理解一下

  1. 什么是突发(Burst)?用一句话概括: "突发"就是"给一个首地址,连续传一堆数据"。

在没有突发模式(Single mode)的旧式总线中,传输数据是这样的:

  1. 发送地址 A -> 传输数据 D1
  2. 发送地址 A+1 -> 传输数据 D2
  3. 发送地址 A+2 -> 传输数据 D3
    ...
    (发 1 个数据就要喊 1 次地址,非常啰嗦)

而在 AXI 等现代总线的突发模式(Burst mode) 中,传输是这样的:

  1. 发送首地址 A,并告诉对方:"我要从这里开始,连续拿 4 个数据"。
  2. 传输数据 D1
  3. 传输数据 D2
  4. 传输数据 D3
  5. 传输数据 D4
    (只喊 1 次地址,后面数据就像连珠炮一样发过来,不需要再给地址了)

在 AXI 协议中,Slave(从机)会自动计算下一个地址(比如传完地址 0x00,它知道下一个是 0x04,再下一个是 0x08,以此类推),直到传完指定数量的数据。

基本解释清楚了,就是一个连续的数据的传输,至于为什么叫突发,为了形容数据传输的形态速度。类似的比喻是机关枪的连射模式。一顿突突突,对面就挂一大片。

说到突发了,下面看下时序,可以理解为这次机关枪发了4发子弹写入。

读也一样,而且是在握手成功后。不懂握手的话,再去练习stream模式吧,Full不适合你。

突发长度与宽度(Length & Size)这部分定义了"一梭子子弹"有多少发,以及每一发有多大。

AxLEN (Length): 协议为了省资源,用 0 表示 1 次传输。

  • 如果 ARLEN = 0,代表突发长度为 1。
  • 如果 ARLEN = 15,代表突发长度为 16。
  • 公式: 实际传输次数 = AxLEN + 1

AxSIZE (Size): 用 2 的幂次方表示数据宽度。

  • 000 = 202^020 = 1 字节 (8-bit)
  • 010 = 222^222 = 4 字节 (32-bit)
  • 011 = 232^323 = 8 字节 (64-bit)

三种突发类型(Burst Type)

A. FIXED (固定模式):地址行为: 地址始终不变 。例如:首地址是 0x100​,突发 4 次。地址序列:0x100​ -> 0x100​ -> 0x100​ -> 0x100

B. INCR (Increment - 递增模式):地址行为: 地址线性增加 。增加的步长等于数据宽度(Size)。例如:首地址 0x100​,突发 4 次,每次 4 字节。地址序列:0x100​ -> 0x104​ -> 0x108​ -> 0x10C

C. WRAP (回环/回卷模式):地址行为: 地址线性增加,但一旦到了 "边界" ,就会回跳(Wrap) 到低地址,形成一个循环。限制: 长度只能是 2, 4, 8, 16(必须是 2 的幂)。

读取与写入事务

这个看图说话,对应了5个通道。

写响应通道 (Write Response Channel) 上可能的响应值包括:

  • OKAY (0b00):正常访问成功。表示已成功完成正常访问
  • EXOKAY (0b01):专属访问成功。
  • SLVERR (0b10):从设备错误。已成功访问从设备,但从设备希望向发端主设备返回错误条件(例如,数据读取无效)。
  • DECERR (0b11):解码器错误。通常由互连组件生成,用于指示传输事务地址处没有任何从设备

信号

就看几个常用的信号即可:

全局信号(不属于任何通道):

  • ACLK: 全局时钟线(所有信号都在上升沿采样)。
  • ARESETn : 全局复位线(低电平有效 ,所以带个 n)。

写地址通道 (Write Address Channel) - 前缀 AW

  • AWADDR: 写地址(你要写到哪里)。
  • AWLEN: 突发长度(Burst Length)。告诉 Slave:"我要连着写多少个数据"。(实际传输次数 = AWLEN + 1)。
  • AWSIZE: 突发大小。每一个数据有多宽(1字节?4字节?)。
  • AWBURST: 突发类型(固定地址写、递增地址写等)。
  • AWID: 事务 ID(给这个订单贴个号,用于乱序处理)。
  • AWVALID / AWREADY : 握手信号(Master 说地址有效,Slave 说我准备好收地址了)。

写数据通道 (Write Data Channel) - 前缀 W

  • WDATA: 写数据(真正的货物)。
  • WSTRB: 写选通(Write Strobe)。像个掩码,比如 32位数据中,我只想改写其中某 8位,就靠它标记。
  • WLAST : 最后一个数据标记。告诉 Slave:"这是本次突发的最后一包数据,发完这包就结束了"。
  • WVALID / WREADY : 握手信号

写响应通道 (Write Response Channel) - 前缀 B

这个通道负责 "签收回执" 。注意,这里的前缀是 B(代表 Back 或 Buffer)。

  • BRESP: 写响应状态。告诉 Master:"写成功了 (OKAY)"还是"写失败了 (ERROR)"。
  • BID : 响应 ID。必须和 AWID 对应,证明是哪笔订单的回执。
  • BVALID / BREADY : 握手信号

读地址通道 (Read Address Channel) - 前缀 AR

  • ARADDR: 读地址。
  • ARLEN: 读突发长度(我要连着读多少个)。
  • ARSIZE: 读数据宽度。
  • ARBURST: 读突发类型。
  • ARID: 读事务 ID。
  • ARVALID / ARREADY : 握手信号

读数据通道 (Read Data Channel) - 前缀 R

  • RDATA: 读回来的数据。
  • RRESP: 读响应状态(数据是否读取成功)。注意:读操作的状态是跟数据一起回来的,不像写操作有单独的响应通道。
  • RLAST : 最后一个数据标记。Slave 告诉 Master:"这是你要的最后一个数了"。
  • RID : 读 ID。对应 ARID
  • RVALID / RREADY : 握手信号

4K边界

AXI4协议规定主机上寄存器块的最小分块单元为4K Byte,每个从机的开始映射地址都是4KB的边界。这也影响了AXI4的一个读写规则,那就是一个burst传输不能跨越4KB的界限,否则就会引入将数据错误写入其他从机的风险。注意这个​4KB的界限指的是MASTER的地址界限​,例如一个burst中不能越过0xXXXX_X000的地址位。

举个例子:数据位宽m_axi_wdata=128bit,突发长度为100。可以计算出突发长度的字节数量:128÷8×100 =1600。

  • 第1次:突发开始的地址是0,结束地址(最后一个字节的地址)是1599。
  • 第2次:突发开始的地址是1600,结束地址(最后一个字节的地址)是3199。
  • 第3次:突发开始的地址是3200,结束地址(最后一个字节的地址)是4799。这就有问题了,因为地址超过了4096(即4k边界)

协议就看到这里,具体用的时候再细说吧,主打一个了解。

相关推荐
云雾J视界1 天前
超越Proteus:AI时代驱动电路仿真的新范式——以LTspice双脉冲测试为例
proteus·仿真·ltspice·驱动电路·ai时代·闭环验证
Wishell20151 天前
FPGA教程系列-Vivado AXI4-Lite master 测试
仿真
Wishell20152 天前
FPGA教程系列-Vivado AXI4-Lite slave 测试
仿真
Wishell20153 天前
FPGA教程系列-Vivado AXI4-Lite接口
仿真
民乐团扒谱机6 天前
【微实验】仿AU音频编辑器开发实践:从零构建音频可视化工具
算法·c#·仿真·audio·fft·频谱
Wishell20156 天前
FPGA教程系列-Vivado AXI4-Stream Data FIFO核解读测试
仿真
Wishell20159 天前
FPGA教程系列-Vivado AXI4-Stream接口解读
仿真
民乐团扒谱机10 天前
十字路口交通信号灯控制器设计(Multisim 电路 + Vivado 仿真)
单片机·fpga开发·verilog·状态机·仿真·时序逻辑·multism
Wishell201510 天前
FPGA教程系列-Vivado AXI4-Stream自定义IP核
仿真