Xilinx FPGA AXI4-Lite 使用文档
1. 概述
AXI4-Lite 是 ARM 公司 AMBA 协议中的一种轻量级存储器映射互连协议,专为低速、简单外设控制设计,广泛应用于 Xilinx FPGA 中,用于处理器与外设(如寄存器、GPIO)之间的通信。本文档详细介绍 AXI4-Lite 协议的使用,涵盖协议概述、信号描述、设计流程、Vivado 相关 IP 核及示例代码,仅聚焦 AXI4-Lite。
2. AXI4-Lite 协议简介
AXI4-Lite 是 AXI4 协议的简化版本,适用于控制寄存器配置、低带宽数据传输等场景。它不支持突发传输,仅支持单次数据传输,简化了设计复杂性。
2.1 AXI4-Lite 关键特性
- 独立通道:写地址、写数据、写响应、读地址、读数据五个通道独立操作,提升并发性。
- 单次传输:每次传输固定为单个数据字(通常32位或64位)。
- 简单握手:基于 VALID/READY 握手协议,易于实现。
- 低资源占用:相比 AXI4,逻辑资源需求更低。
- 响应机制:支持 OKAY、SLVERR、DECERR 等响应状态。
3. AXI4-Lite 接口信号描述
以下为 AXI4-Lite 协议的主要信号描述:
信号名 | 方向 | 描述 |
---|---|---|
ACLK | 输入 | 全局时钟信号,所有信号同步于此。 |
ARESETN | 输入 | 全局复位信号,低电平有效。 |
写地址通道 | ||
AWADDR | 主->从 | 写地址,指定写操作的目标地址。 |
AWVALID | 主->从 | 写地址有效信号,表示地址数据有效。 |
AWREADY | 从->主 | 写地址就绪信号,表示从设备准备好接收地址。 |
写数据通道 | ||
WDATA | 主->从 | 写数据。 |
WSTRB | 主->从 | 写数据选通信号,指示哪些字节有效(每位对应一个字节)。 |
WVALID | 主->从 | 写数据有效信号,表示写数据有效。 |
WREADY | 从->主 | 写数据就绪信号,表示从设备准备好接收数据。 |
写响应通道 | ||
BRESP | 从->主 | 写响应状态:0(OKAY)、2(SLVERR)、3(DECERR)。 |
BVALID | 从->主 | 写响应有效信号,表示响应有效。 |
BREADY | 主->从 | 写响应就绪信号,表示主设备准备好接收响应。 |
读地址通道 | ||
ARADDR | 主->从 | 读地址,指定读操作的目标地址。 |
ARVALID | 主->从 | 读地址有效信号,表示地址数据有效。 |
ARREADY | 从->主 | 读地址就绪信号,表示从设备准备好接收地址。 |
读数据通道 | ||
RDATA | 从->主 | 读数据。 |
RRESP | 从->主 | 读响应状态:0(OKAY)、2(SLVERR)、3(DECERR)。 |
RVALID | 从->主 | 读数据有效信号,表示读数据有效。 |
RREADY | 主->从 | 读数据就绪信号,表示主设备准备好接收数据。 |
4. Xilinx FPGA 中的 AXI4-Lite 设计流程
在 Xilinx FPGA 中使用 AXI4-Lite 协议通常包括以下步骤:
4.1 需求分析
- 确定数据宽度(通常32位或64位)。
- 定义寄存器映射,规划地址空间(如4KB对齐)。
- 确定主从角色(处理器通常为 Master,外设为 Slave)。
4.2 使用 Vivado IP 核
Vivado 提供多个 AXI4-Lite 相关 IP 核,简化设计流程。以下为常用 IP 核:
-
AXI Interconnect (PG059):
- 功能:连接多个 AXI4-Lite 主从设备,支持时钟域转换和地址映射。
- 配置:支持1到16个主/从接口,数据宽度32/64位。
- 用途:构建多外设控制系统,如 Zynq SoC 的 PS 到 PL 通信。
-
AXI GPIO (PG144):
- 功能:实现通用输入输出接口,通过 AXI4-Lite 控制。
- 配置:支持单/双通道,GPIO 位宽1到32位。
- 用途:控制 LED、开关或其他简单外设。
-
AXI Timer (PG079):
- 功能:提供可编程定时器,通过 AXI4-Lite 配置。
- 配置:支持计数器宽度、触发模式等。
- 用途:定时任务或 PWM 生成。
-
AXI UART Lite (PG142):
- 功能:实现轻量级 UART 通信,通过 AXI4-Lite 配置。
- 配置:支持波特率、数据位、奇偶校验等。
- 用途:串口通信,如调试接口。
-
AXI Verification IP (PG267):
- 功能:提供 AXI4-Lite 协议仿真验证工具,支持主/从/监控模式。
- 配置:可模拟 AXI4-Lite 主从设备,检查协议合规性。
- 用途:验证自定义 AXI4-Lite IP 的正确性。
在 Vivado 中:
- 打开 IP Catalog,搜索“AXI”。
- 选择所需 IP 核,配置参数(如数据宽度、地址范围)。
- 生成 IP 核并集成到 Block Design 中。
4.3 自定义 AXI4-Lite IP 设计
若现有 IP 核无法满足需求,可通过以下方式开发自定义 AXI4-Lite IP:
-
Vivado IP Packager:
- 创建新 IP,定义 AXI4-Lite 主或从接口。
- 配置接口参数(如地址宽度、数据宽度)。
- 打包为可复用 IP 核。
-
Verilog/VHDL 实现:
- 编写 AXI4-Lite 主或从设备逻辑,遵循 VALID/READY 握手协议。
- 实现寄存器读写逻辑,处理 AWADDR/ARADDR 和 WSTRB。
-
验证:
- 使用 AXI Verification IP(AXI VIP)进行仿真。
- 检查协议时序、响应状态和数据完整性。
4.4 时序设计
- 所有信号需与 ACLK 同步。
- 使用 ARESETN 进行复位初始化,确保复位后信号处于已知状态。
- 遵循 VALID/READY 握手规则:VALID 信号置位后需保持,直到 READY 置位完成握手。
4.5 调试
- 使用 Vivado ILA(Integrated Logic Analyzer)捕获 AXI4-Lite 信号。
- 检查 AWVALID/AWREADY、WVALID/WREADY 等握手信号。
- 验证地址映射、WSTRB 字节选通和响应状态(BRESP/RRESP)。
5. 示例:AXI4-Lite 从设备设计
以下为一个简单的 AXI4-Lite 从设备 Verilog 代码,支持4个32位寄存器的读写操作。
module axi4_lite_slave #(
parameter C_S_AXI_ADDR_WIDTH = 4,
parameter C_S_AXI_DATA_WIDTH = 32
) (
// AXI4-Lite 接口信号
input wire s_axi_aclk,
input wire s_axi_aresetn,
// 写地址通道
input wire [C_S_AXI_ADDR_WIDTH-1:0] s_axi_awaddr,
input wire s_axi_awvalid,
output wire s_axi_awready,
// 写数据通道
input wire [C_S_AXI_DATA_WIDTH-1:0] s_axi_wdata,
input wire [C_S_AXI_DATA_WIDTH/8-1:0] s_axi_wstrb,
input wire s_axi_wvalid,
output wire s_axi_wready,
// 写响应通道
output wire [1:0] s_axi_bresp,
output wire s_axi_bvalid,
input wire s_axi_bready,
// 读地址通道
input wire [C_S_AXI_ADDR_WIDTH-1:0] s_axi_araddr,
input wire s_axi_arvalid,
output wire s_axi_arready,
// 读数据通道
output wire [C_S_AXI_DATA_WIDTH-1:0] s_axi_rdata,
output wire [1:0] s_axi_rresp,
output wire s_axi_rvalid,
input wire s_axi_rready
);
// 寄存器定义
reg [C_S_AXI_DATA_WIDTH-1:0] reg_data [0:2**C_S_AXI_ADDR_WIDTH-1];
reg awready;
reg wready;
reg [1:0] bresp;
reg bvalid;
reg arready;
reg [C_S_AXI_DATA_WIDTH-1:0] rdata;
reg [1:0] rresp;
reg rvalid;
// 写地址通道
assign s_axi_awready = awready;
always @(posedge s_axi_aclk or negedge s_axi_aresetn) begin
if (!s_axi_aresetn) begin
awready <= 1'b0;
end else begin
if (s_axi_awvalid && !awready) begin
awready <= 1'b1;
end else begin
awready <= 1'b0;
end
end
end
// 写数据通道
assign s_axi_wready = wready;
always @(posedge s_axi_aclk or negedge s_axi_aresetn) begin
if (!s_axi_aresetn) begin
wready <= 1'b0;
end else begin
if (s_axi_wvalid && !wready) begin
wready <= 1'b1;
end else begin
wready <= 1'b0;
end
end
end
// 写操作
always @(posedge s_axi_aclk or negedge s_axi_aresetn) begin
if (!s_axi_aresetn) begin
reg_data[0] <= 0;
reg_data[1] <= 0;
reg_data[2] <= 0;
reg_data[3] <= 0;
end else if (awready && s_axi_awvalid && wready && s_axi_wvalid) begin
if (s_axi_wstrb[0]) reg_data[s_axi_awaddr[3:2]][7:0] <= s_axi_wdata[7:0];
if (s_axi_wstrb[1]) reg_data[s_axi_awaddr[3:2]][15:8] <= s_axi_wdata[15:8];
if (s_axi_wstrb[2]) reg_data[s_axi_awaddr[3:2]][23:16] <= s_axi_wdata[23:16];
if (s_axi_wstrb[3]) reg_data[s_axi_awaddr[3:2]][31:24] <= s_axi_wdata[31:24];
end
end
// 写响应通道
assign s_axi_bresp = bresp;
assign s_axi_bvalid = bvalid;
always @(posedge s_axi_aclk or negedge s_axi_aresetn) begin
if (!s_axi_aresetn) begin
bvalid <= 1'b0;
bresp <= 2'b00; // OKAY
end else begin
if (awready && s_axi_awvalid && wready && s_axi_wvalid && !bvalid) begin
bvalid <= 1'b1;
bresp <= 2'b00;
end else if (s_axi_bready && bvalid) begin
bvalid <= 1'b0;
end
end
end
// 读地址通道
assign s_axi_arready = arready;
always @(posedge s_axi_aclk or negedge s_axi_aresetn) begin
if (!s_axi_aresetn) begin
arready <= 1'b0;
end else begin
if (s_axi_arvalid && !arready) begin
arready <= 1'b1;
end else begin
arready <= 1'b0;
end
end
end
// 读数据通道
assign s_axi_rdata = rdata;
assign s_axi_rresp = rresp;
assign s_axi_rvalid = rvalid;
always @(posedge s_axi_aclk or negedge s_axi_aresetn) begin
if (!s_axi_aresetn) begin
rvalid <= 1'b0;
rresp <= 2'b00; // OKAY
rdata <= 0;
end else begin
if (arready && s_axi_arvalid && !rvalid) begin
rvalid <= 1'b1;
rresp <= 2'b00;
rdata <= reg_data[s_axi_araddr[3:2]];
end else if (rvalid && s_axi_rready) begin
rvalid <= 1'b0;
end
end
end
endmodule
5.1 示例说明
- 该模块实现了一个 AXI4-Lite 从设备,支持4个32位寄存器的读写。
- 地址宽度4位,数据宽度32位,支持字节选通(WSTRB)。
- 遵循 VALID/READY 握手协议,响应状态为 OKAY。
- 可通过 Vivado IP Packager 打包为 IP 核,集成到系统中。
6. 注意事项
-
时钟与复位:
- 确保所有信号与 ACLK 同步。
- 使用 ARESETN 初始化信号状态。
-
握手协议:
- VALID 信号需在 READY 之前或同时置位,且保持直到握手完成。
- 避免死锁,确保 READY 信号及时响应。
-
地址与数据:
- 确保 AWADDR/ARADDR 符合地址映射规则(如4字节对齐)。
- 使用 WSTRB 正确指示有效字节,防止数据覆盖。
-
性能优化:
- 尽量合并寄存器访问,减少控制开销。
- 使用 AXI Interconnect 优化多外设连接。
-
调试与验证:
- 使用 AXI VIP 验证协议合规性。
- 通过 ILA 检查握手时序、地址映射和响应状态。
7. 设计工具推荐
- SZ901:
SZ901 是一款基于XVC协议的FPGA网络下载器。- 最高支持53M
- 支持4路JTAG独立使用
- 支持端口合并
- 支持国产FLASH烧写
- 下载器无限扩展
- 配备专属程序固化软件,一键烧写,能大大减小程序固化时间!