目录
Direct Register Mode(Simple DMA)
大家好,这里是程序员杰克。一名平平无奇的嵌入式软件工程师。
上一篇推送中对AXI DMA的功能特性、引脚信号、寄存器进行了说明,本篇推送主要是对AXI DMA的连接使用、时钟信号、编程步骤进行说明。如需要更详细深入地了解,建议详看Xilinx官方文档《PG021_axi_dma.pdf》。
01 系统连接
AXI DMA系统连接
-
MicroBlaze(软核)系统连接框图如下:
模块 | 说明 |
①微处理器 | MicroBlaze是Xilinx的软核,使用ZYNQ芯片的硬核连接时,连接的方式是一致的。 |
②内存 | DDRx内存控制器,DMA通过AXI总线对内存进行寻址和读写数据。 |
③DMA | AXI DMA IP核。 |
④ETH流设备 | AXI Ethernet外设,通过AXI-Stream总线与DMA进行数据交互。 |
特别说明: 在微处理器、内存、AXI DMA之间的通信总线是AXI总线,其是基于memory-mapped(内存映射)方式,即控制操作是通过读写寄存器进行控制的; 而AXI DMA是通过AXI-Stream总线与其他的流外设进行通信;对于AXI、AXI-Lite、AXI-Stream总线的总结介绍后续会有推送; |
02 接口描述
Clocking接口
-
时钟输入接口
接口信号 | 说明 |
m_axi_mm2s_aclk | MM2S接口时钟 |
m_axi_s2mm_aclk | S2MM接口时钟 |
s_axi_lite_aclk | AXI Lite接口时钟 |
m_axi_sg_clk | Scatter Gather接口时钟 |
-
时钟模式
模式 | 说明 |
asynchronous (异步模式) | 在异步模式下,其允许数据路径运行在更高的时钟频率(比DMA的任何时钟高),有助于FPGA的placement和timing |
synchronous (同步模式) | 在同步模式下,所有的逻辑都在同一个时钟域中运行。m_axi_mm2s_aclk、m_axi_s2mm_aclk、m_axi_sg_clk必须连接到同一个时钟源;s_axi_lite_aclk可以与其他一样连接或者连接低于其他频率的时钟 |
异步模式下Core信号与时钟域的关系如下:
复位接口
对于AXI DMA Core而言,axi_resetn复位同步于s_axi_lite_aclk,并且信号的低电平至少维持16个时钟脉冲(s_axi_lite_aclk)。
03 编程思路
Direct Register Mode(Simple DMA)
Simple DMA模式提供了一个消耗较少的资源、通过MM2S和S2MM通道进行数据传输的DMA方式。传输通过读写DMACR、Source Address、Destination Address以及Length寄存器进行控制。通过S2MM通道进行DMA操作如下表所示:
操作通道 | 实现描述 |
S2MM[接收] (从机->主机) |
|
MM2S[发送] (主机->从机) |
特别说明: 其他步骤的顺序可以不一致,MM2S_LENGTH寄存器的写入操作必须是最后执行。 |
Scatter/Gather Mode
AXI DMA操作需要memory-resident(内存常驻)数据结构来维持DMA操作的实现以及信息的记录,该数据结构就是Descriptor(描述符)。
每个Descriptor有一个指针,指针指向下一个描述符,即组成了Descriptor Chain(描述符链表)。
SG模式通过描述符以及其组成的链表来维持DMA执行、信息记录等操作的实现。通过Descriptor进行DMA操作如下表所示:
操作通道 | 描述 |
MM2S[发送] (主机->从机) |
|
S2MM[接收] (从机->主机) |
|
Cyclic DMA Mode
AXI DMA可以运行在Cyclic模式,将Tail Descriptor的指针指向Start Descriptor,即组成了循环模式。在循环模式下,DMA不间断地获取和处理Descriptor Chain的内容。跟Scatter/Gather模式不同,向Tail Descriptor寄存器写入地址时仅仅是启动DMA传输。当DMA执行到Tail Descriptor时不会停止,而是跳转回Start Descriptor继续执行。模型如下所示:
04 文章总结
对于开发者而言,要深入了解该IP核的具体内容,还得是啃官方的参考文档部分内容。
参考文档:
《PG021_axi_dma.pdf》