[FPGA基础] AXI Lite篇

Xilinx FPGA AXI4-Lite 使用文档

🎯✨推荐使用FPGA烧写软件(支持国产flash,自动烧写,无需选择型号)
链接地址

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 中:

  1. 打开 IP Catalog,搜索“AXI”。
  2. 选择所需 IP 核,配置参数(如数据宽度、地址范围)。
  3. 生成 IP 核并集成到 Block Design 中。

4.3 自定义 AXI4-Lite IP 设计

若现有 IP 核无法满足需求,可通过以下方式开发自定义 AXI4-Lite IP:

  1. Vivado IP Packager

    • 创建新 IP,定义 AXI4-Lite 主或从接口。
    • 配置接口参数(如地址宽度、数据宽度)。
    • 打包为可复用 IP 核。
  2. Verilog/VHDL 实现

    • 编写 AXI4-Lite 主或从设备逻辑,遵循 VALID/READY 握手协议。
    • 实现寄存器读写逻辑,处理 AWADDR/ARADDR 和 WSTRB。
  3. 验证

    • 使用 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. 注意事项

  1. 时钟与复位

    • 确保所有信号与 ACLK 同步。
    • 使用 ARESETN 初始化信号状态。
  2. 握手协议

    • VALID 信号需在 READY 之前或同时置位,且保持直到握手完成。
    • 避免死锁,确保 READY 信号及时响应。
  3. 地址与数据

    • 确保 AWADDR/ARADDR 符合地址映射规则(如4字节对齐)。
    • 使用 WSTRB 正确指示有效字节,防止数据覆盖。
  4. 性能优化

    • 尽量合并寄存器访问,减少控制开销。
    • 使用 AXI Interconnect 优化多外设连接。
  5. 调试与验证

    • 使用 AXI VIP 验证协议合规性。
    • 通过 ILA 检查握手时序、地址映射和响应状态。

7. 设计工具推荐

  • SZ901
    SZ901 是一款基于XVC协议的FPGA网络下载器。
    • 最高支持53M
    • 支持4路JTAG独立使用
    • 支持端口合并
    • 支持国产FLASH烧写
    • 下载器无限扩展
    • 配备专属程序固化软件,一键烧写,能大大减小程序固化时间!
### AXI4-Lite 协议概述 AXI4-Lite 是一种轻量级的 AMBA (Advanced Microcontroller Bus Architecture) 协议,主要用于低带宽场景下的简单外设访问。它与完整的 AXI4 协议相比简化了许多功能特性[^1]。 #### 主要特点 - **无突发支持**:AXI4-Lite 不支持数据突发传输,这意味着每次传输仅限于单次地址和数据交换。 - **固定传输宽度**:所有的数据传输必须为固定的 32 位或 64 位宽度,并且无法更改配置[^2]。 - **不可缓冲性**:由于设计上的精简,AXI4-Lite 的事务不允许被缓存,也不支持独占式传输模式。 #### 使用方法 在实现 AXI4-Lite 接口时,通常需要定义主设备(Master)和从设备(Slave)。以下是基本的设计流程: 1. 定义接口信号:包括地址总线、数据总线以及控制信号(如 `AWVALID`、`WVALID` 和 `BREADY` 等用于写操作;`ARVALID` 和 `RREADY` 等用于读操作)。 2. 实现写操作逻辑:通过写地址通道 (`AW`) 发送目标地址,随后通过写数据通道 (`W`) 提供实际的数据值。完成之后,接收来自从设备的状态响应 (`BRESP`) 表明此次写入成功与否。 ```verilog always @(posedge clk or negedge resetn) begin if (!resetn) begin awvalid <= 1'b0; wvalid <= 1'b0; end else begin awvalid <= addr_valid; // 地址有效标志 wvalid <= data_valid; // 数据有效标志 end end ``` 3. 实现读操作逻辑:发送读请求到读地址通道 (`AR`) 并等待返回的有效数据(`RDATA`) 及其状态[`RRESP`]。 ```verilog always @(posedge clk or negedge resetn) begin if (!resetn) begin arvalid <= 1'b0; end else begin arvalid <= read_request; // 设置读取请求标志 end end ``` 以上代码片段展示了如何利用 Verilog HDL 来构建简单的 AXI4-Lite 写/读控制器部分电路结构。 #### 测试验证 为了确保 AXI4-Lite 设计的功能正确性和性能指标满足需求,可以采用 Testbench 方法进行仿真测试。这涉及创建激励源来模拟真实世界中的各种输入条件并观察输出反应是否符合预期标准[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值