1. Zynq平台AXI_DMA传输基础认知
第一次接触Zynq的PL和PS数据传输时,我完全被各种专业术语搞晕了。后来在实际项目中踩过几次坑才明白,其实可以把它想象成两个城市之间的物流系统:PL端(可编程逻辑)是生产工厂,PS端(处理器系统)是仓储中心,而AXI_DMA就是负责两地货物运输的高速公路和卡车车队。
AXI_DMA最核心的优势在于解放CPU。传统的数据搬运需要CPU全程参与,就像让公司CEO亲自去搬货;而DMA模式下,CEO只需要下达指令,具体运输工作交给专门的物流部门(DMA控制器)完成。实测在Zynq-7020平台上,使用AXI_DMA传输1MB数据,CPU占用率能从90%降到不足5%。
这里有个容易混淆的概念:AXI_DMA实际上包含两个独立通道:
- MM2S (Memory to Stream):PS到PL的数据传输
- S2MM (Stream to Memory):PL到PS的数据传输
我在调试时经常用彩色标签区分这两个通道,红色标签贴MM2S相关代码,蓝色标签贴S2MM部分,这个方法帮我避免了很多接线错误。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. FPGA工程搭建实战细节
2.1 Vivado中的DMA配置陷阱
创建Block Design时,AXI_DMA的配置页面有多个容易踩坑的参数:
- Enable Scatter Gather:除非需要复杂的数据包管理,否则建议关闭。开启后会增加PL资源消耗,我们的项目中关闭该功能节省了15%的LUT资源。
- Data Width:必须与AXI总线位宽一致。有次调试时发现传输数据错位,最后发现是这里设成了64bit而总线是32bit。
DMA中断配置是另一个关键点。建议将mm2s_introut和s2mm_introut分别接到不同的IRQ通道,这样在驱动中可以通过中断号直接判断是哪个通道触发的中断。我们的配置如下:
verilog复制connect_bd_net [get_bd_pins axi_dma_0/mm2s_introut] [get_bd_pins xlconcat_0/In0]
connect_bd_net [get_bd_pins axi_dma_0/s2mm_introut] [get_bd_pins xlconcat_0/I
