Zynq7000系列FPGA中DMA引擎编程指南

DMA引擎的编程指南通常涉及一系列步骤和API调用,以确保数据在内存之间的高效传输,而无需CPU的直接干预。

DMA引擎的编程指南包括以下部分:

一、编写微代码为AXI事务编写CCRx程序

通道微码用于设置dmac.CCRx寄存器以定义AXI事务的属性。这是通过使用DMAMOV CCR指令完成的。
在启动DMA传输之前,用户应该通过写入dmac.CCR{7:0}寄存器对微码进行编程。以下是微码中写入的AXI属性:

  1. 基于突发的类型(递增或固定地址)对src_inc和dst_inc比特字段进行编程。这会影响ARBURST[0]和AWBURST[0]AXI信号。
  2. 对src_burst_size和dst_burst_size比特字段(AXI上每个数据节拍的字节数)进行编程。这会影响ARSIZE[2:0]和AWSIZE[2:0]AXI信号。
  3. 对src_burst_len和dst_burst_len比特字段(每个AXI突发事务的数据节拍数)进行编程。这会影响ARLEN[3:0]和AWLEN[3.0]AXI信号。
  4. 对src_cache_ctrl和dst_cache_ctrl位字段进行编程(缓存策略)。这会影响ARCACHE[2:0]和AWCACHE[2:0]AXI信号。
  5. 对src_prot_ctrl和dst_prot_ctrl位字段(管理器线程的安全状态)进行编程。如果管理器线程是安全的,则ARPROT[1]应设置为0,如果不安全,则应设置为1。ARPROT[0]和ARPROT[2]值应设置为=0。例如:

          --如果DMA管理器是安全的,则设置src_prot_ctrl=0'b0000;

          --如果DMA管理器是不安全的,则设置scr_prot_ctrl=0'b010。

      6. 程序endian_swap_size=0(不交换)

二、内存到内存的传输

显示DMAC操作以执行对齐、未对齐和固定数据传输的微码示例。对齐传输请参见表1,未对齐传输请参阅表2,固定传输请参阅图3。
注意:如果DMA传输使用缓存,程序员应确保使用适当的缓存操作来保持缓存一致性。在对DMA通道进行编程之前,应清除与存储器地址范围相对应的高速缓存条目并使其无效。

表1 DMAC对齐内存到内存的传输
描述代码MFIFO使用

简单对齐程序
在这个程序中,源地址和目的地址与AXI数据总线宽度对齐。

DMAMOV CCR, SB4 SS64
DB4 DS64
DMAMOV SAR, 0x1000
DMAMOV DAR, 0x4000
DMALP 16
DMALD
DMAST
DMALPEND
DMAEND

每个DMALD需要四个条目,而每个DMAST删除四个条目。
此示例具有零个MFIFO条目的静态要求和四个MFIF奥条目的动态要求。

具有多个负载的对齐不对称程序
以下程序为每个存储执行四次加载,并且源地址和目标地址与AXI数据总线宽度对齐。

DMAMOV CCR, SB1 SS64
DB4 DS64
DMAMOV SAR, 0x1000
DMAMOV DAR, 0x4000
DMALP 16
DMALD
DMALD
DMALD
DMALD
DMAST
DMALPEND

每个DMALD需要一个条目,而每个DMAST删除四个条目。
此示例具有零个MFIFO条目的静态要求和四个MFIF奥条目的动态要求。

具有多个存储的对齐不对称程序
以下程序为每个加载执行四个存储,并且源地址和目的地地址与AXI数据总线宽度对齐。

DMAMOV CCR, SB4 SS64
DB1 DS64
DMAMOV SAR, 0x1000
DMAMOV DAR, 0x4000
DMALP 16
DMALD
DMAST
DMAST
DMAST
DMAST
DMALPEND
DMAEND

每个DMALD需要四个条目,而每个DMAST删除一个条目。
此示例具有零个MFIFO条目的静态要求和四个MFIF奥条目的动态要求。

表2 DMAC未对齐传输
描述代码MFIFO使用

已对齐的源地址与未对齐的目标地址
在这个程序中,源地址与AXI数据总线宽度对齐,但目标地址不对齐。目的地址未与目的突发大小对齐,因此第一DMAST指令删除的数据少于第一DMALD指令读取的数据。
因此,需要单个字的最后DMAST来清除MFIFO中的数据。

DMAMOV CCR, SB4 SS64
DB4 DS64
DMAMOV SAR, 0x1000
DMAMOV DAR, 0x4004
DMALP 16
DMALD
DMAST
DMALPEND
DMAMOV CCR, SB4 SS64
DB1 DS32
DMAST
DMAEND

第一条DMALD指令加载四个双字,但由于目标地址未对齐,DMAC将它们移位四个字节,因此它只删除第一个循环中的三个条目,留下一个静态MFIFO条目。每个DMAST只需要四个数据条目,因此额外的条目在程序的持续时间内一直使用,直到最后一个DMAST清空为止。
此示例具有一个MFIFO条目的静态需求和四个MFIF奥条目的动态需求。

未对齐的源地址与对齐的目标地址
在这个程序中,源地址与AXI数据总线宽度不对齐,但目的地址对齐。源地址未与源突发大小对齐,因此第一个DMALD指令读取的数据少于DMAST所需的数据。
因此,需要额外的DMALD来满足第一DMAST。

DMAMOV CCR, SB4 SS64
DB4 DS64
DMAMOV SAR, 0x1004
DMAMOV DAR, 0x4000
DMALD
DMALP 15
DMALD
DMAST
DMALPEND
DMAMOV CCR, SB1 SS32
DB4 DS64
DMALD
DMAST
DMAEND

第一DMALD指令没有加载足够的数据以使DMAC能够执行DMAST,因此在循环开始之前,程序包括额外的DMALD。在第一个DMALD之后,随后的DMALD与源突发大小对齐。这优化了性能,但需要更多的MFIFO条目。
此示例具有四个MFIFO条目的静态需求和四个MFINFO条目的动态需求。

未对齐的源地址到对齐的目标地址,初始负载过多
此程序是未对齐的源地址到对齐的目标地址中描述的程序的替代方案。该程序使用不同的源突发序列,这可能效率较低,但需要较少的MFIFO条目。

DMAMOV CCR, SB5 SS64
DB4 DS64
DMAMOV SAR, 0x1004
DMAMOV DAR, 0x4000
DMALD
DMAST
DMAMOV CCR, SB4 SS64
DB4 DS64
DMALP 14
DMALD
DMAST
DMALPEND
DMAMOV CCR, SB3 SS64
DB4 DS64
DMALD
DMAMOV CCR, SB1 SS32
DB4 DS64
DMALD
DMAST
DMAEND

第一DMALD指令加载五拍数据以使DMAC能够执行第一DMAST。
在第一个DMALD之后,后续的DMALD不与源突发大小对齐,例如第二个DMALD从地址0x1028读取。在循环之后,最后两个DMALD读取满足最终DMAST所需的数据。
此示例具有一个MFIFO条目的静态需求和四个MFIF奥条目的动态需求。

对齐的突发大小,未对齐的MFIFO
在该程序中,比MFIFO宽度窄的目标地址与突发大小对齐,但不与
MFIFO宽度。

DMAMOV CCR, SB4 SS32
DB4 DS32
DMAMOV SAR, 0x1000
DMAMOV DAR, 0x4004
DMALP 16
DMALD
DMAST
DMALPEND
DMAEND
如果DMAC配置具有32位AXI数据总线宽度,则该程序需要四个MFIFO条目。然而,在这个例子中,DMAC具有64位AXI数据总线宽度,并且由于目的地地址不是64位对齐的,所以它需要三个而不是预期的两个MFIFO条目。
此示例具有零个MFIFO条目的静态要求和三个MFIF奥条目的动态要求。

表3 DMAC固定传输

描述代码MFIFO使用

地址对齐的固定目的地
在这个程序中,源地址和目的地地址与AXI数据总线宽度对齐,目的地地址是固定的。

DMAMOV CCR, SB2 SS64
DB4 DS32 DAF
DMAMOV SAR, 0x1000
DMAMOV DAR, 0x4000
DMALP 16
DMALD
DMAST
DMALPEND
DMAEND

程序中的每个DMALD将两个64位数据传输加载到MFIFO中。因为目的地地址是32位固定地址,所以DMAC将每个64位数据项拆分为MFIFO中的两个条目。
此示例具有零个MFIFO条目的静态要求和四个MFIF奥条目的动态要求。

三、PL外设DMA传输长度管理

示例:由外围设备管理的长度

以下示例显示了一个DMAC程序,当外围设备发送突发请求(DMA{3:0}_DRTYPE[1:0]=01)时,该程序将64个字从存储器传输到外围设备0。当外围设备发送单个请求(DMA{3:0}_DRTYPE[1:0]=00)时,DMAC程序将一个字从存储器传输到外围设备0。

为了传输64个字,程序指示DMAC执行16个AXI总线事务。每个事务由4比特突发(SB=4,DB=4)组成,其每个节拍移动一个数据字(SS=32,DS=32)。

在本例中,程序显示了以下说明的使用:

  • DMAWFP指令——DMAC等待来自外围设备的突发或单个请求。
  • DMASTPB和DMASTPS指令——DMAC在传输完成时通知外围设备。
# Set up for burst transfers (4-beat burst, so SB4 and DB4), 
# (word data width, so SS32 and DS32)
DMAMOV CCR SB4 SS32 DB4 DS32
DMAMOV SAR ...
DMAMOV DAR ...
# Initialize peripheral '0'
DMAFLUSHP P0
# Perform peripheral transfers
# Outer loop - DMAC responds to peripheral requests until peripheral
# sets drlast_0 = 1
DMALPFE
# Wait for request, DMAC sets request_type0 flag depending on the
# request type it receives
DMAWFP 0, periph
# Set up loop for burst request: first 15 of 16 sets of transactions
# Note: B suffix - conditionally executed only if request_type0 
# flag = Burst
DMALP 15
DMALDB
DMASTB
# Only loopback if servicing a burst, otherwise treat as a NOP
DMALPENDB
# Perform final transaction (16 of 16). Send the peripheral
# acknowledgement of burst request completion
DMALDB
DMASTPB P0
# Perform transaction if the peripheral signals a single request
# Note: S suffix - conditionally executed only if request_type0 
# flag = Single
DMALDS
DMASTPS P0
# Exit loop if DMAC receives the last request, that is, drlast_0 = 1
DMALPEND
DMAEND
示例:DMAC管理的长度

这个例子显示了一个DMAC程序,当外围设备发出16个连续的突发请求和3个连续的单个请求信号时,该程序可以传输1027个字。

# Set up for AXI burst transfer 
# (4-beat burst, so SB4 and DB4), (word data width, so SS32 and DS32)
DMAMOV CCR SB4 SS32 DB4 DS32
DMAMOV SAR ...
DMAMOV DAR ...
# Initialize peripheral '0'
DMAFLUSHP P0
# Perform peripheral transfers
# Burst request loop to transfer 1024 words
DMALP 16
# Wait for the peripheral to signal a burst request. 
# DMAC transfers 64 words for each burst request
DMAWFP 0, burst
# Set up loop for burst request: first 15 of 16 sets of transactions
DMALP 15
DMALD
DMAST
DMALPEND
# Perform final transaction (16 of 16).
# Send the peripheral acknowledgment of burst request completion
DMALD
DMASTPB 0
# Finish burst loop
DMALPEND
# Set up for AXI single transfer (word data width, so SS32 and DS32)
DMAMOV CCR SB1 SS32 DB1 DS32
# Single request loop to transfer 3 words
DMALP 3
# Wait for the peripheral to signal a single request. DMAC to transfer
# one word
DMAWFP 0, single
# Perform transaction for single request and send completion
# acknowledgement to the peripheral
DMALDS
DMASTPS P0
# Finish single loop
DMALPEND
# Flush the peripheral, in case the single transfers were in response
# to a burst request
DMAFLUSHP 0
DMAEND

四、使用事件重新启动频道

当INTEN寄存器被编程为生成事件时,DMASEV和DMAWFE指令可用于重新启动一个或多个DMA通道。
以下部分描述了DMAC在以下情况下的行为:

  • DMAC在DMASEV之前执行DMAWFE
  • DMAC在DMAWFE之前执行DMASEV
DMAC在DMASEV之前执行DMAWFE

要重新启动单个DMA通道:

  1. 第一个DMA通道执行DMAWFE,然后在等待事件发生时暂停。
  2. 另一个DMA通道使用相同的事件编号执行DMASEV。这将生成一个事件,并且第一个DMA通道将重新启动。DMAC在执行DMASEV一个DMA{3:0}_ACLK周期后清除该事件。

可以对多个通道进行编程,以等待同一事件。例如,如果四个DMA通道都执行了事件12的DMAWFE,那么当另一个DMA通道执行事件12的DMASEV时,四个DMA信道都同时重新启动。DMAC在执行DMASEV一个时钟周期后清除事件。

DMAC在DMAWFE之前执行DMASEV

如果DMAC在另一个通道执行DMAWFE之前执行DMASEV,则该事件将一直挂起,直到DMAC执行DMAWFE。当DMAC执行DMAWFE时,它会在一个DMA{3:0}_ACLK周期内停止执行,清除事件,然后继续执行通道线程。

例如,如果DMAC执行DMASEV 6,而其他线程都没有执行DMAWFE 6,则该事件保持挂起状态。如果DMAC对通道4执行DMAWFE 6指令,然后对通道3执行DMAWFE6指令,则:

  1. DMAC在一个DMA{3:0}_ACLK周期内停止信道4线程的执行。
  2. DMAC清除事件6。
  3. DMAC恢复信道4线程的执行。
  4. DMAC暂停通道3线程的执行,并且线程在等待事件6的下一次发生时暂停。

五、中断处理器

控制器通过中断控制器(GIC)向CPU提供七个活动的高敏感中断(IRQ ID#75:72和49:46)。当INTEN寄存器被编程为生成中断时,在DMAC执行DMASEV之后,控制器将相应的中断设置为活动高状态。

外部微处理器可以通过写入中断清除寄存器(ICR)来清除中断。

执行DMAWFE不会清除中断。

如果DMASEV指令用于在DMAC完成DMALD或DMAST指令时通知微处理器,Arm建议在DMASEV之前插入内存屏障指令。否则,DMAC可能会在AXI事务完成之前发出中断信号。
以下示例对此进行了演示:

DMALD
DMAST
# Issue a write memory barrier
# Wait for the AXI write transfer to complete before the DMAC can
# send an interrupt
DMAWMB
# The DMAC sends the interrupt
DMASEV

六、 指令集引用

表4和表5总结了DMAC指令和命令。

表4 DMA引擎指令摘要

表5 汇编程序提供的DMA引擎附加命令


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/779706.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Node.js-path 模块

path 模块 path 模块提供了 操作路径 的功能,如下是几个较为常用的几个 API: 代码实例: const path require(path);//获取路径分隔符 console.log(path.sep);//拼接绝对路径 console.log(path.resolve(__dirname, test));//解析路径 let pa…

java反射介绍

Java反射API允许你在运行时检查和修改程序的行为。这意味着你可以动态地创建对象、查看类的字段、方法和构造函数,甚至调用它们。这是一个强大的特性,但也应该谨慎使用,因为它可以破坏封装性。 以下是使用Java反射的一些常见用途:…

041基于SSM+Jsp的高校校园点餐系统

开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包…

OPENCV(图像入门笔记)

使用OpenCV读取图像 使用cv.imread()函数读取图像。 第一个参数为图像名称 第二个参数是一个标志,它指定了读取图像的方式。分别有三种 cv.IMREAD_COLOR: 加载彩色图像。任何图像的透明度都会被忽视。它是默认标志。 cv.IMREAD_GRAYSCALE:以…

什么是 HTTP POST 请求?初学者指南与示范

在现代网络开发领域,理解并应用 HTTP 请求 方法是基本的要求,其中 "POST" 方法扮演着关键角色。 理解 POST 方法 POST 方法属于 HTTP 协议的一部分,主旨在于向服务器发送数据以执行资源的创建或更新。它与 GET 方法区分开来&…

Linux:Ubuntu18.04下开机自启动QT图形化界面

Linux:Ubuntu18.04下开机自启动QT图形化界面 Chapter1 Linux:Ubuntu18.04下开机自启动QT图形化界面一、创建rc.local文件二、建立rc-local.service文件三、启动服务查看启动状态四、重启 Chapter2 将QT应用作为开机自启动(Linux系统&#xff…

预约停车位app小程序模板

简单的手机预约停车位,在线停车位,预约停车管理小程序页面模板。包含:主页、预约停车、预约管理、地图导航等。 预约停车位app小程序模板

bash条件判断基础adsawq1`1nn

判断的作用 判断后续操作的提前条件是否满足如果满足执行一种命令不满足则执行另一种指令 条件测试类型: 整型测试字符测试文字测试 整数测试:比较两个整数谁大谁小,是否相等; 二元测试: num1 操作符 num2 -eq: 等于…

Flink,spark对比

三:az 如何调度Spark、Flink,MR 任务 首先,使用java编写一个spark任务,定义一个类,它有main方法,里面写好逻辑,sparkConf 和JavaSparkContext 获取上下文,然后打成一个jar包&#xf…

基于机器学习(霍特林统计量,高斯混合模型,支持向量机)的工业数据异常检测(MATLAB R2021B)

近年来,隨着集散控制系统、工业物联网、智能仪表等信息技术在现代工业生产系统中的应用,生产过程的运行状态能够以大量数据的形式被感知和记录。基于数据的故障诊断方法以过程数据为基础,采用统计分析、统计学习、信号处理等方法,…

笔记:SpringBoot+Vue全栈开发2

笔记:SpringBootVue全栈开发2 1. MVVM模式2. Vue组件化开发3. 第三方组件element-ui的使用4. axios网络请求5. 前端路由VueRouter 1. MVVM模式 MVVM是Model-View-ViewModel的缩写,是一种基于前端开发的架构模式,其核心是提供对View和ViewMod…

【简单介绍下Memcached】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

独立开发者系列(21)——HTTP协议的使用

作为网络访问的必备知识点,http协议,我们已经知道http协议属于tcp的一种,而且一般是用于网络通讯的,但是本身http协议本身包含的内容也很多,正是因为有这种协议,前后端和各种硬件接口/服务器接口/前端&…

VSCode远程服务器如何上传下载文件(超方便!)

方法一: 1、在VSCode应用商店安装SFTP插件 2、然后就可以直接把文件拖进VSCode即可,如下图所示: 这里的目录是我远程服务器上的目录,可以直接将要上传的文件直接拖进需要的文件夹 3、如果要从远程服务器上下载文件到本地&#x…

手写实现一个ORM框架

手写实现一个ORM框架 什么是ORM框架、ORM框架的作用效果演示框架设计代码细节SqlBuilderSqlExecutorStatementHandlerParameterHandlerResultSetHandler逆序生成实体类 大家好,本人最近写了一个ORM框架,想在这里分享给大家,让大家来学习学习。…

axios的使用,处理请求和响应,axios拦截器

1、axios官网 https://www.axios-http.cn/docs/interceptors 2、安装 npm install axios 3、在onMouunted钩子函数中使用axios来发送请求,接受响应 4.出现的问题: (1) 但是如果发送请求请求时间过长,回出现请求待处…

分布式共识算法

分布式的基石 分布式共识算法 前置知识:分布式的 CAP 问题,在事务一章中已有详细介绍。 正式开始探讨分布式环境中面临的各种技术问题和解决方案以前,我们先把目光从工业界转到学术界,学习两三种具有代表性的分布式共识算法&…

昇思MindSpore学习总结十——ResNet50迁移学习

1、迁移学习 (抄自CS231n Convolutional Neural Networks for Visual Recognition) 在实践中,很少有人从头开始训练整个卷积网络(使用随机初始化),因为拥有足够大小的数据集相对罕见。相反,通常…

Flask之电子邮件

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 目录 一、使用Flask-Mail发送电子邮件 1.1、配置Flask-Mail 1.2、构建邮件数据 1.3、发送邮件 二、使用事务邮件服务SendGrid 2.1、注册SendGr…

昇思25天学习打卡营第11天|MindSpore 助力下的 GPT2:数据集加载处理及模型全攻略

目录 环境配置 数据集下载和获取 数据集拆分 处理数据集 模型构建 ​​​​​​​模型训练 ​​​​​​​模型推理 环境配置 “%%capture captured_output”这一行指令通常旨在捕获后续整个代码块所产生的输出结果。首先,将已预装的 mindspore 库予以卸载。随后&a…