3、AXI总线协议详解:AXI4、AXI4-Lite、AXI4-Stream协议区别、握手信号、突发传输、地址映射与数据对齐
做FPGA+ARM协同设计,AXI总线是绕不开的坎。我最早接触AXI时,看着那堆信号线真有点头大——VALID、READY、LAST、KEEP……但用久了你会发现,这套协议设计得相当精巧。说白了,它解决了片上系统里最核心的问题:不同主设备怎么高效地访问从设备。
今天咱们就把AXI的三个变种掰开揉碎讲清楚。你想想看,ARM和FPGA之间要传数据,有时候是配置寄存器(几字节),有时候是搬大块数据(几兆字节),有时候是流媒体(视频帧)。这三种场景,AXI分别给了三个协议版本。
3.1 三种协议的核心区别
| 特性 | AXI4(完整版) | AXI4-Lite(轻量版) | AXI4-Stream(流式版) |
|---|---|---|---|
| 地址通道 | 有(支持突发) | 有(不支持突发) | 无地址 |
| 数据宽度 | 8~1024位 | 32位固定 | 任意宽度 |
| 突发传输 | 支持(1~256拍) | 不支持(仅单拍) | 连续流 |
| 典型用途 | DDR、DMA、高速外设 | 寄存器配置、状态读取 | 视频流、音频流、FIFO |
我个人的习惯是:凡是需要配置寄存器的,一律用AXI4-Lite;凡是需要搬大量数据的,用AXI4完整版;凡是数据流不需要随机访问的,用AXI4-Stream。这个选择原则帮我避了不少坑。
3.2 握手信号:VALID与READY的舞蹈
AXI的握手机制,核心就两个信号:VALID和READY。发送方拉高VALID表示数据有效,接收方拉高READY表示可以接收。数据只在两者同时为高的时钟沿传输。
这里有三种握手场景:
- VALID先于READY:发送方准备好数据,等待接收方就绪。这是最常见的情况。
- READY先于VALID:接收方提前告知“我准备好了”,发送方随后给出数据。效率最高,零等待。
- 同时拉高:一拍完成传输,理想状态。
关键规则:VALID一旦拉高,必须保持到握手完成,不能中途撤销。READY可以随时拉高或拉低。这个不对称的设计,是为了保证数据不会丢失。
我在项目中遇到过一个问题:从设备READY信号在VALID到来后才拉高,导致每个传输都多等了一拍。后来改成READY提前拉高,吞吐量直接提升了30%。嗯,细节决定成败。
3.3 突发传输:地址只需发一次
AXI4最强大的特性就是突发传输。传统总线每传一笔数据都要发一次地址,而AXI4只需要在突发开始时发一次起始地址,后续数据自动递增地址。
突发传输有三个关键参数:
- ARLEN/AWLEN:突发长度,实际传输拍数 = 长度 + 1
- ARSIZE/AWSIZE:每拍数据字节数,2的幂次
- ARBURST/AWBURST:突发类型,FIXED/INCR/WRAP
举个例子:如果你要读64字节数据,数据总线宽度64位(8字节),那么ARLEN=7(8拍),ARSIZE=3(2^3=8字节),ARBURST=INCR。地址从0x1000开始,依次访问0x1000、0x1008、0x1010……直到0x1038。
实战技巧:突发长度不要超过256,这是协议上限。另外,地址对齐很重要——起始地址必须是数据宽度的整数倍。我曾经因为地址没对齐,导致仿真正确但上板后数据错位,查了两天才发现是地址问题。
3.4 地址映射与数据对齐
地址映射是FPGA工程师最容易踩坑的地方。ARM侧看到的地址空间和FPGA侧的实际存储空间,需要建立正确的映射关系。
数据对齐规则:
- 自然对齐:32位数据的地址必须是4的倍数,64位数据的地址必须是8的倍数
- 非对齐访问:AXI支持非对齐,但会降低效率。硬件会自动拆分传输
- 字节通道:WSTRB信号指示哪些字节有效,每个bit对应一个字节
我建议你在设计地址映射时,遵循“对齐优先”原则。把寄存器按32位对齐,把大数据缓冲区按64位或128位对齐。这样ARM侧访问起来最顺畅,FPGA侧解析也最简单。
3.5 AXI4-Stream:没有地址的任性传输
AXI4-Stream是三个协议里最特殊的——它没有地址通道。数据从TVALID/TREADY握手开始,一直流到TLAST信号拉高为止。
关键信号:
- TVALID/TREADY:标准握手
- TDATA:数据总线
- TLAST:最后一拍标志
- TKEEP:指示哪些字节有效(类似WSTRB)
- TUSER:用户自定义信号,可携带边带信息
做视频处理时,我经常用TUSER来传递帧同步信号。比如每帧第一行第一个像素,TUSER拉高,这样接收端就知道新帧开始了。比单独拉一根同步线要优雅得多。
注意:AXI4-Stream没有写响应通道,发送方无法知道数据是否被正确接收。如果应用需要确认机制,要么在应用层做握手,要么改用AXI4完整版。
3.6 三种协议的选择策略
最后给个实用建议。设计一个系统时,三种协议可以混用:
- ARM通过AXI4-Lite配置FPGA内的寄存器(如采样率、增益、模式选择)
- FPGA采集的数据通过AXI4-Stream送入DMA
- DMA通过AXI4完整版将数据写入DDR
这种架构我在多个项目里用过,效果很好。每个协议各司其职,没有谁比谁高级,只有谁更适合什么场景。
好了,AXI协议的核心内容就这些。记住握手规则、突发参数、对齐要求,你就能在FPGA和ARM之间搭起一条高效的数据通道。