[FPGA基础] DMA

Xilinx FPGA AXI DMA 使用文档

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

1. 概述

AXI DMA(Direct Memory Access)是 Xilinx FPGA 中用于高效数据搬运的 IP 核,基于 AXI4 协议,支持存储器映射(AXI4)和流式(AXI4-Stream)数据传输。AXI DMA 广泛应用于处理器与外设间的高速数据传输,如视频处理、网络数据包传输等。本文档详细介绍 Xilinx AXI DMA 的使用,涵盖功能概述、接口描述、设计流程、Vivado IP 配置及示例代码,仅聚焦 AXI DMA。

2. AXI DMA 功能简介

AXI DMA 提供灵活的数据搬运能力,减轻处理器负担,支持以下模式:

  • Memory-Mapped to Memory-Mapped (MM2MM):通过 AXI4 接口在存储器间传输数据。
  • Memory-Mapped to Stream (MM2S):将存储器数据转换为 AXI4-Stream 数据流。
  • Stream to Memory-Mapped (S2MM):将 AXI4-Stream 数据流写入存储器。
  • Scatter-Gather (SG):支持非连续存储器块的自动化传输。
  • Simple DMA:直接寄存器控制的单次传输。

2.1 AXI DMA 关键特性

  • 高带宽:支持突发传输,数据宽度可达32/64/128/256/512位。
  • 双向通道:独立的 MM2S 和 S2MM 通道,可同时操作。
  • 灵活控制:支持寄存器直接控制或 Scatter-Gather 模式。
  • 中断支持:提供完成、错误等中断信号,便于处理器管理。
  • 背压处理:通过 AXI4-Stream 的 TREADY 信号支持流控。

3. AXI DMA 接口描述

AXI DMA 包含以下主要接口(基于 PG021 AXI DMA v7.1):

接口名类型描述
ACLK输入全局时钟信号,所有接口同步于此。
ARESETN输入全局复位信号,低电平有效。
AXI4-Lite 控制接口
S_AXI_LITEAXI4-Lite 从接口用于配置 DMA 寄存器(如控制、状态、缓冲区描述符地址)。
AXI4 存储器映射接口
M_AXI_MM2SAXI4 主接口读取存储器数据(MM2S 通道)。
M_AXI_S2MMAXI4 主接口写入存储器数据(S2MM 通道)。
AXI4-Stream 数据接口
M_AXIS_MM2SAXI4-Stream 主接口输出流数据(MM2S 通道)。
S_AXIS_S2MMAXI4-Stream 从接口接收流数据(S2MM 通道)。
中断信号
INTR_OUT输出中断信号,通知传输完成或错误。

主要信号(以 AXI4-Stream 为例)

  • M_AXIS_MM2S:TDATA(数据)、TVALID、TREADY、TLAST(数据包结束)。
  • S_AXIS_S2MM:TDATA、TVALID、TREADY、TLAST、TUSER(可选用户信号)。

主要寄存器(通过 AXI4-Lite 访问)

  • MM2S_DMACR:控制寄存器(启动/停止、模式选择)。
  • MM2S_SA:源地址寄存器(Simple 模式)。
  • MM2S_LENGTH:传输长度寄存器。
  • S2MM_DMACRS2MM_DAS2MM_LENGTH:S2MM 通道类似。
  • SG 模式寄存器:如描述符地址、状态寄存器等。

4. Xilinx FPGA 中的 AXI DMA 设计流程

在 Xilinx FPGA 中使用 AXI DMA 通常包括以下步骤:

4.1 需求分析

  • 确定传输模式:MM2S、S2MM 或双向。
  • 选择控制模式:Simple DMA(单次传输)或 Scatter-Gather(多块传输)。
  • 确定数据宽度(32/64/128位等)和突发长度(最大256)。
  • 分析存储器类型(DDR、BRAM)及带宽需求。

4.2 使用 Vivado IP 核

Vivado 提供 AXI DMA IP 核(PG021),以下为配置和相关 IP:

  • AXI DMA (PG021)

    • 功能:核心 DMA 功能,支持 MM2S、S2MM 和 Scatter-Gather。
    • 配置:
      • 通道选择:启用 MM2S、S2MM 或两者。
      • 数据宽度:32/64/128/256/512位。
      • 模式:Simple DMA 或 Scatter-Gather。
      • 突发长度:最大256次。
      • 其他:中断使能、缓冲区深度等。
    • 用途:处理器与 PL 间的高速数据搬运。
  • AXI Interconnect (PG059)

    • 功能:连接 AXI4 和 AXI4-Lite 接口,支持时钟域和数据宽度转换。
    • 配置:支持多主多从,数据宽度匹配 DMA 设置。
    • 用途:连接 DMA 到存储器(如 DDR)或处理器。
  • AXI4-Stream Data FIFO (PG080)

    • 功能:缓冲 AXI4-Stream 数据,支持异步时钟域。
    • 配置:数据宽度匹配 DMA,深度可调。
    • 用途:处理背压,平滑数据流。
  • Block Memory Generator (PG058)

    • 功能:提供片上 BRAM,连接 AXI DMA 的存储器接口。
    • 配置:数据宽度和深度匹配 DMA。
    • 用途:小型存储器测试或低延迟应用。
  • AXI Verification IP (PG267)

    • 功能:仿真验证 AXI4 和 AXI4-Stream 协议。
    • 配置:模拟 DMA 的主/从接口。
    • 用途:验证 DMA 配置和自定义逻辑。

在 Vivado 中:

  1. 打开 IP Catalog,搜索“AXI DMA”。
  2. 添加 AXI DMA IP,配置通道、数据宽度、模式等。
  3. 使用 Block Design 连接 AXI Interconnect、存储器(如 DDR 或 BRAM)和 AXI4-Stream 外设。
  4. 生成 IP 核并综合设计。

4.3 软件驱动开发

  • 嵌入式系统(如 Zynq PS):
    • 使用 Xilinx SDK 或 Vitis,加载 AXI DMA 驱动(xaxidma.h)。
    • 配置 DMA 寄存器,设置源/目的地址、传输长度。
    • 处理中断,监控传输状态。
  • Scatter-Gather 模式
    • 准备缓冲区描述符链表,写入描述符地址寄存器。
    • 使用驱动 API 管理描述符。

4.4 时序设计

  • 确保 AXI4 和 AXI4-Stream 接口与 ACLK 同步。
  • 使用 ARESETN 初始化 DMA 和相关逻辑。
  • 遵循 VALID/READY(AXI4-Lite 和 AXI4-Stream)握手协议。

4.5 调试

  • 使用 Vivado ILA 捕获 AXI4 和 AXI4-Stream 信号。
  • 检查寄存器配置(通过 AXI4-Lite)、TVALID/TREADY 握手和 TLAST。
  • 验证传输长度、地址对齐和中断触发。
  • 使用 SDK/Vitis 调试器监控驱动行为。

5. 示例:AXI DMA MM2S 配置(Verilog + 驱动)

以下为 AXI DMA 的 Vivado 配置和简单驱动代码示例,展示 MM2S 传输(存储器到流)。

5.1 Vivado 配置

  1. 添加 AXI DMA IP

    • 数据宽度:32位。
    • 启用 MM2S 通道,禁用 S2MM。
    • 模式:Simple DMA。
    • 突发长度:16。
    • 启用中断。
  2. 连接 Block Design

    • AXI4-Lite:连接到处理器(如 Zynq PS)。
    • M_AXI_MM2S:连接到 AXI Interconnect,再到 DDR 或 BRAM。
    • M_AXIS_MM2S:连接到 AXI4-Stream 从设备(如自定义 IP 或 FIFO)。
    • INTR_OUT:连接到处理器中断控制器。
  3. 生成位流

    • 综合、实现并生成 FPGA 比特流。

5.2 简单 AXI4-Stream 从设备(Verilog)

module axi4_stream_slave #(
    parameter C_S_AXIS_DATA_WIDTH = 32
) (
    input wire                          s_axis_aclk,
    input wire                          s_axis_aresetn,
    input wire [C_S_AXIS_DATA_WIDTH-1:0] s_axis_tdata,
    input wire                          s_axis_tvalid,
    output wire                         s_axis_tready,
    input wire                          s_axis_tlast
);

// 简单接收逻辑
reg [C_S_AXIS_DATA_WIDTH-1:0] data_buffer [0:15];
reg [3:0]                     buffer_index;
reg                           tready;

assign s_axis_tready = tready;

always @(posedge s_axis_aclk or negedge s_axis_aresetn) begin
    if (!s_axis_aresetn) begin
        tready <= 1'b0;
        buffer_index <= 4'b0;
    end else begin
        tready <= (buffer_index < 15); // 缓冲区未满
        if (s_axis_tvalid && tready) begin
            data_buffer[buffer_index] <= s_axis_tdata;
            if (s_axis_tlast) begin
                buffer_index <= 4'b0;
            end else if (buffer_index < 15) begin
                buffer_index <= buffer_index + 1;
            end
        end
    end
end

endmodule

5.3 驱动代码(C,基于 Zynq PS)

#include <xaxidma.h>
#include <xparameters.h>
#include <xil_printf.h>

#define DMA_DEV_ID      XPAR_AXIDMA_0_DEVICE_ID
#define TX_BUFFER_BASE  0x10000000 // DDR 地址
#define TX_LENGTH       64         // 传输字节数

XAxiDma AxiDma;

int main() {
    XAxiDma_Config *CfgPtr;
    int Status;

    // 初始化 DMA
    CfgPtr = XAxiDma_LookupConfig(DMA_DEV_ID);
    Status = XAxiDma_CfgInitialize(&AxiDma, CfgPtr);
    if (Status != XST_SUCCESS) {
        xil_printf("DMA 初始化失败\r\n");
        return XST_FAILURE;
    }

    // 禁用中断,Simple 模式
    XAxiDma_IntrDisable(&AxiDma, XAXIDMA_IRQ_ALL_MASK, XAXIDMA_DMA_TO_DEVICE);

    // 设置 MM2S 传输
    Status = XAxiDma_SimpleTransfer(&AxiDma, TX_BUFFER_BASE, TX_LENGTH, XAXIDMA_DMA_TO_DEVICE);
    if (Status != XST_SUCCESS) {
        xil_printf("DMA 传输启动失败\r\n");
        return XST_FAILURE;
    }

    // 等待传输完成
    while (XAxiDma_Busy(&AxiDma, XAXIDMA_DMA_TO_DEVICE)) {
        // 忙等待
    }

    xil_printf("DMA 传输完成\r\n");
    return XST_SUCCESS;
}

5.4 示例说明

  • 硬件:AXI DMA 配置为 MM2S 模式,从 DDR 读取数据并输出到 AXI4-Stream 从设备。Verilog 代码实现简单的流接收逻辑。
  • 软件:Zynq PS 通过 AXI4-Lite 配置 DMA,启动 Simple 模式传输,读取 DDR 数据。
  • 功能:从 DDR 地址 0x10000000 读取 64 字节数据,传输到流接口。
  • 可扩展为 Scatter-Gather 模式,处理非连续数据。

6. 注意事项

  1. 时钟与复位

    • 确保 AXI4、AXI4-Stream 和 AXI4-Lite 接口与 ACLK 同步。
    • 使用 ARESETN 初始化 DMA 和外设。
  2. 握手协议

    • 确保 AXI4-Stream 的 TVALID/TREADY 正确握手,避免数据丢失。
    • AXI4-Lite 配置需等待 READY 信号。
  3. 存储器对齐

    • 源/目的地址需与数据宽度对齐(如32位对齐4字节)。
    • 突发传输需符合存储器边界。
  4. 性能优化

    • 增大突发长度(最大256)以提高带宽。
    • 使用 Scatter-Gather 模式处理大块或非连续数据。
    • 启用中断以减少处理器轮询开销。
  5. 调试与验证

    • 使用 AXI VIP 验证 AXI4 和 AXI4-Stream 接口。
    • 通过 ILA 检查寄存器配置、握手信号和 TLAST。
    • 使用 SDK/Vitis 调试器验证驱动行为。

7. 设计工具推荐

  • SZ901
    SZ901 是一款基于XVC协议的FPGA网络下载器。
    • 最高支持53M
    • 支持4路JTAG独立使用
    • 支持端口合并
    • 支持国产FLASH烧写
    • 下载器无限扩展
    • 配备专属程序固化软件,一键烧写,能大大减小程序固化时间!
FPGA中,DMA(直接内存访问)技术被广泛用于实现高速数据传输,特别是在从FPGA读取数据到主机内存时。这种技术通过绕过CPU,直接在硬件设备和系统内存之间传输数据,显著提高了系统的性能和效率。以下是一些关于如何通过DMA技术从FPGA中读取数据的方法和技术要点。 首先,确定所需的传输模式是关键步骤之一。DMA支持多种传输模式,包括MM2S(Memory Mapped to Stream)、S2MM(Stream to Memory Mapped)或双向传输。对于从FPGA读取数据的应用场景,通常会选择S2MM模式[^2]。 其次,在配置DMA控制器时,需要考虑控制模式的选择。Xilinx FPGA中的AXI DMA IP核提供了两种主要的控制模式:Simple DMA(单次传输)和Scatter-Gather(多块传输)。Simple DMA适用于简单的点对点数据传输需求,而Scatter-Gather则更适合于需要处理多个分散数据块的情况[^3]。 此外,还需要根据具体的应用需求来确定数据宽度(例如32位、64位或128位等)以及突发长度(最大256)。这些参数的选择会影响数据传输的速度和效率。同时,也需分析目标存储器类型(如DDR、BRAM)及其带宽需求,以确保能够满足预期的数据吞吐量要求[^2]。 为了启动一次DMA传输,CPU通常会通过AXI_GP接口设置外部DMA控制器。这涉及到对DMA控制寄存器(DMACR)、源地址/目标地址寄存器及长度寄存器的编程操作。一旦DMA传输完成,并且如果启用了中断功能,则DMA状态寄存器(DMASR)中的相关联通道位IOC_Irq会被置位,从而触发一个中断通知给处理器[^4]。 最后,使用Vivado IP核可以简化DMA控制器的设计与集成过程。开发者可以根据项目需求定制合适的DMA解决方案,并利用Vivado提供的工具链进行仿真、综合以及最终的硬件实现。 ### 示例代码 下面是一个简化的示例代码片段,展示了如何初始化并启动一次DMA传输。请注意,实际应用中的代码将更加复杂,并且依赖于具体的硬件平台和开发环境。 ```c // 假设已经正确配置了DMA实例 Xil_DmaStart(&dmaInstance, (u32 *)sourceAddress, (u32 *)destinationAddress, length); // 等待DMA传输完成 while (!Xil_DmaIsDone(&dmaInstance)) { // 可以在这里添加超时检查或其他逻辑 } // 检查是否有错误发生 if (Xil_DmaGetErrorStatus(&dmaInstance) != XST_SUCCESS) { // 处理错误情况 } ``` 此代码假定存在一个名为`Xil_DmaStart`的函数用于开始DMA传输,以及相应的API来查询DMA状态和错误信息。真实世界中的实现细节可能会有所不同,因此建议查阅特定厂商提供的文档和库文件以获取准确的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值