3. AXI4-Full接口详解:地址通道、数据通道、响应通道的信号定义与时序

说实话,AXI4-Full 这个协议,我刚接触的时候也觉得头大。五个通道,几十根信号线,看着就吓人。但干 FPGA 这么多年下来,我慢慢发现,其实核心就三个东西:地址怎么发、数据怎么传、结果怎么回。今天咱们就把这三个通道掰开揉碎了讲清楚。

3.1 地址通道:指挥交通的信号灯

地址通道,说白了就是告诉从设备:「我要读写哪个位置」。它分两套:读地址通道(AR)和写地址通道(AW)。

我个人习惯把地址通道想象成快递单。你写清楚地址,快递员才能送到。AXI 也一样,主设备把地址、突发长度、突发大小这些信息打包,通过地址通道发出去。

3.1.1 关键信号定义

信号 方向 说明
ARADDR / AWADDR 主→从 读写首地址,32位或64位
ARLEN / AWLEN 主→从 突发长度,0表示1次传输,1表示2次,以此类推
ARSIZE / AWSIZE 主→从 每次传输的字节数,3'b011表示8字节
ARBURST / AWBURST 主→从 突发类型:FIXED、INCR、WRAP
ARVALID / AWVALID 主→从 地址有效标志
ARREADY / AWREADY 从→主 从设备准备好接收地址

这里有个坑,我踩过。ARLEN 的值是「传输次数减1」。比如你想做 16 次突发,ARLEN 要写 15。刚开始我老搞反,仿真跑出来数据对不上,查了半天才发现是这里的问题。

3.1.2 地址通道握手时序

AXI 的握手用的是 VALID-READY 机制。主设备拉高 VALID,从设备拉高 READY,一拍之内完成握手。谁等谁都可以,但有个原则:VALID 不能依赖 READY。

什么意思?就是说主设备一旦拉高 VALID,就不能再等从设备了。哪怕从设备还没准备好,主设备也得保持 VALID 直到握手成功。这个设计是为了防止死锁。

核心要点:地址通道的握手一旦完成,主设备就可以立即发送下一个地址,不需要等数据传输完。这叫「乱序传输」,是 AXI 高性能的关键。

3.2 数据通道:高速公路上的车流

数据通道分读数据(R)和写数据(W)两条。读数据是从设备往主设备传,写数据是主设备往从设备传。

你想想看,地址通道就像发车票,数据通道才是真正的车流。数据通道的宽度可以是 8、16、32、64、128 甚至 1024 位。我做过一个项目,数据位宽 512 位,一个时钟周期能传 64 个字节,那吞吐量,啧啧。

3.2.1 写数据通道信号

信号 方向 说明
WDATA 主→从 写数据总线
WSTRB 主→从 字节选通,哪几位有效就置1
WLAST 主→从 最后一次传输的标志
WVALID 主→从 写数据有效
WREADY 从→主 从设备准备好接收数据

WSTRB 这个信号,很多人容易忽略。比如你只写一个 32 位数据的低 8 位,WSTRB 就要写成 4'b0001。我曾经在调试 DDR 控制器时,因为 WSTRB 没处理好,导致写进去的数据全是乱的。嗯,这里要注意。

3.2.2 读数据通道信号

信号 方向 说明
RDATA 从→主 读数据总线
RRESP 从→主 读响应状态
RLAST 从→主 最后一次传输的标志
RVALID 从→主 读数据有效
RREADY 主→从 主设备准备好接收数据

读数据通道的 RLAST 信号特别重要。它告诉主设备:「这是最后一个数据了,别再等了」。如果没有 RLAST,主设备不知道什么时候该停,会一直等下去。

3.3 响应通道:交易的收据

写响应通道(B)是 AXI4-Full 独有的。AXI4-Lite 也有,但 AXI4-Stream 没有。它用来告诉主设备:「你刚才写的那一笔,成功了还是失败了」。

3.3.1 响应信号定义

信号 方向 说明
BRESP 从→主 写响应状态:OKAY、EXOKAY、SLVERR、DECERR
BVALID 从→主 响应有效
BREADY 主→从 主设备准备好接收响应

BRESP 的值含义:

  • 00 (OKAY):正常完成
  • 01 (EXOKAY):独占访问成功(这个用得少)
  • 10 (SLVERR):从设备错误,比如地址越界
  • 11 (DECERR):地址译码错误,没有设备响应这个地址

注意:读数据通道也有 RRESP 信号,作用和 BRESP 一样。但读响应是和数据一起回来的,写响应是单独一个通道。为什么?因为写数据可能分多次传,响应只能在所有数据传完后统一给。

3.4 完整传输时序示例

光讲理论不行,咱们看个实际例子。下面是一个 4 次突发的写传输时序:

// 写地址通道
AWADDR  = 0x1000
AWLEN   = 3    // 4次传输
AWSIZE  = 2    // 4字节每次
AWBURST = 1    // INCR模式

// 写数据通道
WDATA[0] = 0xAABBCCDD
WDATA[1] = 0x11223344
WDATA[2] = 0x55667788
WDATA[3] = 0x99AABBCC
WLAST    = 1    // 最后一次拉高

// 写响应通道
BRESP    = 0    // OKAY

时序流程是这样的:

  1. 主设备拉高 AWVALID,从设备拉高 AWREADY,地址握手完成
  2. 主设备开始发数据,每拍一个 WDATA,最后一拍 WLAST 拉高
  3. 从设备收完所有数据后,拉高 BVALID,返回 BRESP
  4. 主设备拉高 BREADY,响应握手完成

这里有个细节:写数据和写地址可以同时进行。主设备不需要等地址握手完再发数据。AXI 的通道之间是独立的,这也是它高性能的原因之一。

3.5 实战中的避坑指南

我做了这么多年 AXI 总线,总结几个常见问题:

  • 地址对齐问题:AXI 要求地址必须对齐到突发大小。比如 AWSIZE=3(8字节),地址必须是 8 的倍数。我曾经因为地址没对齐,仿真没问题,上板子就挂。
  • WLAST 漏拉:写数据的最后一拍必须拉高 WLAST,否则从设备不知道传输结束,会一直等。
  • RREADY 过早拉低:读数据时,主设备如果提前拉低 RREADY,从设备会停止发送,导致数据丢失。

我的建议:刚开始做 AXI 设计时,先画一个状态机。把地址发送、数据收发、响应处理分成独立的状态。这样逻辑清晰,不容易出错。

3.6 知识体系结构图

下面这张图,是我自己总结的 AXI4-Full 三个通道的关系。你看一眼就能明白整体框架:

主设备 从设备 读地址通道 (AR) 读数据通道 (R) 写地址通道 (AW) 写数据通道 (W) 写响应通道 (B) 图例: 地址 读数据 写地址 写数据 写响应

你看,五个通道各司其职。读操作只用两个通道(AR 和 R),写操作用三个通道(AW、W、B)。通道之间完全独立,可以流水线操作。这就是 AXI 能跑到几百兆时钟频率的原因。

好了,关于 AXI4-Full 的三个通道,咱们就聊到这儿。记住一句话:地址是命令,数据是内容,响应是结果。把这三点搞明白,AXI 总线你就掌握了一半。

可可精品资料库