一、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总线知识体系 AXI总线 AXI4(全功能) AXI4-Lite(精简) AXI4-Stream(流) 典型应用场景 DDR控制器 高带宽突发传输 DMA控制器 数据搬运与地址管理 PCIe桥接 跨芯片高速互联 关键特性 独立读写通道 突发传输(Burst) 乱序传输支持 注:三个协议版本对应不同应用场景,实际项目中常混合使用

这张图把AXI的三大协议和三个典型应用场景串起来了。你仔细看,AXI4对应DDR和DMA,因为需要突发传输;AXI4-Lite适合配置寄存器;AXI4-Stream适合流式数据。PCIe比较特殊,它内部既用AXI4做数据通道,也用AXI4-Lite做配置通道。

我的建议:刚开始学AXI,不要试图一下子把所有细节都记住。先理解这张图的结构,知道什么场景用什么协议。具体细节,咱们后面章节慢慢展开。

好了,这一章就到这里。AXI总线的基本概念和三个协议的区别,你应该心里有数了。下一章咱们深入AXI4的读写通道,看看握手信号到底怎么玩。

可可精品资料库