跳到主要内容AXI 总线详解与 FPGA 实现指南 | 极客日志编程语言
AXI 总线详解与 FPGA 实现指南
AXI 总线的基础定位、核心特性及五大独立通道架构,重点讲解了 AXI4-Lite、AXI4 和 AXI4-Stream 三种子集的区别与应用场景。针对 FPGA 实现,提供了两种主要方案:一是调用官方 IP 核进行图形化互联,适用于 90% 的场景;二是手动编写 Verilog 适配逻辑,适用于定制化需求。文章还给出了 AXI4-Lite 从机和 AXI4-Stream 数据转发的核心代码示例,并总结了 READY-VALID 握手、时钟域同步、位宽匹配等关键设计要点,旨在帮助开发者系统掌握 AXI 协议及其在 FPGA 中的落地实践。
菩提1 浏览 1.1 AXI 总线的基础定位
AXI(Advanced eXtensible Interface,高级可扩展接口)是 ARM 公司制定的 AMBA 总线协议簇中的核心成员,属于高性能片上互联总线(On-Chip Bus),主流版本为 AXI3 和 AXI4(目前 FPGA/SoC 中 99% 使用 AXI4),是当前芯片内、异构芯片间数据交互的事实标准。
AXI 总线设计的核心目标:高性能、高带宽、低延迟、高灵活性,专门解决片内多模块(CPU、FPGA 逻辑、DDR、DMA、外设 IP)之间的高速数据交互问题,也是 FPGA 开发中必须掌握的核心协议。
1.2 AXI 总线的核心特性
AXI 能成为主流,核心源于其设计上的优秀特性,所有特性均为「提升传输效率、降低设计复杂度」服务,也是区别于 AHB/APB 等传统 AMBA 总线的关键:
- 地址/控制信号 与 数据信号 完全分离:发起传输时,地址和控制信息先传输,数据随后独立传输,互不阻塞,大幅提升总线利用率;
- 5 个独立的单向传输通道:AXI 的所有交互都基于这 5 个通道完成,通道间完全独立、互不干扰,是 AXI 高性能的核心,下文重点讲解;
- 支持突发传输(Burst Transfer):只需发送 1 次地址 + 控制信息,即可连续传输多拍数据(AXI3 最大 16 拍,AXI4 最大 256 拍),无需每次传输都发地址,适合大数据块读写(DDR、视频流等);
- 核心握手机制:READY-VALID 流控握手:所有 AXI 通道的传输都遵循这套异步握手机制,无时钟同步要求、无主从优先级限制,是 AXI 协议的基石,规则极简:
- 发送方拉高
VALID 表示「数据/地址/响应有效,已准备好发送」;
- 接收方拉高
READY 表示「接收端就绪,可以接收数据」;
- 只有当
VALID & READY = 1 时,本次传输才算真正完成;
- 优势:完美解决总线拥塞、跨时钟域传输、模块速率不匹配的问题,抗干扰性极强。
- 支持非对齐数据传输:可灵活传输任意字节对齐的数据(如 1 字节、2 字节),无需强制对齐到 32/64 位,适配各类外设;
- 支持乱序传输与乱序完成:不同传输事务可标记独立的 ID,主机可并行发起多个事务,从机可按自身处理效率乱序完成,最后通过 ID 回传结果,最大化总线吞吐量;
- 读写分离:读操作和写操作的通道完全独立,可同时进行读写,总线无冲突。
1.3 AXI 的核心架构:5 个独立单向通道
AXI 的所有数据交互,本质都是这 5 个单向通道的组合传输,所有通道均遵循 READY-VALID 握手机制,写事务用到 3 个通道,读事务用到 2 个通道,无任何交叉复用,这是 AXI 最核心的设计,必须牢记:
核心原则:所有通道都是「单向」的,要么是「主机→从机」,要么是「从机→主机」,没有双向信号线!
✔ 写事务(主机 → 从机,3 个通道)
主机向从机写入数据的完整流程,依赖 3 个独立通道的协同,通道顺序可灵活,不强制严格先后:
- 写地址通道(AW:Address Write):主机 → 从机,传输「写操作的目标地址 + 控制信息」(如突发长度、突发类型、数据位宽);
- 写数据通道(W:Write Data):主机 → 从机,传输「要写入的有效数据 + 字节选通信号」(标记哪些字节是有效数据);
- 写响应通道(B:Write Response):从机 → 主机,传输「写操作的结果状态」(如写成功、写失败、地址错误),是对一次写事务的最终反馈。
✔ 读事务(主机 ← 从机,2 个通道)
主机从从机读取数据的完整流程,依赖 2 个独立通道的协同:
- 读地址通道(AR:Address Read):主机 → 从机,传输「读操作的目标地址 + 控制信息」(如突发长度、数据位宽);
- 读数据通道(R:Read Data):从机 → 主机,数据 + 响应二合一传输,既传输「读取到的有效数据」,也传输「读操作的结果状态」,无需单独的读响应通道。
1.4 AXI4 的三大核心子集(FPGA 开发 重中之重,必掌握)
完整版 AXI4 协议的信号线较多、逻辑复杂,但 ARM 在 AXI4 基础上,针对不同应用场景裁剪出了三个极简、高效的子集,这三个子集是 FPGA 开发中唯一会用到的 AXI 形式(无例外),也是 FPGA 厂商官方 IP 核的标配接口,99% 的 FPGA 工程只用到这三个子集,优先级:AXI4-Lite ≈ AXI4-Stream > AXI4,三者的定位、特性、应用场景严格区分,无兼容关系,但设计思想一致:
✅ 1. AXI4-Lite (轻量级 AXI4,最常用)
- 核心定位:低速、轻量、寄存器级读写,是 AXI4 的最简裁剪版;
- 核心特性:只支持单拍传输(突发长度固定=1),地址必须 32/64 位对齐,数据位宽固定为 32/64 位,信号线极少(总共不到 20 根),实现难度为「零」;
- 核心应用场景:FPGA 中所有外设 IP 的配置与控制,比如配置 GPIO、SPI、I2C、UART、以太网的寄存器,读写片内控制寄存器等;
- FPGA 地位:必备接口,所有 FPGA 官方 IP 核都提供 AXI4-Lite 接口,是 FPGA 逻辑与处理器(ARM/MicroBlaze)交互的核心桥梁。
✅ 2. AXI4 (标准 AXI4,高性能)
- 核心定位:高速、大数据块传输,是完整版的 AXI4 协议;
- 核心特性:支持 1~256 拍突发传输,地址对齐,数据位宽支持 32/64/128/256 位等,信号线比 AXI4-Lite 多,实现难度中等;
- 核心应用场景:FPGA 中高速数据交互,比如 DDR3/DDR4 读写、DMA 数据搬移、高速外设(PCIe、SATA)的数据传输等;
- FPGA 地位:高速数据场景必备,比如 FPGA 采集的海量数据写入 DDR,或从 DDR 读取数据做实时处理。
✅ 3. AXI4-Stream (流式 AXI4,FPGA 第一高频接口,重中之重)
核心区别:AXI4-Stream 无地址线!无地址、无控制信息,只有纯数据流,是专门为「连续串行数据传输」设计的总线。
- 核心定位:高速、无地址、纯流式数据传输,是 AXI4 的「无地址版」,也叫 AXIS;
- 核心特性:无地址、无突发限制,数据位宽任意(8/16/32/64/128 位),核心握手机制为
TVALID-TREADY,仅保留「数据有效 + 接收就绪」;可选信号:TLAST(帧结束标记,标记一包数据的末尾)、TUSER(用户自定义信号)、TKEEP(字节有效标记);
- 核心应用场景:FPGA 中所有连续高速数据流场景,比如视频流(HDMI/DP)、ADC/DAC 采集的模拟数据、以太网/光纤的数据包、PCIe 的高速串行数据、DMA 的数据流转发等;
- FPGA 地位:绝对的第一高频接口,FPGA 开发中 80% 的高速数据交互都是通过 AXI4-Stream 完成的,是 FPGA 的「生命线接口」。
二、FPGA 如何实现 AXI 总线(完整落地指南,从入门到进阶)
✅ 前置核心结论(新手必看,避坑关键)
- FPGA 厂商(AMD/Xilinx、Intel/Altera)对 AXI4 协议做了原生固化支持,所有官方 IP 核(DDR、DMA、UART、SPI、以太网、PCIe、视频 IP)的顶层接口,全部是 AXI4-Lite/AXI4/AXI4-Stream,无例外;
- FPGA 实现 AXI 总线,不需要从零手写完整的 AXI 协议栈,也不需要深入理解 AXI 的底层时序细节,这是最大的利好;
- FPGA 实现 AXI 的核心逻辑:复用官方成熟 IP + 少量自定义适配逻辑,两种实现思路,90% 的工程场景用第一种,10% 的定制化场景用第二种,优先级从高到低,新手优先掌握第一种即可完成 99% 的开发需求。
2.1 核心前提:AXI 在 FPGA 中的角色
在 FPGA 中,AXI 总线的角色是「片内互联桥梁」:
- AXI 主机(Master):发起数据传输的模块,比如 FPGA 的软核处理器(MicroBlaze)、硬核处理器(Zynq 的 ARM)、DMA 控制器、自定义逻辑模块;
- AXI 从机(Slave):接收并响应传输的模块,比如 DDR IP、GPIO IP、SPI IP、以太网 IP、自定义寄存器模块、ADC 采集模块;
- 所有主机和从机,都通过 AXI 总线互联,实现数据的统一交互,一套总线适配所有模块,无需为不同外设设计不同的接口,大幅降低 FPGA 的设计复杂度。
2.2 思路一:调用官方 IP 核,零手写 AXI 协议逻辑(推荐,90% 场景,新手首选)
✅ 核心优势
这是 FPGA 实现 AXI 总线的主流方式、最优方式、最高效方式,也是所有 FPGA 工程师的标配开发流程。官方 AXI IP 核已经由厂商做了极致优化:
- 内置完整的 AXI 协议逻辑、READY-VALID 握手、时序约束、抗干扰处理;
- 经过严格的量产验证,稳定性 100%,无协议 bug;
- 图形化配置参数,无需手写任何 AXI 相关代码;
- 自动生成互联逻辑,一键完成模块间的 AXI 总线互联。
✅ 实现核心逻辑
FPGA 开发 AXI 的本质:拼积木式开发 —— 把官方 AXI IP 核当作「积木」,用图形化工具把这些积木通过 AXI 总线连接起来,仅需编写少量逻辑完成「数据转发/寄存器配置」,即可实现完整的 AXI 总线功能。
✅ 具体实现步骤(通用流程,AMD/Intel 均适用)
步骤 1:新建 FPGA 工程,按需添加官方 AXI IP 核
- 做寄存器配置 → 添加
AXI GPIO/AXI SPI/AXI I2C IP(AXI4-Lite 接口);
- 做高速数据存储 → 添加
AXI DDR3/DDR4 IP + AXI DMA IP(AXI4 接口);
- 做高速数据流采集 → 添加
AXI ADC/DAC IP + AXI FIFO IP(AXI4-Stream 接口)。
步骤 2:图形化配置 IP 核参数
- AXI4-Lite 的 GPIO IP:配置引脚数量、输入/输出模式;
- AXI4 的 DMA IP:配置数据位宽、突发长度、传输方向;
- AXI4-Stream 的 FIFO IP:配置数据位宽、深度、是否带 TLAST 信号。
步骤 3:图形化互联 AXI IP 核(关键,零代码)
两大厂商均提供可视化的「块设计(Block Design)」工具:
- AMD/Xilinx:Vivado → Block Design;
- Intel/Altera:Quartus → Platform Designer (原 Qsys);
在工具中,只需用鼠标拖拽,即可将不同 IP 核的 AXI 接口(如
M_AXI 主机接口、S_AXI 从机接口)自动连接,工具会自动生成 AXI 互联 IP(AXI Interconnect),完成地址映射、总线仲裁、数据路由,无需手写任何连线代码。
步骤 4:生成 HDL 代码,编译下载
工具会根据图形化的互联关系,自动生成完整的 HDL 代码(Verilog/VHDL),直接编译即可下载到 FPGA 芯片中运行,全程零手写 AXI 协议逻辑。
✅ 入门实战案例(最经典,新手必做)
需求:通过 AXI4-Lite 控制 FPGA 的 LED 灯亮灭
- 添加
MicroBlaze 软核(AXI4-Lite 主机) + AXI GPIO IP 核(AXI4-Lite 从机,连接 LED 灯);
- 在 Block Design 中,将 MicroBlaze 的
M_AXI_LITE 接口与 AXI GPIO 的 S_AXI 接口互联;
- 配置 AXI GPIO 为输出模式,引脚映射到 FPGA 的 LED 灯;
- 编写简单的 C 代码,让 MicroBlaze 通过 AXI4-Lite 读写 AXI GPIO 的寄存器,控制 LED 灯的亮灭;
- 编译下载,完成验证。
这个案例的核心:你不需要懂任何 AXI 协议细节,只需要拼 IP 核,就能实现 AXI 总线的完整功能。
2.3 思路二:手动编写 AXI 接口适配逻辑(进阶,10% 场景,定制化需求)
✅ 适用场景
当官方 IP 核无法满足定制化需求时,需要手动编写少量 Verilog/VHDL 代码实现 AXI 接口适配,比如:
- 自定义一个 AXI4-Lite 从机模块,实现特定的寄存器读写逻辑(如 FPGA 内部的状态寄存器、控制寄存器);
- 自定义 AXI4-Stream 的数据流处理逻辑(如位宽转换、数据拼接、帧分割、数据流转发);
- 精简 AXI 接口的信号线,适配自研外设的特殊需求;
✅ 核心原则(重中之重,避坑)
手动编写的核心是:只写「AXI 接口适配层(Wrapper)」,不写完整的 AXI 协议栈!
- 我们只需要实现 AXI 的核心握手机制(READY/VALID) 和数据/地址的简单映射;
- 所有手动编写的 AXI 模块,都可以无缝对接官方 AXI IP 核,因为遵循相同的协议规则;
- 优先实现AXI4-Lite和AXI4-Stream,这两个是手动编写的高频场景,实现难度极低。
✅ 高频手动实现案例(附核心 Verilog 代码,直接可用)
案例 1:手动实现「AXI4-Lite 从机」(最易,入门必备)
需求:FPGA 内部实现一个简单的 AXI4-Lite 从机,包含 2 个 32 位寄存器(地址 0x00:控制寄存器,地址 0x04:状态寄存器),主机可通过 AXI4-Lite 读写这两个寄存器。
核心逻辑:AXI4-Lite 只支持单拍传输,只需处理 AWADDR/AWVALID/AWREADY(写地址)、WVALID/WREADY/WDATA(写数据)、BVALID/BREADY/BRESP(写响应)、ARADDR/ARVALID/ARREADY(读地址)、RVALID/RREADY/RDATA/RRESP(读数据)的握手即可,无突发逻辑。
核心 Verilog 代码框架(关键逻辑,精简版)
// AXI4-Lite 从机核心逻辑 (32 位地址/数据)
module axi4_lite_slave(
input clk,
input rst_n,
// 写地址通道
input [31:0] s_axi_awaddr,
input s_axi_awvalid,
output reg s_axi_awready,
// 写数据通道
input [31:0] s_axi_wdata,
input s_axi_wvalid,
output reg s_axi_wready,
// 写响应通道
output reg [1:0] s_axi_bresp,
output reg s_axi_bvalid,
input s_axi_bready,
// 读地址通道
input [31:0] s_axi_araddr,
input s_axi_arvalid,
output reg s_axi_arready,
// 读数据通道
output reg [31:0] s_axi_rdata,
output reg [1:0] s_axi_rresp,
output reg s_axi_rvalid,
input s_axi_rready
);
// 自定义寄存器:地址 0x00=控制寄存器,0x04=状态寄存器
reg [31:0] ctrl_reg;
reg [31:0] stat_reg;
// 写事务:地址握手 + 数据握手 + 响应
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
s_axi_awready <= 1'b0;
s_axi_wready <= 1'b0;
s_axi_bvalid <= 1'b0;
ctrl_reg <= 32'd0;
end
else
begin
// 写地址就绪:当地址有效且数据未就绪时
if(s_axi_awvalid && !s_axi_awready)
begin
s_axi_awready <= 1'b1;
end
// 写数据就绪:当地址已就绪且数据有效时
if(s_axi_wvalid && !s_axi_wready && s_axi_awready)
begin
s_axi_wready <= 1'b1;
// 根据地址写寄存器
case(s_axi_awaddr)
32'h00000000: ctrl_reg <= s_axi_wdata;
32'h00000004: stat_reg <= s_axi_wdata;
default: ;
endcase
// 写响应有效
s_axi_bvalid <= 1'b1;
s_axi_bresp <= 2'b00; // 响应:成功
end
// 响应握手完成,清零就绪和有效信号
if(s_axi_bvalid && s_axi_bready)
begin
s_axi_awready <= 1'b0;
s_axi_wready <= 1'b0;
s_axi_bvalid <= 1'b0;
end
end
end
// 读事务:地址握手 + 数据握手
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
s_axi_arready <= 1'b0;
s_axi_rvalid <= 1'b0;
s_axi_rdata <= 32'd0;
end
else
begin
// 读地址就绪:当地址有效且数据未就绪时
if(s_axi_arvalid && !s_axi_arready)
begin
s_axi_arready <= 1'b1;
// 根据地址读寄存器
case(s_axi_araddr)
32'h00000000: s_axi_rdata <= ctrl_reg;
32'h00000004: s_axi_rdata <= stat_reg;
default: s_axi_rdata <= 32'h00000000;
endcase
// 读数据有效
s_axi_rvalid <= 1'b1;
s_axi_rresp <= 2'b00; // 响应:成功
end
// 读数据握手完成,清零就绪和有效信号
if(s_axi_rvalid && s_axi_rready)
begin
s_axi_arready <= 1'b0;
s_axi_rvalid <= 1'b0;
end
end
end
endmodule
案例 2:手动实现「AXI4-Stream 数据转发」(FPGA 第一高频,最简最实用)
需求:将一路 AXI4-Stream 输入数据流,无修改转发到一路输出数据流,核心是实现 TVALID-TREADY 握手和 TDATA 数据传输,可选 TLAST 帧结束标记。
核心特点:无地址、无控制,只有纯数据流,代码极简,是 FPGA 中最常写的逻辑之一。
核心 Verilog 代码(直接可用,完整版)
// AXI4-Stream 数据流转发模块 (64 位数据位宽,带 TLAST 帧结束)
module axi4_stream_forward(
input clk,
input rst_n,
// AXI4-Stream 输入接口
input [63:0] s_axis_tdata,
input s_axis_tvalid,
output reg s_axis_tready,
input s_axis_tlast,
// AXI4-Stream 输出接口
output reg [63:0] m_axis_tdata,
output reg m_axis_tvalid,
input m_axis_tready,
output reg m_axis_tlast
);
// 核心逻辑:READY-VALID 握手 + 数据透传
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
s_axis_tready <= 1'b0;
m_axis_tvalid <= 1'b0;
m_axis_tdata <= 64'd0;
m_axis_tlast <= 1'b0;
end
else
begin
// 接收就绪:当输出端就绪时,才允许输入端传输
s_axis_tready <= m_axis_tready;
// 输出有效:当输入端有效且接收就绪时
if(s_axis_tvalid && s_axis_tready)
begin
m_axis_tvalid <= 1'b1;
m_axis_tdata <= s_axis_tdata;
m_axis_tlast <= s_axis_tlast;
end
else
begin
m_axis_tvalid <= 1'b0;
end
end
end
endmodule
2.4 FPGA 实现 AXI 总线的关键设计要点(避坑指南,必看)
- 严格遵循 READY-VALID 握手规则:这是 AXI 协议的基石,永远不要省略 READY 信号,否则会导致数据丢失、总线死锁;VALID 由发送方控制,READY 由接收方控制,不要做反向赋值;
- 时钟域同步处理:AXI4-Lite/AXI4 一般为同步时钟,AXI4-Stream 常跨时钟域(如 ADC 的采集时钟和 FPGA 的处理时钟),必须用官方的 AXI 同步 IP 核(AXI Synchronizer),不要自己写跨时钟域逻辑,避免亚稳态;
- 位宽匹配与转换:不同 AXI 模块的位宽可能不同(如 32 位转 64 位),调用官方的 AXI Width Converter IP 核,一键完成位宽转换,无需手写;
- AXI4 突发传输地址对齐:AXI4 的突发传输要求地址必须对齐到数据位宽(如 32 位数据,地址必须是 4 的倍数),否则会触发错误响应;
- AXI4-Stream 的 TLAST 信号必做:对于分包的数据流(如以太网包、视频帧),
TLAST 是唯一的帧结束标记,必须正确赋值,否则会导致数据帧错乱;
- 优先级使用官方 IP:手动编写仅用于定制化场景,官方 IP 的稳定性和性能远高于手写逻辑,不要盲目手写 AXI 协议。
三、总结
✅ AXI 总线核心总结
- AXI 是 ARM 的高性能片上总线,核心是5 个独立单向通道+READY-VALID 握手,主流版本为 AXI4;
- FPGA 开发中只用到三个子集:
AXI4-Lite(低速寄存器配置)、AXI4(高速大数据块传输)、AXI4-Stream(无地址高速流式传输);
- AXI4-Stream 是 FPGA 的第一高频接口,无地址、纯数据流,适配所有连续高速数据场景。
✅ FPGA 实现 AXI 总线核心总结
- 新手首选(90% 场景):调用 FPGA 官方 AXI IP 核,图形化互联,零手写协议逻辑,拼积木式开发,高效稳定;
- 进阶需求(10% 场景):手动编写 AXI 接口适配层,仅实现握手和简单数据映射,无需写完整协议栈;
- 核心高频手写逻辑:AXI4-Lite 从机(寄存器读写)、AXI4-Stream 数据转发(透传/位宽转换/帧处理);
AXI 总线是 FPGA 开发的「必修课」,也是 FPGA 从入门到进阶的核心分水岭,掌握 AXI 总线后,就能轻松驾驭 FPGA 的高速数据交互、DDR 读写、DMA 传输等核心场景,也是做异构计算(FPGA+ARM)的必备技能。
微信扫一扫,关注极客日志
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown 转 HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
- HTML 转 Markdown
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
- JSON 压缩
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
- JSON美化和格式化
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online