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机制。我画个图帮你理解:

AXI4 握手信号时序图 CLK VALID READY DATA 握手过程: 1. 源端拉高VALID,表示数据已准备好 2. 目的端拉高READY,表示可以接收 3. 在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是“传送带”。选对了工具,活就好干了。