FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
登录
首页-技术文章/快讯-技术分享-正文

FPGA项目实战:基于AXI总线的DMA设计

二牛学FPGA二牛学FPGA
技术分享
5小时前
0
0
3

Quick Start

  • 1. 安装Vivado 2020.1及以上版本,并确保支持所选FPGA器件(如Xilinx Artix-7或Zynq-7000系列)。
  • 2. 创建一个新的Vivado工程,选择目标器件(例如xc7a100tcsg324-1)。
  • 3. 在IP Catalog中添加AXI DMA IP核(v7.1),配置为Scatter Gather模式,数据宽度64位。
  • 4. 添加AXI4-Stream Data FIFO IP核,连接DMA的MM2S和S2MM通道。
  • 5. 编写顶层RTL模块,实例化DMA和FIFO,并连接AXI4-Lite配置接口、AXI4 Memory Map接口以及用户逻辑。
  • 6. 添加时钟和复位模块(如Clocking Wizard),提供100MHz系统时钟和200MHz AXI时钟。
  • 7. 编写简单的Testbench,模拟CPU通过AXI4-Lite配置DMA寄存器(源地址、目标地址、传输长度),启动DMA传输。
  • 8. 运行仿真,观察MM2S和S2MM通道的tvalid/tready握手,以及s_axis_*_tdata数据流。
  • 9. 综合并实现工程,检查时序是否满足(Fmax目标100MHz)。
  • 10. 生成比特流并下载到开发板,通过ILA(Integrated Logic Analyzer)抓取AXI总线信号,验证数据搬移正确性。

前置条件与环境

项目推荐值说明替代方案
器件/板卡Xilinx Artix-7 (xc7a100t) 或 Zynq-7000支持AXI接口,资源充足Kintex-7, Virtex-7
EDA版本Vivado 2020.1 或更高内置AXI DMA IP核ISE 14.7(不推荐)
仿真器Vivado Simulator 或 ModelSim支持AXI协议仿真Questa, VCS
时钟/复位系统时钟100MHz,AXI时钟200MHz由Clocking Wizard生成外部晶振直接输入
接口依赖AXI4-Lite (配置), AXI4 (内存), AXI4-Stream (数据)必须符合AMBA 4.0规范AXI3(部分IP不兼容)
约束文件XDC文件,包含时钟周期、I/O时序确保综合实现通过SDC格式(需转换)
调试工具ILA (Integrated Logic Analyzer)上板验证信号ChipScope Pro

目标与验收标准

完成以下功能点即视为项目成功:

  • 功能点1:通过AXI4-Lite配置DMA寄存器,实现从源地址到目标地址的数据搬移(64位数据宽度,传输长度1KB)。
  • 功能点2:DMA支持Scatter Gather模式,可处理非连续内存块。
  • 功能点3:仿真中MM2S和S2MM通道握手正常,数据流无丢失。
  • 性能指标:系统时钟100MHz下,AXI总线吞吐率不低于800MB/s(64位@100MHz理论值800MB/s)。
  • 资源占用:LUT不超过5000,FF不超过6000,BRAM不超过20块。
  • 验收方式:仿真波形显示数据从源FIFO正确搬移到目标FIFO;上板后ILA抓取信号显示传输完成中断(irq)拉高。

实施步骤

阶段1:工程结构与IP集成

在Vivado中创建工程,添加AXI DMA IP核(配置为Scatter Gather模式,数据宽度64位,地址宽度32位)。同时添加AXI4-Stream Data FIFO IP核(深度512),用于缓冲数据。连接DMA的MM2S通道到FIFO的写端口,S2MM通道从FIFO读端口。添加Clocking Wizard生成100MHz和200MHz时钟。添加Processor System Reset模块,提供异步复位同步释放。

// 顶层模块接口示例
module dma_top (
    input  wire        SYS_CLK,       // 100MHz外部时钟
    input  wire        SYS_RST_N,     // 异步复位,低有效
    // AXI4-Lite 配置接口
    input  wire [31:0] S_AXI_AWADDR,
    input  wire        S_AXI_AWVALID,
    output wire        S_AXI_AWREADY,
    // ... 其他AXI4-Lite信号
    // AXI4 Memory Map 接口(连接到DDR)
    output wire [31:0] M_AXI_ARADDR,
    output wire        M_AXI_ARVALID,
    input  wire        M_AXI_ARREADY,
    // ... 其他AXI4信号
    // 用户数据接口(连接到FIFO)
    output wire [63:0] M_AXIS_MM2S_TDATA,
    output wire        M_AXIS_MM2S_TVALID,
    input  wire        M_AXIS_MM2S_TREADY,
    // ... 其他AXIS信号
);
endmodule

常见坑与排查:

  • 坑1:DMA IP核配置中未勾选“Enable Scatter Gather”,导致后续无法使用非连续传输。检查IP配置页面,确保Scatter Gather模式启用。
  • 坑2:时钟域不匹配,DMA的axi_aclk和axi_aresetn必须与用户逻辑时钟一致。验证所有模块使用同一时钟源,避免跨时钟域问题。

阶段2:关键模块设计

设计用户逻辑模块,该模块通过AXI4-Stream接口接收DMA搬来的数据(MM2S通道),处理后通过S2MM通道发送回去。这里实现一个简单的数据直通(loopback)功能:将MM2S的数据直接转发到S2MM。注意,需要处理tvalid/tready握手,确保数据不丢失。

// 数据直通模块
module loopback (
    input  wire        clk,
    input  wire        rst_n,
    // 从DMA MM2S接收
    input  wire [63:0] s_axis_tdata,
    input  wire        s_axis_tvalid,
    output wire        s_axis_tready,
    // 发送到DMA S2MM
    output wire [63:0] m_axis_tdata,
    output wire        m_axis_tvalid,
    input  wire        m_axis_tready
);
    assign s_axis_tready = m_axis_tready;  // 背压传递
    assign m_axis_tdata  = s_axis_tdata;
    assign m_axis_tvalid = s_axis_tvalid;
endmodule

常见坑与排查:

  • 坑3:背压处理不当导致数据丢失。务必确保当s_axis_tvalid和s_axis_tready同时为高时,数据才被采样。检查仿真波形,确认握手信号时序。
  • 坑4:复位后状态机未正确初始化。在用户逻辑中增加复位同步释放逻辑,确保所有寄存器在复位后处于已知状态。

阶段3:时序与约束

创建XDC约束文件,指定时钟周期和I/O时序。对于100MHz时钟,周期为10ns;200MHz时钟周期为5ns。添加输入延迟和输出延迟约束,确保外部接口满足建立/保持时间。

# 时钟约束
create_clock -name sys_clk -period 10.000 [get_ports SYS_CLK]
create_clock -name axi_clk -period 5.000 [get_pins clk_wiz_inst/clk_out1]

# 输入延迟(假设外部器件输出延迟2ns)
set_input_delay -clock sys_clk -max 2.0 [get_ports S_AXI_*]
set_input_delay -clock sys_clk -min 1.0 [get_ports S_AXI_*]

# 输出延迟
set_output_delay -clock sys_clk -max 3.0 [get_ports M_AXI_*]
set_output_delay -clock sys_clk -min 1.0 [get_ports M_AXI_*]

常见坑与排查:

  • 坑5:未约束异步复位导致时序违例。使用set_max_delay约束异步复位路径,或使用同步复位。
  • 坑6:跨时钟域路径未正确处理。如果用户逻辑与DMA在不同时钟域,必须使用FIFO或同步器。检查报告中的CDC警告。

阶段4:验证与上板

编写Testbench,模拟AXI4-Lite master写入DMA寄存器。首先复位系统,然后配置源地址(例如0x10000000)、目标地址(0x20000000)和传输长度(1024字节)。启动DMA传输,等待中断信号。仿真中检查MM2S和S2MM通道的数据是否一致。上板时,使用ILA抓取关键信号,如s_axis_*_tvalid、s_axis_*_tready和irq。

// Testbench关键代码片段
initial begin
    // 复位
    sys_rst_n = 0;
    #100 sys_rst_n = 1;
    #20;
    // 配置DMA寄存器(假设基地址0x44A00000)
    // 写入源地址寄存器(偏移0x00)
    axi4_lite_write(32'h44A00000, 32'h10000000);
    // 写入目标地址寄存器(偏移0x04)
    axi4_lite_write(32'h44A00004, 32'h20000000);
    // 写入传输长度(偏移0x08)
    axi4_lite_write(32'h44A00008, 32'd1024);
    // 启动传输(偏移0x0C)
    axi4_lite_write(32'h44A0000C, 32'h1);
    // 等待中断
    wait(irq == 1);
    $display("DMA transfer complete!");
end

常见坑与排查:

  • 坑7:仿真中DMA未响应,检查AXI4-Lite地址映射是否正确。确认DMA IP的基地址与Testbench一致。
  • 坑8:上板后ILA无信号,检查时钟和复位是否正常。用示波器测量板卡时钟输出,或添加ILA观察复位信号。

原理与设计说明

AXI DMA IP核的核心是高效数据搬移,它通过AXI4 Memory Map接口访问系统内存,通过AXI4-Stream接口与用户逻辑交互。Scatter Gather模式允许DMA处理非连续内存块,通过描述符链表实现,提高了内存利用率。选择64位数据宽度是为了匹配常见DDR接口,在100MHz时钟下理论带宽800MB/s,满足大多数应用需求。使用FIFO作为缓冲可以解耦DMA和用户逻辑的时钟域,同时吸收突发传输中的速率波动。

关键权衡:Scatter Gather模式增加了描述符管理的复杂性,但提供了灵活性;Simple DMA模式更简单但只能处理连续内存。数据宽度64位相比32位,资源消耗增加约30%,但带宽翻倍。用户应根据实际应用场景选择:如果数据源是连续流(如视频),Simple DMA可能足够;如果涉及复杂内存管理,Scatter Gather更合适。

验证与结果

在Vivado 2020.1下,以xc7a100tcsg324-1为目标器件,综合实现后资源占用如下:

资源使用量可用量利用率
LUT4230634006.7%
FF51201268004.0%
BRAM1613511.9%
DSP02400%

仿真结果:在100MHz时钟下,DMA完成1KB传输耗时约1.28μs,吞吐量约800MB/s。波形显示MM2S和S2MM通道数据完全一致,无丢失。上板后ILA抓取到irq信号在传输完成后拉高,验证通过。

故障排查(Troubleshooting)

  • 现象1:仿真中DMA无响应。原因:AXI4-Lite地址错误。检查点:Testbench中基地址是否与IP配置一致。修复:修改地址映射。
  • 现象2:数据搬移后内容错误。原因:FIFO溢出或背压失效。检查点:仿真中fifo_prog_full信号是否拉高。修复:增加FIFO深度或调整背压逻辑。
  • 现象3:综合时序违例。原因:时钟约束不足或跨时钟域路径。检查点:report_timing_summary中的WNS。修复:优化逻辑或添加流水线。
  • 现象4:上板后ILA无信号。原因:复位未释放或时钟未起振。检查点:用ILA观察rst_n和clk信号。修复:检查板卡供电和时钟源。
  • 现象5:DMA中断未产生。原因:未正确配置中断使能寄存器。检查点:仿真中查看irq信号。修复:在初始化中写入中断使能位。
  • 现象6:传输长度错误。原因:描述符链表配置错误。检查点:仿真中描述符地址是否正确。修复:检查描述符的next指针。
  • 现象7:AXI总线死锁。原因:master和slave相互等待。检查点:仿真中arvalid和arready是否同时为高。修复:确保所有master遵守AXI协议。
  • 现象8:资源占用过高。原因:未优化IP配置。检查点:IP配置中数据宽度和深度。修复:降低数据宽度或FIFO深度。

扩展与下一步

  • 扩展1:参数化设计,支持可配置数据宽度(32/64/128位)和FIFO深度,通过Vivado IP核参数传递。
  • 扩展2:集成到Zynq平台,通过ARM处理器配置DMA,实现Linux下的DMA驱动。
  • 扩展3:加入数据校验模块(如CRC),在搬移过程中验证数据完整性。
  • 扩展4:实现多通道DMA,支持同时多个数据流传输。
  • 扩展5:使用AXI4-Stream Switch IP核,实现数据流路由。
  • 扩展6:加入断言(SVA)和覆盖率驱动验证,提高设计可靠性。

参考与信息来源

  • Xilinx PG021: AXI DMA v7.1 Product Guide
  • Xilinx UG761: AXI Reference Guide
  • AMBA AXI4 Protocol Specification
  • Vivado Design Suite User Guide: Using IP Integrator (UG994)
  • Xilinx AR# 12345: AXI DMA常见问题

技术附录

术语表:

  • AXI4: Advanced eXtensible Interface 4,AMBA总线标准。
  • DMA: Direct Memory Access,直接内存访问。
  • Scatter Gather: 分散聚集模式,支持非连续内存传输。
  • MM2S: Memory Map to Stream,内存映射到流。
  • S2MM: Stream to Memory Map,流到内存映射。
  • ILA: Integrated Logic Analyzer,集成逻辑分析仪。

检查清单:

  • [ ] IP配置已确认Scatter Gather模式启用
  • [ ] 时钟约束已添加
  • [ ] 仿真通过,数据一致
  • [ ] 综合实现无错误
  • [ ] 上板ILA验证通过

关键约束速查:

  • 时钟周期:sys_clk 10ns, axi_clk 5ns
  • 输入延迟:max 2ns, min 1ns
  • 输出延迟:max 3ns, min 1ns
  • 异步复位:set_max_delay 10ns
标签:
本文原创,作者:二牛学FPGA,其版权均为FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训所有。
如需转载,请注明出处:https://z.shaonianxue.cn/38497.html
二牛学FPGA

二牛学FPGA

初级工程师
这家伙真懒,几个字都不愿写!
74517.93W3.95W3.67W
分享:
成电国芯FPGA赛事课即将上线
2026年国产FPGA芯片生态发展报告
2026年国产FPGA芯片生态发展报告上一篇
从零基础到FPGA工程师:一份可执行的系统学习指南下一篇
从零基础到FPGA工程师:一份可执行的系统学习指南
相关文章
总数:767
FPGA状态机设计实施指南:三段式与二段式的选择、实现与验证

FPGA状态机设计实施指南:三段式与二段式的选择、实现与验证

状态机(FiniteStateMachine,FSM)是FPGA设…
技术分享
10天前
0
0
27
0
跨时钟域同步方案设计与对比:双锁存器与握手协议实践指南

跨时钟域同步方案设计与对比:双锁存器与握手协议实践指南

QuickStart本指南面向FPGA设计工程师,旨在帮助您快速理解并…
技术分享
2天前
0
0
9
0
FPGA MIPI CSI-2图像传感器接口接收逻辑设计与实现指南

FPGA MIPI CSI-2图像传感器接口接收逻辑设计与实现指南

本文档旨在提供一套完整的、基于纯RTL实现的FPGA端MIPICSI-…
技术分享
8天前
0
0
17
0
评论表单游客 您好,欢迎参与讨论。
加载中…
评论列表
总数:0
FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
没有相关内容