1. AXI总线概述:AXI4、AXI4-Lite、AXI4-Stream协议的区别与选型

大家好,我是你们这趟总线之旅的向导。咱们第一节课,先聊聊AXI家族的三个兄弟——AXI4、AXI4-Lite和AXI4-Stream。

很多刚接触ARM架构的朋友,一看到这三个协议就头大。说实话,我当年也懵过。记得第一次做Zynq项目,想把一个自定义IP挂到PS端,结果选错了接口,仿真跑起来数据全乱套。后来才明白,选对协议比写好逻辑更重要。

这三个协议,说白了就是为不同场景设计的。你想想看,一个高速视频流和一个寄存器配置,能用同一个接口吗?显然不行。ARM把总线分成了三档,就是为了让设计者各取所需。

1.1 三兄弟的定位

先看一张总览图,把三者的关系理清楚。

AXI协议家族总览 AXI4(全功能) 高性能内存映射 突发传输、乱序、多地址 AXI4-Lite(轻量级) 寄存器级内存映射 单次传输、无突发 AXI4-Stream(流式) 无地址、无限数据流 低延迟、高吞吐 核心区别 • AXI4:带地址,支持突发(Burst),适合DDR、大块数据搬运 • AXI4-Lite:带地址,不支持突发,适合配置寄存器、状态查询 • AXI4-Stream:无地址,只有数据流,适合视频、音频、DMA 选型速查 • 需要读写内存、搬运大块数据 → AXI4 • 只需要配置几个寄存器 → AXI4-Lite • 数据流单向传输,不需要地址 → AXI4-Stream

我的经验:新手最容易犯的错误,就是用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 实战选型建议

说了这么多,到底怎么选?我总结几条实战经验:

  1. 先看是否需要地址:如果需要指定内存位置读写,选AXI4或AXI4-Lite;如果只是数据流,选AXI4-Stream。
  2. 再看数据量:单次传输超过1个数据,用AXI4;只有1个数据,用AXI4-Lite。
  3. 最后看性能要求:高带宽、低延迟场景,优先AXI4-Stream;需要随机访问,用AXI4。

我的习惯:在SoC架构设计阶段,我会先把所有外设按功能分类。控制类(配置寄存器)统一用AXI4-Lite,数据类(DMA、加速器)用AXI4,流式类(视频、音频)用AXI4-Stream。这样分层清晰,调试起来也方便。