学习内容

本文主要介绍关于AXI DMA的IP核相关内容。

DMA简介

DMA(Direct Memory Access,直接存储器访问)是计算机中一种内存访问技术。它允许某些硬件子系统可以独立地直接读写系统内存,而不需中央处理器( CPU)介入处理。

DMA 是用硬件实现存储器与存储器之间或存储器与 I/O 设备之间直接进行高速数据传输。 使用 DMA时, CPU 向 DMA 控制器发出一个存储传输请求, 这样当 DMA 控制器在传输的时候, CPU 执行其它操作,传输操作完成时 DMA 以中断的方式通知 CPU。

为了发起传输事务, DMA 控制器必须得到以下数据:

  • 源地址 — 数据被读出的地址。
  • 目的地址 — 数据被写入的地址。
  • 传输长度 — 应被传输的字节数。

    DMA 存储传输的过程如下:
  1. 配置用 DMA 传输数据到存储器,处理器发出操作DMA的指令/代码。
  2. DMA 控制器把数据从外设传输到存储器或从存储器到存储器,而让 CPU 腾出手来做其它操作。
  3. 数据传输完成后,向 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. 设置运行/停止位为1 (MM2S_DMACR.RS=1),启动MM2S通道运行。 停止位(DMASR.Halted)应该取消上拉,表示MM2S通道正在运行。
  2. 可以通过向MM2S_DMACR.IOC_IrqEn和MM2S_DMACR.Err_IrqEn写入1来启用中断。 当AXI DMA配置为Direct Register 模式时,延迟中断、延迟计数和阈值计数不被使用。
  3. 向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,那么源地址可以是任何字节偏移量。
  4. 在MM2S LENGTH寄存器中写入要传输的字节数。 写为零的值没有任何效果。如果该值不为零,则MM2S LENGTH决定了从MM2S AXI4接口读取并输出到MM2S AXI4- stream接口传输的数据个数。MM2S_LENGTH寄存器必须最后写入。 所有其他MM2S寄存器都可以按任意顺序写入。在Micro DMA下,此值不能超过[突发长度*(内存映射数据宽度)/8]。

DMA的S2MM通道启动顺序:(类似MM2S通道启动顺序)

  1. 开启/使能S2MM通道
  2. 如果需要,可以使能中断
  3. 写一个有效的源地址到S2MM_SA寄存器,如果没有使能DRE功能,在指定起始地址时,要注意字节地址对齐,哪些地址对齐不对齐取决于Stream流的数据位宽。
  4. 写传输的字节数到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操作通过以下顺序建立和启动:

  1. 将起始描述符的地址写入当前描述符寄存器。 如果AXI DMA被配置为大于32的地址空间,那么也对当前描述符的MSB的32位进行编程。
  2. 设置运行/停止位为1 (MM2S_DMACR.RS=1),启动MM2S通道运行。 停止位(DMASR.Halted)应该取消上拉,表示MM2S通道正在运行。
  3. 可以通过向MM2S_DMACR.IOC_IrqEn和MM2S_DMACR.Err_IrqEn写入1来启用中断。
  4. 向尾部描述符寄存器写入一个有效地址。 如果AXI DMA被配置为大于32的地址空间,那么也对尾部描述符的MSB 32位进行编程。
  5. 写入尾描述符寄存器将触发DMA开始从内存中获取描述符。 在多通道配置的情况下,当数据包到达S2MM通道时开始获取描述符。
  6. 对获取的描述符进行处理,数据从内存中读取,然后输出到MM2S流通道。

S2MM通道的DMA操作通过以下顺序建立和启动:

  1. 将起始描述符的地址写入当前描述符寄存器。 如果AXI DMA被配置为大于32的地址空间,那么也对当前描述符的MSB 32位进行编程。
  2. 设置运行/停止位为1 (S2MM_DMACR.RS=1),启动S2MM通道运行 停止位(DMASR.Halted)应该取消上拉,表示MM2S通道正在运行。
  3. 可以通过向MM2S_DMACR.IOC_IrqEn和MM2S_DMACR.Err_IrqEn写入1来启用中断。
  4. 向尾部描述符寄存器写入一个有效地址。 如果AXI DMA被配置为大于32的地址空间,那么也对当前描述符的MSB 32位进行编程。
  5. 写入尾描述符寄存器将触发DMA开始从内存中获取描述符。
  6. 对获取的描述符进行处理,并将从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

  1. PG021_axi_dma
  2. 正点原子开发视频

ZYNQ-AXI DMA IP简介相关推荐

  1. ZYNQ-使用AXI DMA IP进行环路测试

    学习内容 前文对AXI DMA IP进行了简介,本文使用AXI DMA IP进行环路测试. 开发环境 vivado 18.3&SDK,PYNQ-Z2开发板. 系统框图 本次工程使用ZYNQ开发 ...

  2. ZYNQ | AXI DMA数据环路测试

    利用AXI DMA进行批量数据环路的测试 背景 软硬件平台 原理概述 工程搭建 1.新建一个vivado工程 2.创建block design ①zynq ip核的添加与配置 ②AXI DMA ip核 ...

  3. ZYNQ7 AXI DMA IP核应用测试

    ZYNQ7 AXI DMA IP核应用 硬件环境搭建 Vivado新建工程(2018.2为例) 添加IP核 配置IP核参数 ZYNQ7: 调节时钟频率为100M 添加HP接口用于DMA和DDR交互 添 ...

  4. AXI DMA IP核操作流程

    直接寄存器模式 访问DMACR,SA,DA,length寄存器初始化DMA传输,当传输完成,相关通道的DMASR.IOC_Irq有效(前提是使能该中断,DMACR.IOC_IrqEn使能). MM2S ...

  5. ZYNQ学习之路11.AXI DMA

    一. AXI DMA简介 AXI DMA IP核提供了AXI4内存之间或AXI4-Stream IP之间的内存直接访问,可选为分散收集工作模式,初始化,状态和管理寄存器等通过AXI4-Lite 从机几 ...

  6. ZYNQ基础---AXI DMA使用

    前言   在ZYNQ中进行PL-PS数据交互的时候,经常会使用到DMA,其实在前面的ZYNQ学习当中,也有学习过DMA的使用,那就是通过使用自定义的IP,完成HP接口向内存写入和读取数据的方式.同样X ...

  7. xilinx axi dma 深入开发(一)

    以下为官方 axidma-proxy 源码 /*** Copyright (C) 2021 Xilinx, Inc** Licensed under the Apache License, Versi ...

  8. Xilinx HLS实现AXI DMA

    在本文中,我们将通过HLS自己动手实现一个AXI DMA,仿照的是官方AXI DMA IP核的直接模式,即给定发送起始地址和发送长度,以及接收起始地址和接收长度,就能进行一次DMA传输. HLS设计 ...

  9. ZU9 AXI DMA使用问题-收发数据过程和时序关系AXISTREAM FIFO - GTH结合问题

    首先参考如下文章,给了我很大启发,我这部分复位确实是按照环路做的,避开了坑.而我的设计中PL端时钟和PS端不是一个时钟,就出现了各种问题 ZYNQ AXI DMA使用问题_AE_小良的博客-CSDN博 ...

  10. ZYNQ中DMA与AXI4总线-DMA简介

    ZYNQ中DMA与AXI4总线 为什么在ZYNQ中DMA和AXI联系这么密切?通过上面的介绍我们知道ZYNQ中基本是以AXI总线完成相关功能的: 图4‑34 连接 PS 和 PL 的 AXI 互联和接 ...

最新文章

  1. 抓包工具tcpdump及分析工具wireshark
  2. Newton-Raphson method
  3. mybatis resultmap嵌套_Java面试专题之九:Mybatis面试5个大概率被问到的问题
  4. JQUERY AJAX无刷新异步上传文件
  5. 大学英语期末考计算机上答卷,英语期末考试总结范文(精选5篇)
  6. CSS Day04 css核心基础
  7. 利用递归统一化函数参数的不固定数据类型
  8. 贺利坚老师汇编课程26笔记:LOOP指令使用再议
  9. Thread之四:java线程返回结果的方法
  10. 《啊哈!算法》-----系列更新暂时停止
  11. 推荐一个插件: The Great Suspender,大大减少chrome浏览器内存占用量
  12. 加拿大卡尔顿大学暑课两个月入门Java全记录_1
  13. 2021,自动驾驶的“五代十国”
  14. 删除win10自带微软中文输入法
  15. 百思不得姐框架(二)
  16. android 录屏工具,android实现录屏小功能
  17. 华为天猫官方旗舰店粉丝突破一千万
  18. node批量修改文件扩展名
  19. 零基础学前端- 01- HTML基础--基本概念(建议收藏)
  20. 透彻理解“对数”概念及其在量化交易中的意义

热门文章

  1. Minecraft Mod开发:1-配置工作环境
  2. 使用 Ubuntu 搭建 Minecraft 官方或Mod(Forge)服务器
  3. mysql必背50_Mysql必知必会mysql学习笔记(五)
  4. old-style parameter declarations in prototyped function definition
  5. 背包问题(旅游记得带零钱)
  6. 机器学习如何优化策略游戏
  7. html5 雷达,最强大脑雷达探点HTML5版本(示例代码)
  8. 炉石传说 android,炉石传说安卓版
  9. cpci无法检索_CPCI是什么检索
  10. 2D游戏平滑的迷雾战争效果