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 五个通道的时序关系
五个通道不是同时工作的。它们有明确的依赖关系:
- 读操作:先发AR地址 → 等待R数据返回
- 写操作:先发AW地址和W数据(可同时) → 等待B响应
读和写可以完全重叠。也就是说,你可以在等读数据的同时,发起写操作。这就是AXI高性能的来源。
你看这个图,读操作和写操作是并行的。AR地址发出去后,不等数据回来,就可以发AW地址。这就是AXI能做到高吞吐的原因。
我的建议:设计AXI接口时,先把五个通道的握手逻辑写好。每个通道独立测试,确保VALID和READY的握手没问题。然后再把通道连起来。这样调试起来会轻松很多。
好了,五个通道就讲到这里。记住它们的职责:AR负责读地址,R负责读数据,AW负责写地址,W负责写数据,B负责写响应。每个通道独立工作,又相互配合。理解了这一点,AXI总线的基本框架你就掌握了。