2、AXI通道详解:读地址通道、读数据通道、写地址通道、写数据通道、写响应通道
各位同学,今天我们来聊聊AXI总线最核心的部分——五个独立的通道。
我刚接触AXI的时候,第一反应是:怎么这么多通道?后来做项目多了才明白,这恰恰是AXI高性能的秘诀。说白了,就是让读和写各走各的路,互不干扰。
2.1 五个通道概览
AXI协议把一次传输拆成了五个独立的通道。我习惯把它们分成两组:
- 读操作组:读地址通道(AR) + 读数据通道(R)
- 写操作组:写地址通道(AW) + 写数据通道(W) + 写响应通道(B)
你想想看,读和写完全解耦。这意味着你可以同时发一个读请求和一个写请求,总线能并行处理。嗯,这就是AXI比AHB快的原因之一。
核心要点:五个通道都是独立的。每个通道都有自己的VALID/READY握手信号,可以独立控制流控。
2.2 读地址通道(AR)
读地址通道,顾名思义,就是主设备告诉从设备:我要读哪个地址的数据。
这个通道的信号不多,但每个都很关键:
| 信号 | 方向 | 说明 |
|---|---|---|
| ARADDR | 主→从 | 读地址,32位或64位 |
| ARLEN | 主→从 | 突发长度,0表示1次传输 |
| ARSIZE | 主→从 | 每次传输的字节数 |
| ARBURST | 主→从 | 突发类型:FIXED/INCR/WRAP |
| ARVALID | 主→从 | 地址有效标志 |
| ARREADY | 从→主 | 从设备准备好接收地址 |
个人经验:我在调试一个DMA控制器时,发现读地址总是发不出去。查了半天,原来是ARVALID和ARREADY的握手时序没处理好。记住,VALID必须先于READY拉高,或者同时拉高,但不能等READY拉高后才拉VALID。
2.3 读数据通道(R)
从设备收到读地址后,就开始准备数据,然后通过读数据通道返回。
这个通道的信号包括:
- RDATA:读回来的数据,宽度可以是8/16/32/64/128/256/512/1024位
- RRESP:读响应状态,OKAY=00,EXOKAY=01,SLVERR=10,DECERR=11
- RLAST:最后一次传输的标志,突发传输的最后一次会拉高
- RVALID:数据有效标志
- RREADY:主设备准备好接收数据
这里有个细节要注意:读数据通道的RLAST信号。我见过不少新手忘记检查这个信号,导致不知道什么时候读完了。
避坑指南:我曾经在一个视频处理项目中,因为没处理好RREADY的反压,导致从设备的数据堆积,最终溢出。记住,如果主设备来不及处理数据,一定要拉低RREADY,让从设备等一等。
2.4 写地址通道(AW)
写地址通道和读地址通道非常相似,只是方向变成了写。
主要信号:
- AWADDR:写地址
- AWLEN:写突发长度
- AWSIZE:写数据宽度
- AWBURST:写突发类型
- AWVALID / AWREADY:握手信号
嗯,这里要提一下,写地址通道和写数据通道是独立的。这意味着你可以先发地址,再发数据,也可以同时发。我习惯的做法是:地址和数据一起发,这样从设备可以提前知道要写多少数据。
2.5 写数据通道(W)
写数据通道负责传输实际要写入的数据。它有几个特殊的地方:
| 信号 | 说明 |
|---|---|
| WDATA | 写数据 |
| WSTRB | 字节选通信号,每1位对应1个字节是否有效 |
| WLAST | 最后一次写数据标志 |
| WVALID | 写数据有效 |
| WREADY | 从设备准备好接收数据 |
WSTRB这个信号特别重要。你想想看,如果你只想写一个32位数据中的低8位,怎么办?WSTRB就是干这个的。每一位对应一个字节,1表示该字节有效。
举个例子:WDATA=0x12345678,WSTRB=4'b0011,那么实际写入的是0x____5678,高16位被屏蔽了。
2.6 写响应通道(B)
写响应通道是五个通道中最简单的一个,但也是很多人容易忽略的一个。
当从设备完成一次写突发传输后,会通过写响应通道返回一个状态:
- BRESP:写响应状态,和RRESP一样,OKAY/EXOKAY/SLVERR/DECERR
- BVALID:响应有效
- BREADY:主设备准备好接收响应
注意,写响应是在整个突发传输完成后才返回的,不是每写一次数据就返回一次。也就是说,如果你发了4次写数据(AWLEN=3),那么只会收到1次写响应。
我的建议:写响应一定要检查!我在一个项目里遇到过从设备返回SLVERR的情况,因为地址越界了。如果不检查BRESP,你根本不知道数据有没有写成功。
2.7 通道间的依赖关系
五个通道虽然独立,但也不是完全没关系的。我总结了几条依赖规则:
- 读操作:先有读地址,后有读数据。读数据必须在读地址握手之后才能出现。
- 写操作:写地址和写数据可以乱序,但写响应必须在所有写数据完成后才能返回。
- 跨操作:读和写之间没有任何依赖,可以完全并行。
说白了,就是读操作有顺序要求,写操作内部也有顺序要求,但读和写之间是自由的。
2.8 实战中的注意事项
最后,分享几个我在项目中踩过的坑:
坑1:我曾经在设计AXI互联时,把读地址通道和写地址通道的地址线复用了。结果读和写同时发生时,地址冲突了。记住,五个通道的地址线必须独立。
坑2:写数据通道的WLAST信号一定要在最后一次数据时拉高。我见过一个设计,WLAST一直拉低,从设备永远不知道什么时候写完。
坑3:读数据通道的RREADY不能一直拉高。如果主设备处理不过来,一定要反压。否则数据会丢失。
好了,五个通道的内容就讲到这里。记住,理解每个通道的独立性和握手机制,是掌握AXI协议的第一步。下一节我们会深入讲握手协议,到时候再细聊VALID和READY的各种玩法。
可可精品资料库