[FPGA基础] AXI Lite篇

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

  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烧写
    • 下载器无限扩展
    • 配备专属程序固化软件,一键烧写,能大大减小程序固化时间!
### FPGA 开发AXI-Lite 接口的使用 #### 特性和适用范围 AXI-Lite 协议由于其简单、低资源占用和低延迟的优点,非常适合用作从设备的接口协议。这种特性使得 AXI-Lite 在需要简单、快速和可靠访问的应用场景中表现出色,特别是对于控制和状态寄存器的访问[^2]。 #### 协议分类及其特点 AXI 协议主要分为三类:AXI-LiteAXI-Full 和 AXI-Stream。前两者支持基于地址的数据访问,而后者则适用于无地址的数据流传输模式。具体来说: - **AXI-Lite**: 主要用于 IP 核初始化及小批量数据传输; - **AXI-Full**: 针对高性能需求的大规模数据交换设计; - **AXI-Stream**: 数据通过连续流动的方式传递给接收方,不涉及具体的内存位置指定[^1]。 #### 实现机制概述 为了在 FPGA 中实现 AXI-Lite 接口的功能,通常会采用 `write_run` 和 `read_run` 来表示当前操作的状态,并据此管理握手信号以及 FIFO 的读写使能等逻辑。需要注意的一点是尽管 AXI 总线允许并发执行读取与写入动作,但从机内部的存储单元在同一时刻只能处理单一方向的操作;因此建议引入一定的仲裁策略以优化整体性能,例如确保只有当写地址队列为空时才启动新的读请求[^3]。 ```verilog // Verilog 伪代码展示如何创建简单的 AXI-Lite 接口模块 module axi_lite_interface ( input wire clk, input wire rst_n, // Write address channel signals (AW) input wire [ADDR_WIDTH-1:0] awaddr, // Address write bus input wire awvalid, // Write address valid signal output reg awready, // Ready to accept write address ... ); always @(posedge clk or negedge rst_n) begin : proc_write_addr_channel if (!rst_n) begin awready <= 0; end else begin // 握手过程简化示意 if (awvalid && !awready) begin // 处理写地址... awready <= 1'b1; // 表明已准备好接受下一个地址 end else begin awready <= 1'b0; end end end ... endmodule ``` 此段Verilog代码展示了构建一个基础版本AXI Lite接口所需的部分组件之一—写地址通道(`AW`)的具体实现方式。实际应用中还需要考虑其他几个方面如数据宽度匹配、错误检测等功能完善整个通信链路的设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值