Quick Start
- 准备环境:安装 Vivado 2022.2 及以上版本,确认仿真器(Xsim 或 ModelSim)可用。
- 创建工程:新建 RTL 工程,选择器件(如 xc7a35tcsg324-1,Artix-7 系列)。
- 编写 AXI4-Lite Slave 模块:使用 Verilog 实现一个支持 4 个 32 位寄存器的从机接口,地址映射为 0x00–0x0C。
- 编写 Testbench:模拟 Master 发起写/读事务,检查寄存器写入与读取正确性。
- 运行仿真:执行行为仿真,观察波形中 AW/AR 通道握手与 W/R 通道数据是否对齐。
- 综合与实现:运行综合(Synthesis)与实现(Implementation),检查时序报告无 setup/hold 违例。
- 上板验证:将设计下载至 FPGA 开发板,通过 ChipScope 或 ILA 抓取总线信号,验证读写操作。
- 验收:所有寄存器可正确写入/读取,总线握手时序符合 AXI4-Lite 规范。
前置条件与环境
| 项目 | 推荐值 | 说明 | 替代方案 |
|---|---|---|---|
| FPGA 器件 | Xilinx Artix-7 (xc7a35tcsg324-1) | 主流低成本器件,适合学习 AXI4-Lite | Kintex-7 / Zynq-7000 |
| EDA 工具 | Vivado 2022.2 | 支持 AXI4 协议 IP 集成与仿真 | Vivado 2020.1+ / ISE(不推荐) |
| 仿真器 | Vivado Xsim | 内置于 Vivado,免配置 | ModelSim / Questa / VCS |
| 时钟 | 50 MHz 系统时钟 | AXI4-Lite 工作在低频率,时序宽松 | 100 MHz 以内均可 |
| 复位 | 低电平异步复位 | 标准 FPGA 复位方式 | 高电平复位(需调整) |
| 接口依赖 | 无外部 IP | 纯 RTL 实现,不依赖 Xilinx AXI VIP | 可配合 AXI Verification IP(仿真用) |
| 约束文件 | XDC 约束(时钟周期、输入/输出延迟) | 保证时序收敛 | 自动推导(不推荐) |
目标与验收标准
- 功能点:支持 AXI4-Lite 写地址通道(AW)、写数据通道(W)、写响应通道(B)、读地址通道(AR)、读数据通道(R)全部握手。支持 4 个 32 位寄存器(地址 0x00, 0x04, 0x08, 0x0C)的读写。
- 性能指标:在 50 MHz 时钟下,单次写/读事务延迟不超过 10 个时钟周期(从 AWVALID 到 BVALID 或 RVALID)。
- 资源消耗:LUT + FF 合计不超过 200 个(示例,以实际综合为准)。
- 验收方式:仿真波形显示所有通道握手信号符合 AXI4-Lite 规范(VALID/READY 握手机制);上板后通过 ILA 抓取,写入值可正确读出。
- 关键波形特征:写事务中,AWVALID 与 WVALID 在 AWREADY 与 WREADY 有效后保持,直到 BVALID 返回;读事务中,ARVALID 在 ARREADY 后撤销,RVALID 在 RREADY 后返回数据。
实施步骤
工程结构
- 创建 Vivado 工程,添加以下源文件:
axi4_lite_slave.v(顶层从机模块)、tb_axi4_lite.v(Testbench)。 - 模块端口列表:
input clk, rst_n;input [31:0] s_axi_awaddr, input s_axi_awvalid, output s_axi_awready;input [31:0] s_axi_wdata, input [3:0] s_axi_wstrb, input s_axi_wvalid, output s_axi_wready;output [1:0] s_axi_bresp, output s_axi_bvalid, input s_axi_bready;input [31:0] s_axi_araddr, input s_axi_arvalid, output s_axi_arready;output [31:0] s_axi_rdata, output [1:0] s_axi_rresp, output s_axi_rvalid, input s_axi_rready。 - 常见坑:端口命名必须与 AXI 规范一致(前缀
s_axi_),否则与 IP 集成时容易混淆。
关键模块:AXI4-Lite Slave 实现
module axi4_lite_slave #(
parameter ADDR_WIDTH = 4, // 地址宽度,仅低 4 位有效
parameter DATA_WIDTH = 32
)(
input wire clk,
input wire rst_n,
// 写地址通道
input wire [ADDR_WIDTH-1:0] s_axi_awaddr,
input wire s_axi_awvalid,
output reg s_axi_awready,
// 写数据通道
input wire [DATA_WIDTH-1:0] s_axi_wdata,
input wire [DATA_WIDTH/8-1:0] s_axi_wstrb,
input wire s_axi_wvalid,
output reg s_axi_wready,
// 写响应通道
output reg [1:0] s_axi_bresp,
output reg s_axi_bvalid,
input wire s_axi_bready,
// 读地址通道
input wire [ADDR_WIDTH-1:0] s_axi_araddr,
input wire s_axi_arvalid,
output reg s_axi_arready,
// 读数据通道
output reg [DATA_WIDTH-1:0] s_axi_rdata,
output reg [1:0] s_axi_rresp,
output reg s_axi_rvalid,
input wire s_axi_rready
);
// 内部寄存器
reg [DATA_WIDTH-1:0] reg0, reg1, reg2, reg3;
// 写事务 FSM 状态
localparam IDLE = 2'd0, WR_ADDR = 2'd1, WR_DATA = 2'd2, WR_RESP = 2'd3;
reg [1:0] wstate, wnext;
// 读事务 FSM 状态
localparam RD_IDLE = 2'd0, RD_ADDR = 2'd1, RD_DATA = 2'd2;
reg [1:0] rstate, rnext;
// 写地址通道:简单组合逻辑,直接 ready
always @(*) begin
s_axi_awready = (wstate == IDLE) ? 1'b1 : 1'b0;
end
// 写数据通道:组合逻辑
always @(*) begin
s_axi_wready = (wstate == IDLE) ? 1'b1 : 1'b0;
end
// 写状态机
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
wstate逐行说明
- 第 1 行:模块声明开始,定义参数化模块名
axi4_lite_slave。 - 第 2 行:定义参数
ADDR_WIDTH,值为 4,表示地址宽度仅低 4 位有效。 - 第 3 行:定义参数
DATA_WIDTH,值为 32,表示数据总线宽度。 - 第 4 行:模块端口列表开始。
- 第 5 行:输入时钟信号
clk。 - 第 6 行:输入异步复位信号
rst_n,低电平有效。 - 第 7 行:注释“写地址通道”。
- 第 8 行:输入写地址
s_axi_awaddr,宽度为ADDR_WIDTH。 - 第 9 行:输入写地址有效信号
s_axi_awvalid。 - 第 10 行:输出写地址就绪信号
s_axi_awready,类型为 reg。 - 第 11 行:注释“写数据通道”。
- 第 12 行:输入写数据
s_axi_wdata,宽度为DATA_WIDTH。 - 第 13 行:输入写数据选通信号
s_axi_wstrb,宽度为DATA_WIDTH/8(即 4 位)。 - 第 14 行:输入写数据有效信号
s_axi_wvalid。 - 第 15 行:输出写数据就绪信号
s_axi_wready,类型为 reg。 - 第 16 行:注释“写响应通道”。
- 第 17 行:输出写响应信号
s_axi_bresp,宽度 2 位。 - 第 18 行:输出写响应有效信号
s_axi_bvalid,类型为 reg。 - 第 19 行:输入写响应就绪信号
s_axi_bready。 - 第 20 行:注释“读地址通道”。
- 第 21 行:输入读地址
s_axi_araddr,宽度为ADDR_WIDTH。 - 第 22 行:输入读地址有效信号
s_axi_arvalid。 - 第 23 行:输出读地址就绪信号
s_axi_arready,类型为 reg。 - 第 24 行:注释“读数据通道”。
- 第 25 行:输出读数据
s_axi_rdata,宽度为DATA_WIDTH。 - 第 26 行:输出读响应信号
s_axi_rresp,宽度 2 位。 - 第 27 行:输出读数据有效信号
s_axi_rvalid,类型为 reg。 - 第 28 行:输入读数据就绪信号
s_axi_rready。 - 第 29 行:模块端口列表结束。
- 第 30 行:注释“内部寄存器”。
- 第 31 行:声明 4 个 32 位寄存器
reg0、reg1、reg2、reg3。 - 第 32 行:注释“写事务 FSM 状态”。
- 第 33 行:定义写状态机的四个状态:IDLE、WR_ADDR、WR_DATA、WR_RESP,编码为 2 位。
- 第 34 行:声明写状态寄存器和下一状态变量
wstate、wnext。 - 第 35 行:注释“读事务 FSM 状态”。
- 第 36 行:定义读状态机的三个状态:RD_IDLE、RD_ADDR、RD_DATA,编码为 2 位。
- 第 37 行:声明读状态寄存器和下一状态变量
rstate、rnext。 - 第 38 行:空行,用于分隔。
- 第 39 行:注释“写地址通道:简单组合逻辑,直接 ready”。
- 第 40 行:组合逻辑块开始。
- 第 41 行:当写状态机处于 IDLE 状态时,
s_axi_awready为 1,否则为 0。 - 第 42 行:组合逻辑块结束。
- 第 43 行:空行。
- 第 44 行:注释“写数据通道:组合逻辑”。
- 第 45 行:组合逻辑块开始。
- 第 46 行:当写状态机处于 IDLE 状态时,
s_axi_wready为 1,否则为 0。 - 第 47 行:组合逻辑块结束。
- 第 48 行:空行。
- 第 49 行:注释“写状态机”。
- 第 50 行:时序逻辑块开始,敏感列表为时钟上升沿或复位下降沿。
- 第 51 行:如果复位有效(
rst_n为低),则wstate赋值为 IDLE。
验证结果
- 仿真波形应显示:写事务中,AWVALID 与 WVALID 在 AWREADY 与 WREADY 有效后保持,直到 BVALID 返回;读事务中,ARVALID 在 ARREADY 后撤销,RVALID 在 RREADY 后返回数据。
- 上板后通过 ILA 抓取,写入值可正确读出。
排障指南
- 握手失败:检查 VALID 与 READY 信号是否按照 AXI 规范(两者同时有效时传输发生)连接。常见错误是 READY 信号未在 VALID 有效前或同时拉高。
- 地址译码错误:确保地址映射仅对 0x00–0x0C 响应,其他地址应返回 SLVERR(
s_axi_bresp = 2'b10)。 - 时序违例:若综合后出现 setup/hold 违例,检查时钟约束是否正确,或降低时钟频率。
扩展建议
- 增加寄存器数量:通过参数化
NUM_REGS实现可配置的寄存器阵列。 - 支持突发传输:升级为 AXI4-Full 接口,增加 AWLEN、ARLEN 等信号。
- 集成到 SoC:将本模块作为 AXI 从机,连接到 Zynq PS 或 MicroBlaze 的 AXI 总线。
参考与附录
- ARM AMBA AXI4-Lite 协议规范 (ARM IHI 0022E)
- Xilinx Vivado 用户指南:使用 AXI 接口 (UG1037)
- 附录:完整代码文件
axi4_lite_slave.v和tb_axi4_lite.v可从项目仓库获取。

评论 0