ZYNQ AXI DMA(Drect Memory Access)①
ZYNQ AXI DMA放一点资料
·
1.今日摸鱼计划
|
学习PS与PL之间的交互
Xilinx 官方提供了许多可进行协议转换的 IP 核,如 DMA、VDMA、AXI-FIFO-MM2S、AXI-Datamover等。这些 IP 核都能对 AXI4-Stream 协议 进行转换,实现 PS 与 PL 间数据的交互。其中的 DMA IP 核在嵌入式开发中属于 较常用的一个 IP 核,常常被用于在系统内存和基于 AXI4 流的目标 IP(如 AXI 以太网)之间提供高速数据移动。
|
| 学一下AXI DMA基础 |
|
小梅哥教材: 03_【裸机教程】基于C编程的Zynq裸机程序设计与应用教程v2.4.5.pdf 17.1 AXI DMA 简介 |
2. 简单学习一下
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
系统内存和传输的目标之间主要通过高速 DMA数据传输,数据之间的流向是 :
① AXI4 读数据的主端口到 AXI4 内存映射流(Memory-Mapped To Stream,MM2S);
② 通过数据流到内存映射(Stream To Memory-Mapped,S2MM)从外设写入到内存中
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
AXI DMA 还支持在分散/聚集模式下,MM2S 和 S2MM 路径上最多 16 个多通道的数据传输。
MM2S 通道和 S2MM 通道独立运行。
AXI DMA 提供 4KB 地址边界保护(在非 Micro DMA中配置时)、自动突发映射以及使用 AXI4-Stream 总线的几乎全部带宽功能对多个传输请求进行排队的能力。
此外,AXI DMA 提供字节级数据重新对齐,允许从任何字节偏移位置开始进行内存读取和写入。
MM2S 通道支持用于将用户应用数据发送到目标 IP 的 AXI 控制流。
对于S2MM 通道,提供了一个 AXI 状态流,用于从目标 IP 接收用户应用数据。
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2.1 AXI DMA 设计样例 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
该设计中AXI DMA工作在SG模式(Scatter-Gather分散-聚集)下,AXI Ethernet可以切换为用户系统,
各个接口对应功能如下:
处理器、中断控制、 DDR 控制器通过AXI interconnect连接到 AXI4-Lite 接口,对 DMA 进行控制。
MM2S Read 负责读出 DDR 中映射单元的数据到 DMA 中。
S2MM Write 负责将数据从 DMA 写入到 DDR 的映射单元中。
Master Strm 接口负责将数据从 DMA 发送到具有 Stream 的 IP 接口。
S2MM Strm 负责从具有 Stream 接口的 IP 中将数据读入 DMA。
MM2S_IntrOut 中断:DMA 完成读出 DDR 中数据并发送到具有 Stream 接口的 IP 操作时产生。
S2MM_IntrOut 中断:DMA 完成从有 Stream 接口的 IP 中读入数据,并写到内存映射单元时产生。
SG R/W、Ctr Strm、Status Strm 为 SG 模式下的三个接口。
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2.2 时钟与时钟模式 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
m_axi_mm2s_aclk:用于 MM2S 接口
m_axi_s2mm_aclk:用于 S2MM 接口
s_axi_lite_aclk:用于 AXI4-Lite 控制接口
m_axi_sg_clk:用于 SG 接口
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
①同步时钟 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
m_axi_sg_aclk、m_axi_mm2s_aclk、m_axi_s2mm_aclk:同一个时钟源
s_axi_lite_aclk 可以连接到频率更低的时钟
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
②异步时钟 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
s_axi_lite_aclk 必须小于或等于 m_axi_sg_aclk
m_axi_sg_aclk 必须小于或等于 min{m_axi_mm2s_aclk ,m_axi_s2mm_aclk }
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2.3 工作模式 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
①Direct Register Mode (Simple DMA) |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
直接寄存器模式(简单 DMA模式,SG引擎禁用): MM2S和 S2MM 通道上简单 DMA 传输。
只需较少FPGA资源,通过访问 DMACR、源地址或者目的地址和长度寄存器发起 DMA 的传输。
当传输完成后,如果使能了产生中断输出, DMASR 寄存器相关联的通道位会有效,即产生中断输出。
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MM2S 信道 :
a.设置运行/停止位为 1 (MM2S_DMACR.RS=1),启动 MM2S。
停止位(DMASR.Halted)应该取消上拉,表示 MM2S 通道正在运行。
b.可以通过向 MM2S_DMACR.IOC_IrqEn 和 MM2S_DMACR.Err_IrqEn写1启用中断。
当 AXI DMA 配置为 Direct Register 模式时,延迟中断、延迟计数和阈值计数不被使用。
c.将有效的源地址写入 MM2S_SA 寄存器。
如果为AXI DMA 分配的地址空间大于 32,则对 MM2S_SA MSB 寄存器进行编程。
如未将AXI DMA 配置为数据重新对齐,则必须对齐有效地址,否则将出现未定义的结果。
对齐与否的判定内容基于数据流的宽度。
当在 Micro 模式下配置 AXI DMA 时,需要指定正确的地址。
d.在 MM2S_LENGTH寄存器中写入要传输的字节数。必须最后写入
MM2S_LENGTH 从 MM2S AXI4 接口读取,并从 MM2S AXI4- stream 接口输出。
在 Micro DMA 下,此值不能超过[突发长度*(内存映射数据宽度)/8]。
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
S2MM 信道:
a. 开启/使能 S2MM 通道
b. 如果需要,可以使能中断
c. 写一个有效的源地址到 S2MM_SA 寄存器
如果没有使能 DRE(Data Realignment Engine,数据重对齐引擎) 功能,
在指定起始地址时,要注意字节地址对齐,哪些地址对齐不对齐取决于 Stream 流的数据位宽。
d. 写传输的字节数到 LENGTH 寄存器。必须最后写入
长度为 0 无效,而非 0 的值决定存储器映射到 Stream 流的数据个数。
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
②Scatter/Gather Mode 需要进行大量数据传输的场合 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
S/G 模式从设置控制寄存器和描述符指针开始。
传输的基本参数BD(Buffer Descriptor)存储到内存中。
通过 SG 的接口进行加载和更新 BD 的状态从而进行对指定的位置的数据进行读写操作。
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MM2S 信道 :
a. 将起始描述符的地址写入当前描述符寄存器。
如果 AXI DMA 被配置为大于 32 的地址空间,那么也对当前描述符的 MSB 32 位进行编程。
b. 设置运行/停止位为 1 (MM2S_DMACR.RS=1),启动 MM2S 通道运行。
停止位(DMASR.Halted)应该取消上拉,表示 MM2S 通道正在运行。
c. 可以通过向 MM2S_DMACR.IOC_IrqEn 和 MM2S_DMACR.Err_IrqEn 写1 启用中断。
d. 向尾部描述符寄存器写入一个有效地址。
如果 AXI DMA 被配置为大于32 的地址空间,那么也对当前描述符的 MSB 32 位进行编程。
e. 写入尾部描述符寄存器会触发 DMA 开始从内存中获取描述符。
在多通道配置的情况下,描述符的获取在数据包到达 S2MM 通道时开始。
f. 对获取的描述符进行处理,从内存中读取数据,然后输出到 MM2S 流通道。
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
S2MM 信道:
a. 将起始描述符的地址写入当前描述符寄存器。
如果 AXI DMA 被配置为大于 32 的地址空间,那么也对当前描述符的 MSB 32 位进行编程。
b. 设置运行/停止位为 1 (S2MM_DMACR.RS=1),启动 S2MM 通道运行
停止位(DMASR.Halted)应该取消上拉,表示 S2MM通道正在运行。
c. 可以通过向 S2MM_DMACR.IOC_IrqEn 和 S2MM_DMACR.Err_IrqEn 写1 启用中断。
d. 向尾部描述符寄存器写入一个有效地址。
如果 AXI DMA 被配置为大于 32 的地址空间,那么也对当前描述符的 MSB 32 位进行编程。
e. 写入尾描述符寄存器将触发 DMA 开始从内存中获取描述符。
f. 对获取的描述符进行处理,并将从 S2MM 流通道接收的任何数据写入内存。
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
③Cyclic DMA Mode |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
在循环模式下,DMA 无中断地获取和处理相同的 BDs,DMA 会一直获取和处理,直到停止或重置。
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Tail BD 指向第一个 BD。
尾描述符寄存器没有任何用途,仅用于触发 DMA 引擎。
遵循 S/G 模式中提到的相同编程顺序,确保设置了控制寄存器中的循环位。
可以使用一些不属于 BD 链的值对尾部描述符寄存器进行编程,如 0x50。
在尾部描述符寄存器编程后,DMA 开始获取和处理 BDs(以环形方式设置),直到 DMA 停止或重置。
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2.4 直接寄存器模式对应寄存器空间 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 偏移地址 | 名称 | 描述 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
00h
|
MM2S_DMACR | MM2S DMA 控制寄存器 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 04h |
MM2S_DMASR
|
MM2S DMA 状态寄存器 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 18h |
MM2S_SA
|
MM2S 低 32 位源地址 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 1Ch |
MM2S_SA_MSB
|
MM2S 高 32 位源地址 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 28h | MM2S_LENGTH | MM2S 传输长度(Byte) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 30h | S2MM_DMACR | S2MM DMA 控制寄存器 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 34h | S2MM_DMASR | S2MM DMA 状态寄存器 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 48h | S2MM_DA | S2MM 低 32 位目的地址 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 4Ch | S2MM_DA_MSB | S2MM 高 32 位目的地址 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 58h | S2MM_LENGTH | S2MM 缓冲区长度(Byte) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
这些寄存器共有三种访问类型,分别为:只读(RO)、可读写(R/W)、读或写清除(R/WC)。
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
只读寄存器,向其中某位写入值不会产生任何影响;
读或写清除寄存器,向对应位写入 1 将会清除该位。
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
①DMACR( 控制寄存器)
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
②DMASR( 状态寄存器)
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
③MM2S_SA MM2S_SA_MSB(MM2S DMA源地址寄存器)
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
④S2MM_DA S2MM_DA_MSB(S2MM DMA目的地址寄存器)
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
⑤LENGTH( 传输长度寄存器)
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
更多推荐














所有评论(0)