1. AXI总线基础:三种协议概述与区别
大家好,我是你们的FPGA讲师。今天咱们聊聊AXI总线——这个在Vivado里绕不开的话题。
说实话,我刚接触AXI的时候,也被那堆信号线搞得头大。什么AW、AR、W、R、B,光看名字就晕了。但干久了你会发现,AXI其实没那么复杂。说白了,它就是ARM公司定义的一套总线标准,专门用来让IP核之间高效通信。
Vivado里几乎所有IP核都支持AXI接口。你想想看,从Zynq的PS到PL,从DMA到FIFO,从DDR控制器到视频处理核,全都在用AXI。所以搞懂它,是FPGA开发的必修课。
1.1 AXI4:高性能全功能版
AXI4是完整版协议,支持突发传输。什么叫突发?就是一次握手,后面连续传一堆数据。我做过一个项目,用AXI4从DDR里搬图像数据,一次突发256个字节,效率比单次传输高了十几倍。
AXI4有五个独立通道:
- 读地址通道(AR):告诉从设备我要读哪里
- 读数据通道(R):从设备把数据发回来
- 写地址通道(AW):告诉从设备我要写哪里
- 写数据通道(W):把数据发出去
- 写响应通道(B):从设备告诉你写完了没
每个通道都是独立的,可以并行工作。这就是AXI4牛的地方——读写可以同时进行,互不干扰。
关键特性:
- 支持突发传输,长度1~256笔
- 数据总线宽度可配:8/16/32/64/128/256/512/1024位
- 支持乱序传输(通过ID标签实现)
- 支持独占访问和锁定访问
我在项目中遇到过一个问题:用AXI4从DDR读数据,结果读回来的数据顺序乱了。后来才发现,是ID标签没配好。嗯,这里要注意——如果你不需要乱序,就把所有传输的ID设成一样,保证顺序不乱。
1.2 AXI4-Lite:轻量级控制总线
AXI4-Lite是AXI4的简化版。说白了,就是去掉了突发功能,每次只能传一个数据。但好处是逻辑简单,占资源少。
我一般用它来配寄存器。比如控制一个视频处理核的增益、偏移量,或者查查状态寄存器。这种场景下,数据量小,不需要突发,用Lite正合适。
AXI4-Lite的特点:
- 数据总线固定32位或64位
- 不支持突发(突发长度固定为1)
- 不支持乱序
- 不支持独占访问
- 信号线比AXI4少很多
我的建议:能用Lite就别用Full。Lite的时序更容易收敛,占用的LUT和FF也少。我见过有人用AXI4 Full去配寄存器,纯属杀鸡用牛刀。
1.3 AXI4-Stream:高速数据流
AXI4-Stream是专门为数据流设计的。它没有地址通道,只有数据通道。数据像流水一样,从上游流到下游。
这个协议在视频处理、DMA、FIFO这些场景里用得最多。我做过一个4K视频处理的项目,数据率高达6Gbps,用AXI4-Stream一点问题没有。
AXI4-Stream的信号线:
- TVALID:发送方说"我有数据"
- TREADY:接收方说"我准备好了"
- TDATA:数据总线
- TLAST:这一包数据的最后一个
- TKEEP:哪些字节是有效的
- TUSER:用户自定义信息
为什么它效率高?因为没有地址开销。你想想看,传视频数据时,每帧图像都是连续的像素流,根本不需要地址。用AXI4-Stream,一拍就能传一个像素,效率拉满。
避坑指南:我曾经在AXI4-Stream的TLAST信号上栽过跟头。接收方如果不处理TLAST,就会把两包数据当成一包处理,结果数据全乱了。所以一定要在状态机里判断TLAST,该复位复位,该换行换行。
1.4 三种协议对比
| 特性 | AXI4 | AXI4-Lite | AXI4-Stream |
|---|---|---|---|
| 地址通道 | 有 | 有 | 无 |
| 突发传输 | 支持(1~256) | 不支持 | 流式传输 |
| 数据宽度 | 8~1024位 | 32/64位 | 任意 |
| 乱序支持 | 支持 | 不支持 | 不支持 |
| 典型应用 | DDR、DMA、大块数据 | 寄存器配置、控制接口 | 视频流、音频流、FIFO |
| 资源开销 | 高 | 低 | 中 |
1.5 知识体系结构图
下面这张图帮你理清三种协议的关系和适用场景:
1.6 怎么选?我的经验
选哪种协议,其实看场景:
- 配寄存器:用AXI4-Lite。简单、省资源、时序好。
- 传视频/音频流:用AXI4-Stream。效率最高,没有地址开销。
- 读写DDR或大块数据:用AXI4 Full。突发传输能充分利用带宽。
我见过有人把AXI4-Lite用在视频流上,结果带宽不够,画面卡成PPT。也见过有人用AXI4 Full去配寄存器,浪费了资源不说,时序还难收敛。所以选对协议,事半功倍。
好了,这一章就到这里。三种协议的区别你搞明白了吗?下一章咱们聊聊AXI的握手协议——VALID和READY信号怎么配合,这可是写AXI接口的核心。