FPGA实战(55):AXI DMA FIFO 模块设计与验证(适配 FWFT 模式)

发布时间:2026/7/19 13:46:53

FPGA实战(55):AXI DMA FIFO 模块设计与验证(适配 FWFT 模式) 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_en由tvalid 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),读取并比对数据。测试平台会实时打印写入计数和接收数据,最终输出PASS或FAIL。测试平台特别处理了 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

相关新闻