2、AXI通道详解:读地址通道、读数据通道、写地址通道、写数据通道、写响应通道

各位同学,今天我们来聊聊AXI总线最核心的部分——五个独立的通道。

我刚接触AXI的时候,第一反应是:怎么这么多通道?后来做项目多了才明白,这恰恰是AXI高性能的秘诀。说白了,就是让读和写各走各的路,互不干扰。

2.1 五个通道概览

AXI协议把一次传输拆成了五个独立的通道。我习惯把它们分成两组:

  • 读操作组:读地址通道(AR) + 读数据通道(R)
  • 写操作组:写地址通道(AW) + 写数据通道(W) + 写响应通道(B)

你想想看,读和写完全解耦。这意味着你可以同时发一个读请求和一个写请求,总线能并行处理。嗯,这就是AXI比AHB快的原因之一。

核心要点:五个通道都是独立的。每个通道都有自己的VALID/READY握手信号,可以独立控制流控。

主设备 从设备 读地址通道 (AR) 读数据通道 (R) 写地址通道 (AW) 写数据通道 (W) 写响应通道 (B) 图例:绿色/蓝色=读通道 | 红色/紫色/橙色=写通道 | 箭头方向=数据流向

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 通道间的依赖关系

五个通道虽然独立,但也不是完全没关系的。我总结了几条依赖规则:

  1. 读操作:先有读地址,后有读数据。读数据必须在读地址握手之后才能出现。
  2. 写操作:写地址和写数据可以乱序,但写响应必须在所有写数据完成后才能返回。
  3. 跨操作:读和写之间没有任何依赖,可以完全并行。

说白了,就是读操作有顺序要求,写操作内部也有顺序要求,但读和写之间是自由的。

2.8 实战中的注意事项

最后,分享几个我在项目中踩过的坑:

坑1:我曾经在设计AXI互联时,把读地址通道和写地址通道的地址线复用了。结果读和写同时发生时,地址冲突了。记住,五个通道的地址线必须独立。

坑2:写数据通道的WLAST信号一定要在最后一次数据时拉高。我见过一个设计,WLAST一直拉低,从设备永远不知道什么时候写完。

坑3:读数据通道的RREADY不能一直拉高。如果主设备处理不过来,一定要反压。否则数据会丢失。

好了,五个通道的内容就讲到这里。记住,理解每个通道的独立性和握手机制,是掌握AXI协议的第一步。下一节我们会深入讲握手协议,到时候再细聊VALID和READY的各种玩法。


可可精品资料库