AXI4-Full和AXI4-Stream适用场景:什么时候用内存映射,什么时候用纯数据流
AXI4-Full 和 AXI4-Stream 同属 AMBA AXI4 家族,连握手信号(VALID/READY)都长得一样,但服务的是两类完全不同的数据传输问题。很多初学者在 FPGA 工程里把两者混着用——用 Stream 去做寄存器访问、或者给图像数据流硬套 Full 的地址通道——结果不是功能别扭就是白烧逻辑。这一篇把两者的适用边界一次划清。关于 AXI 家族的更大图景(APB/AHB/AXI 怎么选)可以看 AMBA 总线选型指南,AXI4-Full 协议本身的细节在 AXI4 完整协议 burst 基础。
本文要回答的问题
- AXI4-Full 和 AXI4-Stream 的本质区别到底是什么?
- 拿到一个模块接口需求,怎么快速判定该用哪一个?
- 哪些典型 IP 场景分别对应 Full 和 Stream?
- 实际选型中最容易踩的误区有哪些?
简短结论
要给数据一个「地址」、需要随机访问或突发读写内存/寄存器,用 AXI4-Full;数据天然就是一条单向、连续、无地址的流(像素、采样点、网络报文),用 AXI4-Stream。 判断依据只有一句话:你的数据需不需要被「寻址」。需要寻址就是 Full 的地盘,不需要寻址、只需要按顺序往前灌就是 Stream 的地盘。
这张对比卡抓住一个核心:Full 的五个通道里有三个在围着「地址」转(AW 给写地址、AR 给读地址、B 回写响应),而 Stream 把这些全部砍掉,只留数据加握手。砍掉的不是功能,是约束——Stream 假设数据的目的地天然确定,不需要每笔交易都报地址。
理由一:寻址模型不同,决定通道结构不同
AXI4-Full 是内存映射(memory-mapped)协议:每一笔事务都带一个地址,主设备说「我要写地址 0x4000_0000 开始的 16 拍数据」,从设备照地址执行。为了支撑这个模型,它拆出五个独立通道:写地址(AW)、写数据(W)、写响应(B)、读地址(AR)、读数据(R),读写完全并行,地址和数据分离还能流水化。
AXI4-Stream 则假设数据就是一条河:从源头到终点按顺序流,没有「第几个字节放到哪」的概念,所以连地址通道都不存在。信号表精简到 TVALID/TREADY/TDATA,外加 TLAST 标一个包的结束、TKEEP 标有效字节,仅此而已。
上图的两个分层正是真实 SoC/FPGA 系统的样子:左边 Full 世界围着互连和地址转,右边 Stream 世界是一条处理流水线。两个世界并不互斥,绝大多数工程是「Stream 负责高速数据通路,Full 负责控制面和落盘」,中间靠 DMA 衔接。
理由二:性能特征的诉求不同
Full 的性能手段是突发(burst)加乱序:一次 AW 握手声明要传 1~256 拍,之后数据连续走;多笔事务可以用不同 ID 并发挂着(outstanding),互连按 ID 区分归属、允许乱序返回,把总线利用率拉满。这些机制的存在都是为了「访问内存」这个场景——DDR 延迟高,只有靠深度流水和并发才能掩盖。
Stream 的性能手段恰恰相反:什么都不做就是最快。没有地址开销、没有响应通道、每个时钟周期都是纯数据,位宽做到 512 bit 就每拍搬 64 字节。视频 4K@60 的像素流、100G 以太网报文,都靠这种零开销的流式传输。突发的概念在 Stream 里退化为「一个 TLAST 包」,而且包长可以任意、甚至无限。
理由三:软件可见性不同
Full 的世界对软件是透明的:CPU 用普通 load/store 指令就能摸到挂在总线上的一切,驱动开发者看到的是「基地址 + 偏移」。Stream 对软件天然不可见——CPU 没有「往流里塞一个数据」的指令,必须借助 DMA 把流和内存之间做一次转换。这也是为什么 Xilinx 的 AXI DMA、CDMA 这类 IP 永远是 Full 一侧接 PS/互连、Stream 一侧接用户逻辑。
典型例子:同一个视频系统里的两种接口
以 FPGA 视频处理系统为例,两种接口各司其职:
- 摄像头 sensor 输出 → 视频时序转换 IP → 帧数据以 AXI4-Stream 单向流入滤波、缩放等处理 IP——像素一旦产生就永远往前流,没有回头寻址的必要,Stream 是唯一合理选择。细节可参考 AXI4 Stream 与 DMA 数据流。
- 处理完的帧要进 DDR 缓存 → AXI DMA 的 Stream 侧收数据,Full 侧发起突发写把帧搬进 DDR 指定帧缓冲地址——这里需要地址(第几帧、帧内偏移),必须是 Full。
- CPU 配置滤波系数、查询状态 → 走轻量的 AXI4-Lite 寄存器口(Full 的简化版),见 AXI4 Lite 从机设计。

这张思维导图把选型收敛成三个自问:数据带不带地址、是不是单向流、吞吐靠什么撑。三个问题答完,接口类型基本唯一确定,不存在「都可以」的灰色地带——灰色地带往往意味着该把模块拆成「Stream 数据面 + Lite 控制面」两个口。
常见误区
误区一:Stream 只是「阉割版 Full」,用 Full 总是更保险。 恰恰相反。给纯数据流套 Full,你得自己编造一套地址语义(比如永远往同一个地址写),白白多花五个通道的逻辑和布线,还丢掉了 Stream 生态里现成的 IP(FIFO、DataMover、位宽转换器)。Stream 不是简化,是为流场景专门设计的最小完备集。
误区二:Stream 不能做分包、不能做对齐。 TLAST 就是分包边界,TKEEP 就是字节级对齐标记,TUSER 还能随流捎带边带信息(比如行号、时间戳)。Stream 的表达力足够覆盖绝大多数流协议,缺的是地址,不是能力。Stream 的反压细节(VALID 不能等 READY 这类坑)见 AXI Stream 反压握手时序。
误区三:Full 一定比 Stream 快。 裸数据通路上 Stream 更快,因为每个周期都是净荷;Full 的优势在访问内存时的并发掩盖延迟。两者比的是不同赛道,选型不是比快慢,是看数据形态。
误区四:Lite 和 Full 的差别只是位宽。 AXI4-Lite 砍掉的是突发和多 ID,每次只传一拍、无 burst——它和 Stream 的选择逻辑一样来自「数据形态」而非「性能档位」。Lite 与 Full 的逐条差异,同系列的 AXI4 与 AXI4-Lite 核心区别 有专门展开。
这一篇在知识体系里的位置
本篇是 AXI 簇里负责「划界」的入门问答:向上接 AMBA 总线选型指南 的家族视角,向下把两条深入路径分开——选 Full 的读者接着看 AXI4 完整协议 burst 基础 和 AXI4 事务生命周期,选 Stream 的读者接着看 AXI4 Stream 与 DMA 数据流 与 AXI Stream 反压握手时序。
一句话总结
AXI4-Full 和 AXI4-Stream 的分界线只有一条——数据需不需要地址:需要寻址、突发、随机访问就走 Full 的五通道内存映射世界;数据天然单向连续、按序推进就走 Stream 的零开销流式世界,真实系统里两者通过 DMA 各司其职,选型错误几乎都是因为给流数据硬编了地址、或给内存访问硬删了地址。