学习内容
本文主要介绍关于AXI DMA的IP核相关内容。
DMA简介
DMA(Direct Memory Access,直接存储器访问)是计算机中一种内存访问技术。它允许某些硬件子系统可以独立地直接读写系统内存,而不需中央处理器( CPU)介入处理。
DMA 是用硬件实现存储器与存储器之间或存储器与 I/O 设备之间直接进行高速数据传输。 使用 DMA时, CPU 向 DMA 控制器发出一个存储传输请求, 这样当 DMA 控制器在传输的时候, CPU 执行其它操作,传输操作完成时 DMA 以中断的方式通知 CPU。
为了发起传输事务, DMA 控制器必须得到以下数据:
- 源地址 — 数据被读出的地址。
- 目的地址 — 数据被写入的地址。
- 传输长度 — 应被传输的字节数。
- DMA 存储传输的过程如下:
- 配置用 DMA 传输数据到存储器,处理器发出操作DMA的指令/代码。
- DMA 控制器把数据从外设传输到存储器或从存储器到存储器,而让 CPU 腾出手来做其它操作。
- 数据传输完成后,向 CPU 发出一个中断信号来通知它 DMA 传输可以关闭了。
AXI DMA IP简介
ZYNQ 提供了两种 DMA,一种是集成在 PS 中的硬核 DMA,另一种是 PL 中使用的软核 AXI DMA IP。
AXI DMA IP提供内存和AX14-Stream接口的目标外设之间的高带宽直接内存访问。它可以选择scatter/gather模式进行数据的传输搬移,可将CPU从数据搬运任务中解放出来。
功能框图
IP的功能框图如下:
由框图可知,通过AXI4-Lite从接口访问初始化、状态并控制和管理寄存器。MM2S接口完成MemoryMap to Stream 的转换,即存储器映射转换到AXI4-Stream接口转换。同理S2MM接口完成Stream to MemoryMap的转换,即AXI4-Stream接口转换到存储器映射转换。图中标注的三个接口只有在S/G模式下才会生成那三个接口进行IP的控制读写以及数据交互。
典型设计解读
在IP的指导手册中有下图这样的一个控制AXI DMA IP的设计系统。在图中我们可以看到,对于处理器(microblaze),只需要使用少量的控制指令,即可完成高速的多数据传输。处理器(microblaze)通过interconnect互联模块连接到AXI4-Lite接口,进行IP的寄存器配置。在AXI DMA IP的完成数据传输时,通过MM2S_IntrOut,S2MM_IntrOut指示数据传输完成,并发送给处理器进行进一步操作。在图中的系统AXI DMA IP使能了S/G模式,该存储器映射接口通过互联模块连接到DDR控制端口,ctrStrm(控制Stream)、StatusStrm(判断Stream状态)和SG R/W是在SG模式下使用的三个端口。剩下的MM2S和S2MM进行数据的交互和传输。
时钟要求
AXI DMA IP,对于不同芯片信号的不同速度、等级下的最大时钟频率有不同的要求。在进行设计开发时,要根据设计芯片的具体型号满足时序要求,避免出现时序伪例的现象。
对于时钟的输入端口,有以下端口:
- m_axi_mm2s_aclk for MM2S interface
- m_axi_s2mm_aclk for S2MM interface
- s_axi_lite_aclk for AXI4-Lite control interface
- m_axi_sg_clk for Scatter Gather Interface
AXI DMA提供两种时钟模式,同步模式和异步模式。
同步模式: 所有的逻辑都连接在一个单一的时钟源,m_axi_mm2s_aclk、m_axi_s2mm_aclk、m_axi_sg_clk必须在一个相同的时钟源下,s_axi_lite_aclk可以连接到更低的时钟。
异步模式: 所有逻辑都可以是异步的,但是s_axi_lite_aclk必须小于或等于m_axi_sg_aclk的时钟频率, m_axi_sg_aclk必须小于或等于m_axi_mm2s_aclk或m_axi_s2mm_aclk的时钟。
在异步模式下,这四类时钟信号所影响到的接口信号,(在SG模式下和单一传输模式)如下图所示:
复位
axi_resetn信号需要持续至少16个最慢的时钟周期,并且需要和s_axi_lite_aclk保持同步。
编程指导
在AXI DMA IP中,一共有三个模式可以进行编程配置:
- Direct Register Mode (Simple DMA)
- Scatter/Gather Mode
- Cyclic DMA Mode
Direct Register Mode (Simple DMA)
简单DMA模式,该模式下,提供了在MM2S和S2MM通道上进行简单的DMA传输的配置。只需要较少的FPGA资源,通过访问DMACR、源地址或者目的地址和长度寄存器发起DMA的传输。当传输完成后,如果使能了产生中断输出,那么DMASR寄存器相关联的通道位会有效,即产生中断输出。
DMA的MM2S通道启动顺序:
- 设置运行/停止位为1 (MM2S_DMACR.RS=1),启动MM2S通道运行。 停止位(DMASR.Halted)应该取消上拉,表示MM2S通道正在运行。
- 可以通过向MM2S_DMACR.IOC_IrqEn和MM2S_DMACR.Err_IrqEn写入1来启用中断。 当AXI DMA配置为Direct Register 模式时,延迟中断、延迟计数和阈值计数不被使用。
- 向MM2S_SA寄存器写入有效的源地址。 如果AXI DMA配置的地址空间大于32,则对MM2S_SA MSB寄存器进行编程。如果AXI DMA没有配置为数据重新对齐,则必须对齐有效地址,否则将出现未定义的结果。认为对齐是或非对齐是基于数据流的宽度。当在Micro 模式下配置AXI DMA时,要进行指定正确的地址。在Micro 模式下配置AXI DMA时,是不关心4K边界的。例如,如果内存映射数据宽度= 32,则如果数据位于字偏移(32位偏移),即Ox0、0x4、0x8、OxC,等等,则数据对齐。如果DRE使能,并且数据宽度小于128,那么源地址可以是任何字节偏移量。
- 在MM2S LENGTH寄存器中写入要传输的字节数。 写为零的值没有任何效果。如果该值不为零,则MM2S LENGTH决定了从MM2S AXI4接口读取并输出到MM2S AXI4- stream接口传输的数据个数。MM2S_LENGTH寄存器必须最后写入。 所有其他MM2S寄存器都可以按任意顺序写入。在Micro DMA下,此值不能超过[突发长度*(内存映射数据宽度)/8]。
DMA的S2MM通道启动顺序:(类似MM2S通道启动顺序)
- 开启/使能S2MM通道
- 如果需要,可以使能中断
- 写一个有效的源地址到S2MM_SA寄存器,如果没有使能DRE功能,在指定起始地址时,要注意字节地址对齐,哪些地址对齐不对齐取决于Stream流的数据位宽。
- 写传输的字节数到LENGTH寄存器。一个长度为0的值是无效的,而一个非0的值将决定存储器映射到Stream流的数据个数。S2MM_LENGTH寄存器必须最后写入。
Scatter/Gather Mode
S/G模式下,AXI DMA操作需要一个存储DMA操作列表的内存驻留数据结构。这个指令列表被组织成所谓描述符链。每个描述符都有一个指向下一个要处理的描述符的指针。链中的最后一个描述符指向链中的第一个描述符。
S/G模式允许一个包被多个描述符描述。此特性的典型用途是允许从内存中的一个位置存储或获取头,并从另一个位置存储有效数据。利用这一点的程序可以提高吞吐量。利用帧起始位(TXSOF)和帧结束位(TXEOF)来描述缓冲区描述符链中的数据包。当DMA获取一个设置了TXSOF位的描述符时,将触发包的开始。包继续获取后续的描述符,直到获取一个设置了TXEOF位的描述符。
在接收(S2MM)通道上,当数据包开始被接收时,AXI DMA用RXSOF标记描述符,指示软件与此描述符相关联的数据缓冲区,包含数据包的开始。如果正在接收的包的字节数比描述符中指定的更长,则使用下一个描述符缓冲区来存储接收包的其余部分。这个获取和存储过程继续进行,直到整个接收包被传输完毕。接收包结束时正在处理的描述符被AXI DMA标记为RXEOF=1。这向软件表明,与此描述符相关联的缓冲区包含包的结尾。
每个描述符的状态字段包含为特定描述符实际传输的字节数。该软件可以通过从RXSOF描述符遍历描述符链到RXEOF描述符来确定接收包传输的总字节数。Scatter Gather继续获取一个额外的描述符并存储。这个过程在很大程度上改善了DMA性能。
S/G模式从设置控制寄存器和描述符指针开始。简单来说,就是把传输的基本参数存储到内存中;这些参数被称为BD(Buffer Descriptor),在工作时,通过SG的接口进行加载和更新BD的状态从而进行对指定的位置的数据进行读写操作。
MM2S通道的DMA操作通过以下顺序建立和启动:
- 将起始描述符的地址写入当前描述符寄存器。 如果AXI DMA被配置为大于32的地址空间,那么也对当前描述符的MSB的32位进行编程。
- 设置运行/停止位为1 (MM2S_DMACR.RS=1),启动MM2S通道运行。 停止位(DMASR.Halted)应该取消上拉,表示MM2S通道正在运行。
- 可以通过向MM2S_DMACR.IOC_IrqEn和MM2S_DMACR.Err_IrqEn写入1来启用中断。
- 向尾部描述符寄存器写入一个有效地址。 如果AXI DMA被配置为大于32的地址空间,那么也对尾部描述符的MSB 32位进行编程。
- 写入尾描述符寄存器将触发DMA开始从内存中获取描述符。 在多通道配置的情况下,当数据包到达S2MM通道时开始获取描述符。
- 对获取的描述符进行处理,数据从内存中读取,然后输出到MM2S流通道。
S2MM通道的DMA操作通过以下顺序建立和启动:
- 将起始描述符的地址写入当前描述符寄存器。 如果AXI DMA被配置为大于32的地址空间,那么也对当前描述符的MSB 32位进行编程。
- 设置运行/停止位为1 (S2MM_DMACR.RS=1),启动S2MM通道运行 停止位(DMASR.Halted)应该取消上拉,表示MM2S通道正在运行。
- 可以通过向MM2S_DMACR.IOC_IrqEn和MM2S_DMACR.Err_IrqEn写入1来启用中断。
- 向尾部描述符寄存器写入一个有效地址。 如果AXI DMA被配置为大于32的地址空间,那么也对当前描述符的MSB 32位进行编程。
- 写入尾描述符寄存器将触发DMA开始从内存中获取描述符。
- 对获取的描述符进行处理,并将从S2MM流通道接收的任何数据写入内存。
Cyclic DMA Mode
通过对缓冲区描述符(BD)链设置进行某些更改,AXI DMA可以以循环模式运行。在循环模式下,DMA不中断地获取和处理相同的BDs。DMA继续获取和处理,直到停止或重置为止。为了使循环运行,BD链的设置如下图所示:
在这个设置中,Tail BD指向第一个BD, Tail Descriptor(尾描述寄存器)没有任何用途,仅用于触发DMA。遵循在S/G模式中提到的相同编程顺序。确保控制寄存器中的循环位已设置。在编写了Tail Descriptor寄存器之后,DMA开始获取和处理BDs(以环形方式设置),直到DMA停止或重置。
Reference
- PG021_axi_dma
- 正点原子开发视频