1. AXI总线概述:AXI4、AXI4-Lite、AXI4-Stream协议的区别与选型
大家好,我是你们这趟总线之旅的向导。咱们第一节课,先聊聊AXI家族的三个兄弟——AXI4、AXI4-Lite和AXI4-Stream。
很多刚接触ARM架构的朋友,一看到这三个协议就头大。说实话,我当年也懵过。记得第一次做Zynq项目,想把一个自定义IP挂到PS端,结果选错了接口,仿真跑起来数据全乱套。后来才明白,选对协议比写好逻辑更重要。
这三个协议,说白了就是为不同场景设计的。你想想看,一个高速视频流和一个寄存器配置,能用同一个接口吗?显然不行。ARM把总线分成了三档,就是为了让设计者各取所需。
1.1 三兄弟的定位
先看一张总览图,把三者的关系理清楚。
我的经验:新手最容易犯的错误,就是用AXI4-Lite去搬运大量数据。Lite接口一次只能传一个数据,效率极低。我曾经见过一个项目,工程师用Lite接口传图像,结果带宽只有理论值的1%,整个系统卡死。记住,Lite只适合配寄存器,别让它干重活。
1.2 AXI4:全功能总线
AXI4是ARM AMBA家族里的老大哥。它支持内存映射,也就是说,每个传输都带着地址。你可以读写指定的内存位置,就像用指针操作数组一样自然。
它的核心能力是突发传输。什么叫突发?就是一次握手,连续传多个数据。比如你要从DDR里读1024个字节,用AXI4只需要发一次地址,后面数据就哗哗地流过来了。这在图像处理、网络包处理里特别有用。
AXI4还支持乱序传输。什么意思?多个事务可以同时发出,返回的顺序可以打乱。比如你发了读请求A、B、C,如果B的数据先准备好,那就先返回B。这能显著提高总线利用率。
关键特性:
- 独立的地址/数据通道(读地址、读数据、写地址、写数据、写响应)
- 支持1~256拍的突发传输
- 支持Outstanding事务(多个未完成事务同时进行)
- 支持原子操作(Exclusive Access和Locked Access)
- 数据总线宽度可配置(8/16/32/64/128/256/512/1024位)
1.3 AXI4-Lite:轻量级总线
AXI4-Lite是AXI4的简化版。它保留了内存映射和独立的地址/数据通道,但砍掉了突发传输。每次传输只能传一个数据,而且不支持乱序。
你可能会问:那它有什么用?
用处大了。在SoC里,有大量的控制寄存器、状态寄存器需要访问。这些寄存器通常只有32位宽,一次读写就够了。用AXI4-Lite实现起来简单,逻辑资源也少。我习惯把Lite接口用在配置通道上,比如配置DMA的描述符、设置中断使能、读取温度传感器等。
注意:AXI4-Lite的地址空间是4KB对齐的。每个从设备至少占用4KB地址空间。这是ARM的硬性规定,设计地址映射时一定要留够空间。我曾经因为没注意这个,把两个寄存器挤在同一个4KB窗口里,结果仿真怎么都跑不对。
1.4 AXI4-Stream:流式总线
AXI4-Stream是三个协议里最特殊的。它没有地址通道,只有数据通道。数据从上游流到下游,像水管里的水一样。
为什么需要这种协议?
想想看,视频数据是一帧一帧连续来的,音频数据是一个采样点一个采样点连续来的。如果每个数据都要带个地址,那得多浪费带宽?Stream协议去掉了地址开销,只保留数据和控制信号,效率极高。
Stream协议的核心信号只有几个:
- TVALID/TREADY:握手信号,控制数据流动
- TDATA:数据总线
- TLAST:包结束标志
- TKEEP/TSTRB:字节使能
- TUSER:用户自定义边带信号
我在做视频处理IP时,特别喜欢用Stream接口。把摄像头数据打包成Stream流,经过ISP处理,再送到DMA写入DDR,整个过程流水线式运作,延迟极低。
1.5 选型对比表
下面这张表,我建议你收藏起来。每次选型时拿出来对照一下,基本不会出错。
| 特性 | AXI4 | AXI4-Lite | AXI4-Stream |
|---|---|---|---|
| 地址映射 | 是 | 是 | 否 |
| 突发传输 | 支持(1~256拍) | 不支持(单拍) | 不适用 |
| 乱序传输 | 支持 | 不支持 | 不适用 |
| 数据通道 | 读/写独立 | 读/写独立 | 单向数据流 |
| 典型应用 | DDR控制器、DMA、高性能加速器 | 寄存器配置、状态查询、中断控制器 | 视频流、音频流、FIFO、DMA数据通道 |
| 逻辑复杂度 | 高 | 低 | 中 |
| 带宽效率 | 高(突发减少地址开销) | 低(每拍都带地址) | 极高(无地址开销) |
1.6 实战选型建议
说了这么多,到底怎么选?我总结几条实战经验:
- 先看是否需要地址:如果需要指定内存位置读写,选AXI4或AXI4-Lite;如果只是数据流,选AXI4-Stream。
- 再看数据量:单次传输超过1个数据,用AXI4;只有1个数据,用AXI4-Lite。
- 最后看性能要求:高带宽、低延迟场景,优先AXI4-Stream;需要随机访问,用AXI4。
我的习惯:在SoC架构设计阶段,我会先把所有外设按功能分类。控制类(配置寄存器)统一用AXI4-Lite,数据类(DMA、加速器)用AXI4,流式类(视频、音频)用AXI4-Stream。这样分层清晰,调试起来也方便。