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为目标器件,综合实现后资源占用如下:
| 资源 | 使用量 | 可用量 | 利用率 |
|---|---|---|---|
| LUT | 4230 | 63400 | 6.7% |
| FF | 5120 | 126800 | 4.0% |
| BRAM | 16 | 135 | 11.9% |
| DSP | 0 | 240 | 0% |
仿真结果:在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



