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

AXI总线最让我欣赏的地方,就是它把一次传输拆成了五个独立的通道。你想想看,这就像一条高速公路分了五个车道——读地址、读数据、写地址、写数据、写响应。每个车道各走各的,互不干扰。

我刚开始接触AXI时,总觉得五个通道太复杂。后来做项目多了才发现,这种设计恰恰是AXI高性能的秘诀。说白了,它让读和写可以同时进行,互不等待。

2.1 读地址通道(AR通道)

读地址通道,负责把读请求发给从设备。主设备告诉从设备:我要读哪个地址,读多少数据。

这个通道的信号不多,但每个都很关键:

信号 方向 说明
ARADDR 主→从 读地址,32位或64位
ARLEN 主→从 突发长度,一次传输多少笔数据
ARSIZE 主→从 每笔数据的大小(字节数)
ARBURST 主→从 突发类型:固定、递增、包裹
ARVALID 主→从 地址有效标志
ARREADY 从→主 从设备准备好接收地址

关键点:ARVALID和ARREADY构成握手信号。只有两者同时为高,地址才算成功发送。

我在项目中遇到过一个问题:主设备发了地址,但从设备还没准备好。这时候ARREADY拉低,主设备就得保持地址不变,直到握手成功。嗯,这里要注意,如果主设备在握手完成前就撤掉地址,那数据就丢了。

2.2 读数据通道(R通道)

从设备收到读地址后,就开始准备数据。读数据通道就是用来返回数据的。

这个通道的信号包括:

  • RDATA:读回来的数据,宽度和总线一致
  • RRESP:读响应状态,OKAY、EXOKAY、SLVERR、DECERR
  • RLAST:最后一笔数据的标志
  • RVALID:数据有效标志
  • RREADY:主设备准备好接收数据

读数据通道有个特点:数据必须按顺序返回。你发了地址A、B、C,返回的数据必须是A的数据、B的数据、C的数据,不能乱序。

我的经验:调试读通道时,先看RVALID和RREADY的握手。很多问题都是握手没完成,数据就丢了。我曾经花了一整天查一个bug,最后发现是RREADY拉早了,主设备还没准备好就收了数据。

2.3 写地址通道(AW通道)

写地址通道和读地址通道很像,只是方向变成了写。主设备告诉从设备:我要往哪个地址写数据。

信号基本和AR通道对应:

  • AWADDR:写地址
  • AWLEN:写突发长度
  • AWSIZE:每笔数据大小
  • AWBURST:突发类型
  • AWVALID:地址有效
  • AWREADY:从设备准备好

写地址通道和写数据通道是独立的。这意味着地址可以先发,数据后到。或者数据先到,地址后发。只要在从设备处理之前,两者都到位就行。

注意:虽然地址和数据可以乱序到达,但大多数从设备要求地址先到。我建议你设计时,让地址先于数据发送,这样兼容性最好。

2.4 写数据通道(W通道)

写数据通道负责传输实际要写的数据。它和读数据通道最大的区别是:写数据通道有写选通信号WSTRB。

WSTRB是干嘛用的?举个例子:你想写一个32位总线中的某个字节。如果没有WSTRB,你得先读回整个32位,修改那个字节,再写回去。有了WSTRB,你可以直接告诉从设备:我只写第2个字节,其他字节保持不变。

写数据通道的信号:

信号 说明
WDATA 写数据
WSTRB 写选通,每bit对应一个字节
WLAST 最后一笔数据
WVALID 数据有效
WREADY 从设备准备好接收数据

我个人习惯在写数据通道上多加一个FIFO做缓冲。为什么呢?因为写数据可能来自不同的处理单元,速度不一致。加个FIFO,能平滑数据流,避免卡顿。

2.5 写响应通道(B通道)

这是五个通道里最简单的一个。从设备写完数据后,通过B通道返回一个响应,告诉主设备:写操作完成了,结果如何。

信号只有两个:

  • BRESP:写响应状态
  • BVALID:响应有效
  • BREADY:主设备准备好接收响应

写响应通道有个重要规则:一次突发传输只返回一个响应。不管你的突发长度是4还是16,都只返回一个BRESP。

避坑指南:我曾经遇到一个从设备,每次写操作都返回OKAY,但数据根本没写进去。后来发现是地址对齐出了问题。所以,看到BRESP是OKAY,不代表数据一定写对了。你还要检查地址对齐、WSTRB是否正确。

2.6 五个通道的时序关系

五个通道不是同时工作的。它们有明确的依赖关系:

  1. 读操作:先发AR地址 → 等待R数据返回
  2. 写操作:先发AW地址和W数据(可同时) → 等待B响应

读和写可以完全重叠。也就是说,你可以在等读数据的同时,发起写操作。这就是AXI高性能的来源。

AXI五个通道的时序关系 CLK AR地址 R数据 AW地址 W数据 B响应 读操作流程 写地址先发 写数据后发 最后等响应 关键说明: • 读操作:AR地址 → R数据(顺序返回) • 写操作:AW地址 + W数据(可同时) → B响应 • 读和写可以完全重叠,互不阻塞

你看这个图,读操作和写操作是并行的。AR地址发出去后,不等数据回来,就可以发AW地址。这就是AXI能做到高吞吐的原因。

我的建议:设计AXI接口时,先把五个通道的握手逻辑写好。每个通道独立测试,确保VALID和READY的握手没问题。然后再把通道连起来。这样调试起来会轻松很多。

好了,五个通道就讲到这里。记住它们的职责:AR负责读地址,R负责读数据,AW负责写地址,W负责写数据,B负责写响应。每个通道独立工作,又相互配合。理解了这一点,AXI总线的基本框架你就掌握了。