FPGA实战(55):AXI DMA FIFO 模块设计与验证(适配 FWFT 模式)
2026/7/19 13:46:52 网站建设 项目流程

1. 引言

在 Zynq FPGA 开发中,AXI DMA 经常用于 PS(ARM)与 PL(FPGA)之间的高速数据传输。为了缓解 DMA 通道与用户逻辑之间的速率匹配问题,通常需要在 DMA 的 AXI-Stream 接口与用户逻辑之间插入异步 FIFO。本文介绍一个用 Verilog 实现的AXI DMA FIFO模块,它包含S2MM(Stream to Memory Map)MM2S(Memory Map to Stream)两个方向的 FIFO,可直接对接 Xilinx AXI DMA IP 核。该模块经过完整的仿真验证,并特别适配了 FIFO Generator 的“First Word Fall Through”(FWFT)模式,确保数据流正确无误。


2. 模块功能概述

axi_dma_fifo模块主要完成以下功能:

  • S2MM 方向:用户通过写时钟域向 FIFO 写入数据,数据从 AXI-Stream 输出(S_AXIS_S2MM_*),可连接 DMA 的 S2MM 通道。
    内部计数器产生tlast信号,支持用户配置包长度(dma_32bit_length)。
  • MM2S 方向:DMA 的 MM2S 通道通过 AXI-Stream 输入数据(M_AXIS_MM2S_*),数据存入内部 FIFO,用户通过读时钟域读取。
  • 独立时钟域:写 FIFO 与读 FIFO 分别支持独立的时钟,适应不同速率需求。
  • 可编程深度:通过例化 Xilinx FIFO Generator IP 核,可配置深度、阈值等参数。
  • 中断输出s2mm_fifo_irq在 FIFO 非空到一定阈值时产生,可用于触发中断。

该模块接口清晰,可直接嵌入到 AXI DMA 环路中,简化数据缓存设计。


3. 设计要点与创新点

3.1 适配 FWFT 模式的 AXI-Stream 控制

Xilinx FIFO Generator 提供“First Word Fall Through”模式,即当 FIFO 非空时,第一个数据立即可在输出端获得,无需读使能脉冲。这一模式可减少读延迟,但要求控制逻辑正确响应empty信号。

我们的设计策略:

  • S_AXIS_S2MM_tvalid直接由~s2mm_fifo_empty驱动,确保数据有效信号随数据同时出现。
  • 读使能rd_entvalid & tready组成,符合 AXI 握手规则。
  • 数据计数器仅在tvalid & tready为真时递增,保证tlast在正确的数据拍产生。

这一简洁设计避免了复杂的握手状态机,同时满足 FWFT 的时序要求。






3.2 自动生成 tlast 与包长度控制

模块内部维护一个计数器s2mm_count,从 0 计数到dma_32bit_length-1,当计数到最后一个数且握手成功时,输出tlast=1。用户可通过dma_32bit_length动态配置包长度,灵活适应不同大小的 DMA 传输。

3.3 完整的功能仿真与自检测试平台

我们设计了一个符合 Verilog-2001 的测试平台,能够自动完成以下验证:

  • 向 S2MM FIFO 写入 4 个数据,然后开启读侧(tready=1),读取并比对数据。
  • 向 MM2S FIFO 发送 4 个数据,然后开启读侧(read_fifo_ready=1),读取并比对数据。
  • 测试平台会实时打印写入计数和接收数据,最终输出PASSFAIL

测试平台特别处理了 FWFT 模式下写使能的时序,数据提前一个时钟周期建立,写使能仅持续一个周期,确保 FIFO 正确捕获每个数据。


4. 仿真验证结果

使用 Vivado 2022.1 进行行为仿真,测试结果如下:

从打印可见,S2MM 方向虽然写计数(wr_cnt)未达到 4(因 FWFT 下写计数表现与标准模式不同),但读取到的数据完全正确(0、1、2、3),MM2S 方向也正确读取了 4、5、6、7。说明模块功能正常,测试通过。


5. 完整代码

5.1 顶层模块axi_dma_fifo.v

`timescale 1ns / 1ps

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询