4. AXI4总线协议详解:AXI4-Stream、AXI4-Lite、AXI4-Full接口时序与握手信号

AXI4总线,说白了就是ARM公司搞出来的一套片上总线标准。在FPGA做基站加速器时,你几乎天天跟它打交道。我个人习惯把AXI4看成三种不同性格的接口:Stream像流水线,Lite像收发室,Full像高速公路。今天咱们就把这三个兄弟的脾气摸透。

4.1 握手信号:所有AXI4的基础

不管哪种AXI4接口,核心都是这套握手机制。我刚开始学的时候,总觉得VALID和READY这两个信号绕来绕去,后来发现其实就一个原则:数据只在VALID和READY同时为高的时钟沿传输

核心握手规则:

  • 源端拉高VALID,表示数据已准备好
  • 目的端拉高READY,表示可以接收
  • 两者同时为高,一个数据传输完成

这里有个坑,我曾经踩过好几次:VALID信号一旦拉高,必须保持到握手完成。你不能因为等不到READY就把VALID拉低,那样协议上是不允许的。嗯,这一点在AXI4-Stream里尤其要注意。

4.2 AXI4-Stream:最常用的数据管道

做基站加速器,AXI4-Stream用得最多。为什么?因为基带数据流就是流式的,IQ数据一帧接一帧,正好对上路。

4.2.1 接口信号

信号 方向 说明
TVALID 主→从 主设备数据有效
TREADY 从→主 从设备可以接收
TDATA 主→从 数据总线,宽度可配
TLAST 主→从 包结束标志
TKEEP 主→从 字节有效指示
TUSER 主→从 用户自定义边带信息

4.2.2 时序示例

看一个最简单的传输场景。假设我们要发送一个包含4个数据的包:

// 伪代码描述时序
时钟周期1: TVALID=1, TREADY=1 → 数据0传输完成
时钟周期2: TVALID=1, TREADY=0 → 等待(从设备忙)
时钟周期3: TVALID=1, TREADY=1 → 数据1传输完成
时钟周期4: TVALID=1, TREADY=1 → 数据2传输完成,TLAST=1

我的经验:在基带加速器里,TUSER信号特别有用。我习惯用它传递子帧号、天线索引这些控制信息,跟着数据流一起走,省得另外开一路控制总线。

4.2.3 背压处理

AXI4-Stream最强大的地方在于背压(backpressure)机制。从设备拉低TREADY,主设备就得停。这在基站里太重要了——你想想看,FFT模块处理速度跟不上时,必须让前面的数据源停下来。

避坑指南:我曾经设计过一个FIR滤波器,输出端TREADY拉低后,输入端还在继续送数据。结果内部FIFO爆了,数据全乱。后来加了个反压传递逻辑,输入端看到输出端忙就自动暂停。记住:背压必须逐级传递

4.3 AXI4-Lite:轻量级控制通道

AXI4-Lite,说白了就是简化版的AXI4-Full。它不支持突发传输,每次只能读写一个寄存器。但正因为它简单,在配置寄存器场景下特别好用。

4.3.1 写事务时序

写事务分两步:先写地址,再写数据。地址通道和数据通道是独立的。

// 写地址通道
AWVALID 拉高 → AWREADY 拉高 → 地址传输完成

// 写数据通道
WVALID 拉高 → WREADY 拉高 → 数据传输完成

// 写响应通道
BVALID 拉高 → BREADY 拉高 → 响应传输完成

4.3.2 读事务时序

读事务也是两步:先发地址,再收数据。

// 读地址通道
ARVALID 拉高 → ARREADY 拉高 → 地址传输完成

// 读数据通道
RVALID 拉高 → RREADY 拉高 → 数据传输完成

关键点:AXI4-Lite的地址和数据通道可以流水线操作。也就是说,你可以在前一个写数据还没完成时,就发送下一个写地址。这在批量配置寄存器时能提高效率。

4.4 AXI4-Full:高性能数据搬运工

AXI4-Full支持突发传输,一次地址请求可以搬运多个数据。在基站加速器里,DDR读写、大块数据搬移都用它。

4.4.1 突发传输参数

参数 说明 典型值
ARLEN/AWLEN 突发长度(实际传输数 = 长度+1) 0~255
ARSIZE/AWSIZE 每拍数据字节数 1,2,4,8,16,32,64,128
ARBURST/AWBURST 突发类型 FIXED, INCR, WRAP

4.4.2 突发类型选择

三种突发类型,我分别说说使用场景:

  • FIXED:所有数据访问同一个地址。我很少用,除非是FIFO操作。
  • INCR:地址递增。最常用,比如从DDR读取连续的一帧数据。
  • WRAP:地址回环。缓存行填充时用,比如CPU的Cache line。

我的建议:在基站加速器里,INCR突发用得最多。比如从DDR读取一个OFDM符号的数据,用INCR突发一次读256个64位数据,效率远高于单次读写。

4.4.3 乱序传输

AXI4-Full支持乱序传输。什么意思?你可以先发读请求A,再发读请求B,结果B的数据先回来。这在多通道场景下很有用。

但要注意,每个事务都有一个ID标签。从设备必须保证相同ID的事务按顺序返回。我见过一个设计,不同ID的事务乱序没问题,但相同ID的也乱序,结果数据全对不上号。

曾经踩过的坑:有一次做MIMO检测器,四个天线通道共用一条AXI4-Full总线读数据。我用了四个不同的ID,结果从设备不支持乱序,所有ID都按顺序返回。性能直接掉到四分之一。后来改成单ID流水线,才把带宽跑满。

4.5 三种接口的选择策略

做基站加速器时,我一般这样选:

  • 数据流路径:AXI4-Stream。IQ数据、FFT结果、信道估计值,全是流式数据。
  • 控制寄存器:AXI4-Lite。配置增益、开关、模式选择,一次一个寄存器就够了。
  • 大块数据搬运:AXI4-Full。DDR读写、大矩阵搬移,需要突发传输。

嗯,说白了就是:流数据用Stream,配置用Lite,搬数据用Full。这个口诀我记了十年,从来没选错过。

4.6 本章小结

AXI4的三种接口,各有各的脾气。Stream简单高效,适合数据管道;Lite轻量灵活,适合寄存器配置;Full功能强大,适合高性能数据搬运。理解它们的握手时序和特性,是做好基站加速器的基本功。

下一章,咱们聊聊怎么用AXI4-Stream搭建一个完整的基带数据通路。到时候我会拿一个OFDM接收机做例子,把TVALID和TREADY的配合讲透。