一、AXI总线概述:从协议到实战
大家好,我是你们的FPGA教练。今天咱们聊聊AXI总线。
说实话,我刚入行那会儿,看到AXI这三个字母就头大。什么AXI4、AXI4-Lite、AXI4-Stream,还有人说AXI和AXI4不一样?别急,今天我把这些掰开了揉碎了讲给你听。
一句话总结:AXI是ARM公司推出的高性能总线协议,现在已经是片上系统(SoC)互联的事实标准。你只要做FPGA和DDR、DMA、PCIe打交道,就绕不开它。
1.1 AXI4、AXI4-Lite、AXI4-Stream:三兄弟的区别
AXI家族有三个成员,我习惯叫它们「三兄弟」。老大AXI4功能最全,老二AXI4-Lite精简,老三AXI4-Stream专治流数据。
| 协议版本 | 特点 | 典型应用 |
|---|---|---|
| AXI4 | 支持突发传输,一次最多256笔数据 | DDR控制器、高速DMA |
| AXI4-Lite | 不支持突发,一次只传1笔数据 | 寄存器配置、控制状态寄存器 |
| AXI4-Stream | 没有地址,只有数据流 | 视频流、以太网、ADC数据采集 |
你想想看,为什么要有三个版本?说白了就是「按需分配」。如果你要读写DDR,一次搬一大块数据,那就用AXI4。如果你只是配个寄存器,一次写一个32位数据,AXI4-Lite就够了,省资源。如果你做视频处理,数据像流水一样过来,根本不需要地址,那就用AXI4-Stream。
我的经验:我在做MIPI摄像头采集项目时,图像数据用AXI4-Stream从摄像头传到DMA,DMA再用AXI4把数据写到DDR。两种协议配合使用,效率很高。
1.2 AXI与AXI4:到底有什么区别?
这个问题我经常被问到。其实很简单——AXI是总称,AXI4是具体版本。
AXI协议最早是ARM在2003年推出的,后来升级到AXI3,再后来就是2011年的AXI4。现在大家说的AXI,基本上默认指AXI4。但如果你看老项目或者某些IP核的手册,可能会看到AXI3的写法。
AXI4相比AXI3,主要改进有两点:
- 突发长度支持更大:AXI3最多16笔,AXI4可以到256笔
- 增加了AXI4-Lite和AXI4-Stream:这两个在AXI3时代是没有的
嗯,这里要注意:如果你在Xilinx的Vivado里例化一个AXI接口的IP,它默认就是AXI4。但如果你用老的EDK工具,可能还是AXI3。我建议新项目一律用AXI4,兼容性更好。
1.3 AXI总线的应用场景:DDR、DMA、PCIe
这三个场景,是我在项目中遇到最多的。咱们一个一个说。
1.3.1 AXI + DDR:高速存储的基石
DDR控制器几乎清一色用AXI接口。为什么?因为DDR读写需要高带宽、低延迟,而AXI的突发传输正好满足这个需求。
我曾经调试过一个DDR读写错误的案例,现象是写入0x12345678,读出来变成0x12345600。查了两天,最后发现是AXI的地址对齐没做好。DDR要求地址按16字节对齐,而我当时写了个非对齐的地址,结果数据就乱了。
避坑指南:我曾经因为AXI地址对齐问题浪费了两天时间。记住:DDR的AXI接口,地址必须按数据总线宽度对齐。64位数据总线,地址必须8字节对齐;128位数据总线,地址必须16字节对齐。
1.3.2 AXI + DMA:数据搬运工
DMA(直接存储器访问)是AXI最经典的应用。CPU配好DMA的源地址、目的地址、传输长度,然后DMA自己用AXI接口搬数据,搬完了发个中断通知CPU。
我做过一个项目,用AXI DMA把ADC采集的数据搬到DDR,然后CPU做FFT处理。这里有个关键点:DMA的AXI接口要设置成增量地址模式,这样每次突发传输后地址自动加1,数据就能连续存到DDR里。
// AXI DMA配置示例(伪代码)
// 设置源地址:ADC的FIFO地址
AXI_DMA_SRC_ADDR = 0x4000_0000;
// 设置目的地址:DDR缓冲区
AXI_DMA_DST_ADDR = 0x8000_0000;
// 设置传输长度:1024个32位数据
AXI_DMA_LENGTH = 1024 * 4; // 单位:字节
// 启动传输
AXI_DMA_START = 1;
1.3.3 AXI + PCIe:跨芯片通信
PCIe和AXI的关系,说白了就是「桥接」。PCIe是板级互联,AXI是片内互联。FPGA作为PCIe端点设备,内部用AXI总线连接各个IP核。
我记得有一次调试PCIe+DMA的吞吐量,理论带宽是8GT/s,实际只能跑到3GT/s。查了半天,发现是AXI的突发长度设得太小了。PCIe一次可以传128字节,但AXI的突发长度只设了16字节,导致PCIe要等多次AXI传输才能凑够一包数据。
关键参数:PCIe转AXI时,建议把AXI的突发长度设到64或128,这样能充分利用PCIe的带宽。我后来把突发长度从16改成64,吞吐量直接翻倍。
1.4 知识体系总览
下面这张图,是我自己总结的AXI总线知识体系。你把它记在脑子里,后面学起来就轻松多了。
这张图把AXI的三大协议和三个典型应用场景串起来了。你仔细看,AXI4对应DDR和DMA,因为需要突发传输;AXI4-Lite适合配置寄存器;AXI4-Stream适合流式数据。PCIe比较特殊,它内部既用AXI4做数据通道,也用AXI4-Lite做配置通道。
我的建议:刚开始学AXI,不要试图一下子把所有细节都记住。先理解这张图的结构,知道什么场景用什么协议。具体细节,咱们后面章节慢慢展开。
好了,这一章就到这里。AXI总线的基本概念和三个协议的区别,你应该心里有数了。下一章咱们深入AXI4的读写通道,看看握手信号到底怎么玩。