在上一篇文章中简要介绍了AXI DMA的特性,本文将就这一重要的功能模块做详细的介绍,主要分为以下几个部分:
一、关于DMA的介绍
二、利用一个SG DMA的环通测试实验进一步了解DMA的应用
三、通过上板验证BD链表的创建
四、关于中断的一些内容补充
上一篇文章的链接如下:
一、DMA介绍
通过学习ZYNQ开发可以得知PL 和 PS 的高效交互是 ZYNQ开发的重中之重,通常情况下我们需要将PL 端的大量数据实时送到 PS 端处理,或者将 PS 端处理结果实时送到 PL 端处理。在PS和PL之间的主要连接是通过一组9个AXI接口,每个接口有多个通道组成,其接口及相关描述如下:
其中AXI GP(General Purpose AXI)接口为通用接口,适用于PL和PS之间的中低速通信。通常情况下, ARM 可以利用M_AXI_GP 主机接口主动访问 PL 逻辑,ARM通过将PL映射到某个地址的方式来读写PL寄存器。
HP 口是 High-Performance Ports 的缩写,四个高性能 AXI 接口,带有FIFO缓冲来提供“批量”读写操作,并支持PL和PS中的存储器单元的高速率通信。
这两个端口在ZYNQ中的设置方式如下:
然而,通常情况下我们不会直连具有AXI4接口的IP核与AXI_HP接口来实现PL与PS端之间的数据交互,示例如下(图片摘自领航者ZYNQ之嵌入式SDK开发指南——第十七章):
显然,外设数据读入内存或者将内存传送到外设,一般都要通过 CPU 控制完成,如采用查询或中断方式。然而,对于高速、批量传输数据的情景下,虽然中断的方式可以提高CPU的利用率,但是PL端反复的发起中断再经CPU处理显然会十分影响CPU的效率与数据传输速度。此时,采用DMA的方式可以解决上述难点。
CPU 只需要提供地址和长度给 DMA,DMA 即可接管总线,访问内存,等 DMA 完成工作后,告知 CPU,交出总线控制权。即DMA的工作主要由下面三点构成
- 处理器(CPU)发出一条DMA命令,配置DMA传输的地址、长度、中断等,启动DMA传输
- CPU处理其他操作,DMA控制器将数据从外设/存储器传输到存储器
- 数据传输完成,DMA发出中断通知CPU关闭DMA传输。
AXI DMA IP在AXI4内存映射与AXI4-Stream接口之间提供了高宽带直接存储访问。核心的功能如下图所示:
AXI DMA用到了三种总线:
- AXI4-Lite 用于对寄存器进行配置
- AXI4 Memory Map 用于与内存交互,又分为AXI4 Memory Map Read(M_AXI_MM2S)和AXI4 Memory Map Write(M_AXI_S2MM)两个接口,前者对内存读,后者对内存写。
- AXI4 Stream接口用于对外设的读写,其中AXI4 Stream Master(MM2S,Memory Map to Stream)用于对外设写,AXI4-Stream Slave(S2MM,Stream to Memory Map)用于对外设读。