
xilinx 中手册中,zynq中DMA,Figure 1-1:AXI DMA Block Diagram,
AXI·DMA简介
概述
AXI DMA:AXI Direct Memory Access 直接内存访问AXIDMA为内存和AXI4-Stream外设之间提供了高带宽的直接内存访问其可选的s/G功能可以将cPu从数据搬运任务中解放出来
AXI DMA通过AX4-Lite接口对寄存器做一些配置和获取状态。
MM2S: MemoryMap to Stream 储器射 (AXI4-Ful1) 到AXI4-Stream
S2MM:Stream to MemoryMap AXI4-Stream到存储器映射 (AXI4-Full)
AXI DMA编程顺序
Direct Register Mode (简单DMA)
此模式提供了在MM2s和s2MM通道上进行简单DMA传输的配置,只需较少的FPGA资源,
通过访问DMACR、源地址或者目的地址和长度寄存器发起DMA传输。
当传输完成后,如果使能了产生中断输出,那么DMASR寄存器相关联的通道位会有效。
DMA的MM2s(存储器映射到stream)通道的启动顺序
1、开启/使能M2s通道
2、如果需要的话,可以使能中断
3、写一个有效的源地址到MM2s_SA寄存器
如果没有使能DRE的功能,在指定起始地址时,需要注意字节地址对齐,
哪些地址是对齐或者不对齐的,取决于stream流的数据位宽;
4、写传输的字节数到MM2sLENGTH寄存器
一个长度为0的值是无效的,而一个非0值,将会决定存储器映射到stream流
的数据个数。
需要注意的是,必须最后一个配置MM2sLENGTH寄存器,而其他寄存器的配置顺序没有要求。
S/G模式
它把传输的基本参数,存储在内存中;
这些参数就是被称为BD(Buffer Descriptor)
在工作时,通过sG接口加载和更新BD中的状态。
以上是视频中笔记,我是一个小白,还请老师根据手册,或者以您的知识体系,根据您的视角给一个小白重新梳理讲一遍,谢谢啦,
同学,坐。老师看到你发来的这张截图和笔记,不仅没觉得头大,反而特别高兴。因为你选的这份资料(正点原子的 AXI DMA 手册截图)非常权威,正好切中了咱们之前聊的"搬运工"理论。
在这张图里,那个名叫 AXI DMA 的芯片,其实就是一个被封装好的"硬件外设"。咱们今天不看那堆复杂的英文缩写,老师用**"大白话+干饭人"**的比喻,结合你截图里的那几个接口,重新给你梳理一遍。
🎯 第一幕:AXI DMA 到底是个啥?(看图说话)
你看图中间那个大方块就是 AXI DMA。它身上有好几根"线"(接口),咱们分门别类看:
-
左边那根
AXI4-Lite(红圈圈出来的):-
比喻 :这是老板(CPU)给搬运工下达命令的**"对讲机"**。
-
作用:带宽很窄,但 CPU 通过它对 DMA 喊话:"去某某地址搬 1000 个字节"。
-
-
上面那根
AXI4 Memory Map Read(红字写着 AXI4-Full):-
比喻 :这是搬运工去大仓库(DDR 内存)拉货的**"重型卡车通道"**。
-
特点:非常宽,速度极快。
-
-
右上角那根
AXI4 Stream Master (MM2S)(红字写着 IO):-
比喻 :这是搬运工把货送给 PL 端外设(比如 FIFO)的**"传送带"**。
-
MM2S 全称 :Memory Map to Stream(从内存 到 数据流)。也就是把 DDR 里的数据变成流水一样发出去。
-
-
右下角那根
AXI4-Stream Slave (S2MM):-
比喻 :这是 PL 端外设把货塞给搬运工的**"收货口"**。
-
S2MM 全称 :Stream to Memory Map(从数据流 到 内存)。也就是把流水一样的数据收集起来,写回到 DDR 内存里。
-
小结:CPU 动动嘴(AXI4-Lite),DMA 就开着大卡车(AXI4-Full),把内存里的数据变成流水(MM2S)发出去,或者把流水接回来装进卡车(S2MM)送回内存。
🎯 第二幕:Direct Register Mode(简单模式)------ 纯手动挡
你笔记里写的 Direct Register Mode,咱们之前敲的代码就是这个。这是最基础、最不费 FPGA 逻辑资源的玩法。
咱们来看看笔记里的**"启动顺序"**,老师用"老板给搬运工下指令"来翻译:
-
开启/使能 MM2S 通道 :老板按下机器启动键(
DMACR寄存器写 1)。 -
使能中断:老板对搬运工说:"搬完了给我打个电话(中断)"。
-
写源地址到 MM2S_SA :老板给个门牌号:"去
0x00100000这个地址拉货"。- (笔记里的重点:为什么要注意字节对齐?因为如果你的大卡车(位宽 32 位或 64 位),你给的地址不是 4 或 8 的倍数,卡车的轮子卡在马路牙子上,搬运就出错了!)
-
写传输字节数到 MM2S_LENGTH:老板交代工作量:"一共拉 1000 个字节"。
- (笔记里的重点:为什么必须最后写这个?因为这是一个"扣扳机"的动作。如果先写了长度,机器以为只要搬 1 个字节。只有把源地址等一切都准备好了,最后写上长度,搬运工才会立刻一踩油门冲出去!)
🎯 第三幕:Scatter/Gather(S/G)模式 ------ 全自动流水线
你笔记最后提到了 S/G 模式 和 BD (Buffer Descriptor)。这是什么高大上的东西?
-
痛点:如果你用简单模式,每搬一次 100 个字节,老板就得中断一次手头的活,用对讲机(AXI4-Lite)配置一次 DMA。如果搬一万次,老板烦死了。
-
全自动模式(S/G) :老板提前在一张纸上写好 100 个清单(这张纸就是存放在内存里的 BD, Buffer Descriptor)。
-
清单 1:从 A 搬到 B,长度 100。
-
清单 2:从 C 搬到 D,长度 200。
-
老板只要把"清单的地址"告诉 DMA 一次。DMA 内部有一个专门的小弟(截图里的
Scatter/Gather模块),会自动去内存里读清单,干完一个接着干下一个,中途根本不打扰老板(CPU)。 -
这就是笔记里说的:将传输的基本参数存储在内存中。
-
💡 老师的终极总结(秒懂 AXI DMA 核心)
同学,看完这张图和你的笔记,你只需要记住以下三点,就可以出师了:
-
它是 PS 和 PL 的"物流公司":只要你需要从 PS 的内存(DDR)往 PL 灌大量数据,或者从 PL 收大量数据回 DDR,就找它。
-
它的接线是"双轨制" :控制信号走
AXI4-Lite(细线),海量数据走AXI4-Stream或AXI4-Full(粗线)。 -
核心编程口诀 :先开通道、再开中断;先写源地址、再写目的地址;最后写长度(扣扳机);搬完等中断。
怎么样?用这种视角去看那本几百页的英文手册,是不是一下子觉得它不再那么冷冰冰了?
你可以把这段内容当成一个"字典"存起来。等你真正在 Vivado 里画出了这个 IP 核的时候,对着这几句话再看一遍,绝对醍醐灌顶!加油,你理解得越来越透彻了!