基于Verilog的AXI4-Lite从机接口设计与验证指南

FPGA小白
文章2026-07-10
24 0 0 0

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-LiteKintex-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 可从项目仓库获取。
分类
技术分享
标签
AXI4-LiteVerilog从机接口
浏览 24收藏 0赞 0评论 0
分享:

相关推荐

同频道 · 相近分类

暂无相关推荐

作者

FPGA小白查看主页

同分类阅读

文章

延伸阅读与实操

  • 文章 + 课程联动深度文章常对应体系课章节,可一键选课。
  • 学习产出可参考笔记与作业案例在学习产出广场持续更新。

探索全站