4. AXI总线协议:AXI4、AXI4-Lite、AXI4-Stream协议详解
说到Zynq,最绕不开的就是AXI总线。我刚开始接触Zynq时,总觉得AXI协议很复杂——又是握手又是通道的。但实际用下来,你会发现它其实很有章法。说白了,AXI就是ARM和FPGA之间沟通的“语言”。你掌握了它,就能让两边高效协作。
AXI协议有三个变种:AXI4、AXI4-Lite和AXI4-Stream。它们各有各的脾气,用错了地方会很麻烦。下面我一个个拆开来讲。
4.1 AXI4:高性能的“大动脉”
AXI4是完整版协议,支持突发传输(Burst)。什么叫突发?就是一次握手后,可以连续传多笔数据,不用每笔都重新发地址。这在搬运大块数据时特别高效。
AXI4有5个独立通道:
- 读地址通道(AR):主机告诉从机“我要读哪个地址”
- 读数据通道(R):从机把数据返回给主机
- 写地址通道(AW):主机告诉从机“我要写哪个地址”
- 写数据通道(W):主机把数据发给从机
- 写响应通道(B):从机告诉主机“写完了,状态如何”
每个通道都有自己的握手信号。我习惯把AXI4想象成一条双向四车道高速公路——地址和数据分开走,互不干扰。
关键参数:AXI4支持最大256笔数据的突发长度,数据位宽可以是32、64、128甚至1024位。在Zynq中,PS端和PL端之间的AXI接口通常是32位或64位。
4.2 AXI4-Lite:轻量级的“控制总线”
AXI4-Lite是AXI4的简化版。它不支持突发传输,每次只能读写一个地址上的数据。但它的逻辑简单,占用的FPGA资源少。
什么时候用AXI4-Lite?我举个例子:配置寄存器。比如你想设置一个PWM的占空比,或者读取一个温度传感器的值。这种场景下,数据量小,频率低,用AXI4-Lite最合适。
AXI4-Lite和AXI4的握手信号完全一样,只是去掉了突发相关的信号(如ARLEN、AWLEN等)。所以,如果你已经会了AXI4,上手AXI4-Lite就是分分钟的事。
我的经验:在Zynq项目中,我通常用AXI4-Lite做控制通路,用AXI4做数据通路。这样既保证了控制逻辑的简洁,又保证了数据搬运的效率。
4.3 AXI4-Stream:流式数据的“管道”
AXI4-Stream和前面两个完全不同。它没有地址通道,只有数据通道。数据像流水一样从源头流向目的地。
AXI4-Stream的信号也很少:
- TVALID:源端告诉目的端“数据有效”
- TREADY:目的端告诉源端“我准备好了”
- TDATA:数据总线
- TLAST:标志一帧数据的结束
- TKEEP:指示哪些字节是有效的(用于非对齐数据)
AXI4-Stream特别适合视频流、音频流、DMA传输这类场景。我在做图像处理加速时,就用AXI4-Stream把像素数据从DMA直接送到FPGA的算法模块里,中间不需要CPU干预。
注意:AXI4-Stream没有写响应通道。数据发出去后,源端不会收到“已收到”的确认。如果你需要可靠传输,得自己加握手逻辑。
4.4 时序与握手信号
AXI协议的核心就是握手。每个通道都使用VALID/READY机制。我画个图帮你理解:
握手规则其实很简单:
- 源端必须等VALID和READY同时为高,才能认为数据发送成功
- 源端可以在VALID为高时等待READY,这叫“等待握手”
- 目的端可以在READY为高时等待VALID,这叫“提前准备”
我曾经在一个项目中,因为没处理好VALID和READY的时序,导致数据丢失。排查了两天才发现——源端在VALID拉高后,还没等READY就改变了数据。嗯,从那以后我写AXI逻辑时,都会严格遵循“VALID不变,直到握手成功”的原则。
4.5 三种协议的对比
| 特性 | AXI4 | AXI4-Lite | AXI4-Stream |
|---|---|---|---|
| 突发传输 | 支持(最大256笔) | 不支持 | 支持(流式) |
| 地址通道 | 有 | 有 | 无 |
| 数据通道 | 读/写分离 | 读/写分离 | 单向 |
| 响应通道 | 有(写响应) | 有(写响应) | 无 |
| 典型应用 | DMA、DDR控制器 | 寄存器配置 | 视频流、音频流 |
| FPGA资源占用 | 高 | 低 | 中 |
选型建议:
- 需要批量读写DDR?用AXI4。
- 只想配置几个寄存器?用AXI4-Lite。
- 数据像流水一样从A到B?用AXI4-Stream。
4.6 实战中的避坑指南
最后,分享几个我在项目中踩过的坑:
- 不要混用协议:AXI4和AXI4-Lite的地址映射方式不同,混用会导致地址错乱。我见过有人把AXI4-Lite的从机挂在AXI4总线上,结果地址总对不上。
- 注意TLAST信号:在AXI4-Stream中,TLAST标志一帧的结束。如果你忘了拉高TLAST,接收端会一直等下去。我曾经因为这个原因,导致视频流卡死。
- 握手超时处理:如果目的端一直不拉高READY,源端会一直等待。建议在设计中加入超时机制,防止死锁。
- 数据对齐:AXI4支持非对齐传输,但会降低效率。我习惯把数据对齐到地址边界上,这样能发挥最大性能。
AXI协议看起来复杂,但只要你理解了握手机制,再结合具体场景选择合适的变种,就能轻松驾驭。记住:AXI4是“卡车”,AXI4-Lite是“自行车”,AXI4-Stream是“传送带”。选对了工具,活就好干了。