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
时序流程是这样的:
- 主设备拉高 AWVALID,从设备拉高 AWREADY,地址握手完成
- 主设备开始发数据,每拍一个 WDATA,最后一拍 WLAST 拉高
- 从设备收完所有数据后,拉高 BVALID,返回 BRESP
- 主设备拉高 BREADY,响应握手完成
这里有个细节:写数据和写地址可以同时进行。主设备不需要等地址握手完再发数据。AXI 的通道之间是独立的,这也是它高性能的原因之一。
3.5 实战中的避坑指南
我做了这么多年 AXI 总线,总结几个常见问题:
- 地址对齐问题:AXI 要求地址必须对齐到突发大小。比如 AWSIZE=3(8字节),地址必须是 8 的倍数。我曾经因为地址没对齐,仿真没问题,上板子就挂。
- WLAST 漏拉:写数据的最后一拍必须拉高 WLAST,否则从设备不知道传输结束,会一直等。
- RREADY 过早拉低:读数据时,主设备如果提前拉低 RREADY,从设备会停止发送,导致数据丢失。
我的建议:刚开始做 AXI 设计时,先画一个状态机。把地址发送、数据收发、响应处理分成独立的状态。这样逻辑清晰,不容易出错。
3.6 知识体系结构图
下面这张图,是我自己总结的 AXI4-Full 三个通道的关系。你看一眼就能明白整体框架:
你看,五个通道各司其职。读操作只用两个通道(AR 和 R),写操作用三个通道(AW、W、B)。通道之间完全独立,可以流水线操作。这就是 AXI 能跑到几百兆时钟频率的原因。
好了,关于 AXI4-Full 的三个通道,咱们就聊到这儿。记住一句话:地址是命令,数据是内容,响应是结果。把这三点搞明白,AXI 总线你就掌握了一半。
可可精品资料库