Quick Start
本指南将引导您快速搭建一个基于AXI4-Full总线的DMA控制器,实现从源地址到目标地址的256字节数据搬移。以下为快速启动步骤:
- 准备环境:安装Vivado 2025.2(或更新版本),确保已添加AXI VIP库。
- 创建工程:新建RTL工程,器件选择Xilinx Artix-7 XC7A35T(或等效),添加顶层文件
dma_axi_top.v。 - 编写代码:将下方关键模块代码复制到工程中,包含AXI4接口、DMA状态机与FIFO。
- 添加约束:创建XDC文件,绑定时钟(100 MHz)、复位(低有效)及AXI接口引脚。
- 综合与实现:运行Synthesis与Implementation,观察无严重时序违例。
- 仿真验证:运行提供的testbench(
dma_axi_tb.v),检查AXI写/读事务波形,确认数据正确。 - 上板测试:将bitstream下载到开发板,通过串口或ILA观察DMA传输完成标志。
- 验收:DMA在100 MHz下完成256字节传输,延迟 < 1 µs,无数据错误。
前置条件与环境
| 项目/推荐值 | 说明 | 替代方案 |
|---|---|---|
| 器件/板卡 | Xilinx Artix-7 XC7A35T | Zynq-7000 / Kintex-7 |
| EDA版本 | Vivado 2025.2 | Vivado 2024.2或更新 |
| 仿真器 | Vivado Simulator | ModelSim / Questa |
| 时钟/复位 | 100 MHz单端时钟,低有效异步复位 | 差分时钟需IBUFDS |
| 接口依赖 | AXI4-Full主接口(32-bit数据,4-beat burst) | AXI4-Stream / AXI4-Lite |
| 约束文件 | XDC约束:时钟周期10 ns,输入输出延迟 | SDC格式(Vivado自动转换) |
| IP核 | 无需额外IP,纯RTL实现 | 可集成AXI DataMover |
目标与验收标准
- 功能点:DMA从源地址读取256字节数据,写入目标地址,支持增量地址模式。
- 性能指标:在100 MHz下,单次4-beat burst传输延迟 ≤ 40 ns(4个时钟周期)。
- 资源占用:LUT ≤ 800,FF ≤ 600,BRAM ≤ 2(18K)。
- Fmax ≥ 100 MHz(时序收敛)。
- 验收方式:仿真波形显示AWVALID → WVALID → BVALID握手完成,数据一致;ILA抓取上板信号。
实施步骤
工程结构
- 创建目录:
src/(RTL源文件)、sim/(testbench)、constr/(XDC)、ip/(可选IP)。 - 顶层模块:
dma_axi_top.v,实例化AXI主接口、DMA控制器、FIFO。 - 子模块:
axi_master.v(AXI事务引擎)、dma_fsm.v(状态机)、fifo_256x32.v(数据缓存)。
关键模块:AXI主接口
module axi_master #(
parameter ADDR_WIDTH = 32,
parameter DATA_WIDTH = 32
)(
input wire clk,
input wire rst_n,
// DMA 控制接口
input wire start,
input wire [ADDR_WIDTH-1:0] src_addr,
input wire [ADDR_WIDTH-1:0] dst_addr,
input wire [15:0] length,
output reg done,
// AXI 写地址通道
output reg [ADDR_WIDTH-1:0] AWADDR,
output reg [2:0] AWSIZE,
output reg [1:0] AWBURST,
output reg AWVALID,
input wire AWREADY,
// AXI 写数据通道
output reg [DATA_WIDTH-1:0] WDATA,
output reg [DATA_WIDTH/8-1:0] WSTRB,
output reg WLAST,
output reg WVALID,
input wire WREADY,
// AXI 写响应通道
input wire [1:0] BRESP,
input wire BVALID,
output reg BREADY,
// AXI 读地址通道
output reg [ADDR_WIDTH-1:0] ARADDR,
output reg [2:0] ARSIZE,
output reg [1:0] ARBURST,
output reg ARVALID,
input wire ARREADY,
// AXI 读数据通道
input wire [DATA_WIDTH-1:0] RDATA,
input wire [1:0] RRESP,
input wire RLAST,
input wire RVALID,
output reg RREADY
);
// 内部状态与计数器
localparam IDLE = 3'd0, READ = 3'd1, WRITE = 3'd2, DONE = 3'd3;
reg [2:0] state, next_state;
reg [15:0] beat_cnt;
reg [31:0] raddr, waddr;
// 状态机
always @(posedge clk or negedge rst_n) begin
if (!rst_n) state逐行说明
- 第1行:模块定义开始,名称为
axi_master,使用Verilog-2001语法。 - 第2行:参数
ADDR_WIDTH,默认32位,定义地址总线宽度。 - 第3行:参数
DATA_WIDTH,默认32位,定义数据总线宽度。 - 第5行:时钟输入
clk,全局同步时钟。 - 第6行:复位输入
rst_n,低有效异步复位。 - 第8行:DMA控制接口,
start信号启动传输。 - 第9行:源地址输入
src_addr,宽度由ADDR_WIDTH决定。 - 第10行:目标地址输入
dst_addr。 - 第11行:传输长度
length,16位,单位字节。 - 第12行:完成标志输出
done,高电平表示传输结束。 - 第14行:AXI写地址通道,
AWADDR为写地址。 - 第15行:
AWSIZE定义每次传输的字节数(3'b010表示4字节)。 - 第16行:
AWBURST定义突发类型(2'b01为INCR)。 - 第17行:
AWVALID指示写地址有效。 - 第18行:
AWREADY从设备应答写地址。 - 第20行:AXI写数据通道,
WDATA为写数据。 - 第21行:
WSTRB写选通信号,每比特对应一个字节。 - 第22行:
WLAST指示最后一个写数据。 - 第23行:
WVALID指示写数据有效。 - 第24行:
WREADY从设备应答写数据。 - 第26行:AXI写响应通道,
BRESP为响应状态(2'b00表示OKAY)。 - 第27行:
BVALID指示写响应有效。 - 第28行:
BREADY主设备应答写响应。 - 第30行:AXI读地址通道,
ARADDR为读地址。 - 第31行:
ARSIZE定义读传输字节数。 - 第32行:
ARBURST定义读突发类型。 - 第33行:
ARVALID指示读地址有效。 - 第34行:
ARREADY从设备应答读地址。 - 第36行:AXI读数据通道,
RDATA为读数据。 - 第37行:
RRESP读响应状态。 - 第38行:
RLAST指示最后一个读数据。 - 第39行:
RVALID指示读数据有效。 - 第40行:
RREADY主设备应答读数据。 - 第42行:内部状态与计数器声明,
state和next_state为状态机寄存器。 - 第43行:状态编码,
IDLE=0,READ=1,WRITE=2,DONE=3。 - 第44行:
beat_cnt计数器,记录已传输的beat数。 - 第45行:
raddr和waddr为当前读/写地址寄存器。 - 第47行:状态机时序逻辑,在时钟上升沿或复位下降沿触发。
- 第48行:复位时状态回到
IDLE。
验证结果
仿真验证通过后,波形应显示以下关键特征:
- 读地址通道:
ARVALID与ARREADY握手成功,ARADDR递增。 - 读数据通道:
RVALID与RREADY握手,RDATA连续输出,RLAST在最后一个数据时拉高。 - 写地址通道:
AWVALID与AWREADY握手,AWADDR为目标地址。 - 写数据通道:
WVALID与WREADY握手,WLAST在最后一个数据时拉高。 - 写响应通道:
BVALID与BREADY握手,BRESP为2'b00(OKAY)。 done信号在传输完成后拉高,持续一个时钟周期。
排障
- 仿真无波形:检查testbench中时钟和复位是否正确生成,确保
start信号在复位释放后至少一个时钟周期才拉高。 - AXI握手失败:确认从设备(如BRAM控制器)的
AWREADY、WREADY等信号在适当时间拉高。若从设备未就绪,主设备会等待,导致死锁。 - 数据错误:检查
WSTRB是否全为1(32位数据时应为4'b1111),以及RDATA与WDATA的字节顺序是否匹配。 - 时序违例:在XDC中正确约束时钟周期为10 ns,并检查组合逻辑路径是否过长。可添加流水线寄存器优化。
扩展
- 支持更长的传输:修改
length宽度至24位或32位,并调整状态机中的计数器位宽。 - 增加中断输出:在
DONE状态添加irq信号,用于通知处理器传输完成。 - 集成AXI4-Stream:将DMA与AXI4-Stream接口结合,实现流式数据传输,适用于高速ADC/DAC。
- 多通道DMA:通过仲裁器支持多个DMA通道,提高系统吞吐量。
参考
- ARM AMBA AXI and ACE Protocol Specification (IHI0022E)
- Xilinx UG761: AXI Reference Guide
- Xilinx Vivado Design Suite User Guide: Synthesis (UG901)
附录
完整代码及testbench请参见工程目录下的src/和sim/文件夹。本指南中的代码片段仅供演示,实际应用时需根据具体需求调整参数和时序。




