Zynq7000系列FPGA中的DMA控制器简介(三)

多通道数据FIFO(MFIFO)

MFIFO(Multi-Channel FIFO,多通道FIFO)是一个共享资源,当前所有活动的通道都按照先到先服务(First-Come, First-Served, FCFS)的原则来使用它。对于程序来说,MFIFO表现为一组可变深度的并行FIFO,每个通道对应一个FIFO,但有一个限制,即所有FIFO的总深度不能超过MFIFO的大小。DMAC(Direct Memory Access Controller,直接内存访问控制器)的最大MFIFO深度是128个(64位)字。这意味着,尽管每个通道可以分配不同数量的FIFO深度,但所有通道FIFO的总深度加起来不能超过128个64位字。

这个控制器具有将源地址的数据重新对齐到目标地址的功能。例如,当控制器从地址0x103读取一个字(word,通常是16位、32位或64位,具体取决于系统架构)并写入到地址0x205时,它会对数据进行重新对齐,具体表现为在数据传输过程中将数据移动两个字节(byte lanes)。

MFIFO中的数据存储和打包方式由目标地址和传输特性决定。这意味着,当数据被写入MFIFO时,它会根据最终的目标地址和传输要求来重新排列和打包这些数据。这可能包括改变数据的字节顺序、组合或拆分多个数据单元以适应目标地址的特定格式或大小要求。

当程序指定对目标地址执行递增内存传输时,DMA控制器(DMAC)会将数据打包进MFIFO以最小化MFIFO条目的使用。这种打包策略旨在提高数据传输的效率,减少不必要的内存访问和MFIFO的使用。例如,当DMAC拥有一个64位的AXI数据总线,并且程序使用源地址0x100和目标地址0x200时,DMAC会将两个32位字打包进MFIFO的一个条目中。这是因为64位AXI数据总线一次能够传输64位(即8字节)的数据,而两个32位字加起来正好是64位,可以充分利用AXI总线的带宽。

在某些情况下,存储从源加载的数据所需的条目数不是源数据量除以MFIFO宽度的简单计算。当出现以下任何情况时,所需条目数量的计算并不简单:

在特定情况下,计算从源加载数据所需的条目数并不是简单地通过源数据量除以MFIFO(多功能先入先出队列)宽度来得出的。当以下情况之一发生时,计算所需条目数的过程会变得复杂:

  • 源地址不是AXI总线宽度的整数倍(即源地址未对齐)
    • 当源地址不是AXI总线宽度的整数倍时,AXI总线将执行非对齐传输。这可能会降低传输效率,因为AXI接口可能需要进行额外的处理来从非对齐地址读取数据。在某些情况下,可能需要额外的读操作来组合来自不同地址的数据片段,或者需要填充数据以达到AXI总线宽度的整数倍。
  • 目标地址不是AXI总线宽度的整数倍(即目标地址未对齐)
    • 如果目标地址也未对齐到AXI总线宽度,则写入操作同样会受到影响。AXI总线可能需要执行额外的写操作来将数据分散到不同的内存位置,或者可能需要插入填充数据以确保数据的正确写入。这同样会降低传输效率,并可能增加额外的开销。
  • 内存传输到固定目标地址(即非递增地址)
    • 如果内存传输是到固定目标地址,而不是使用递增的地址进行连续写入,那么每次写入都需要单独指定目标地址。这意味着不能使用简单的指针递增或循环结构来连续写入数据,而是需要在每次传输时都重新计算或指定目标地址。这会增加编程的复杂性,并可能降低数据传输的效率。

DMALD (DMA Load) 和 DMAST (DMA Store) 指令用于指定执行AXI总线事务。AXI总线事务传输的数据量取决于编程到CCRn(Channel Control Register n)寄存器的值以及事务的地址。当涉及非对齐传输时,需要考虑一些额外的因素。

在AMBA AXI协议规范中,非对齐传输通常指的是源地址或目标地址不是AXI总线宽度的整数倍的情况。非对齐传输可能导致效率降低,因为AXI接口可能需要执行额外的操作来确保数据的正确传输。这可能包括从多个不同的地址读取数据片段(对于读操作)或将数据分散到多个不同的内存位置(对于写操作)。

内存到内存的传输

DMAC控制器包含一个AXI主接口来访问PS(处理系统)中的存储器,如OCM(片上存储器)和DDR(双倍数据速率同步动态随机存取存储器)。通过相同的AXI中央互联,这个控制器可以潜在地访问大多数外设子系统。

如果目标外设可以被视为一个内存映射区域(或内存端口位置),且不需要FIFO或流控制,那么DMAC(直接内存访问控制器)就可以用来读取和写入该外设。典型的例子包括:

  • QSPI(四路串行外设接口)在线性寻址模式下
  • NOR闪存
  • NAND闪存

在这些情况下,DMAC能够直接处理内存到内存的数据传输,因为目标外设被映射到处理器的内存空间中,并且其访问方式类似于常规的RAM。DMAC可以有效地将数据从源地址传输到目标地址,无需CPU的干预,从而大大提高数据传输的效率。

需要注意的是,虽然DMAC可以处理许多类型的内存映射外设,但并非所有外设都适合使用DMAC进行数据传输。例如,某些外设可能需要特定的协议或流控制机制来确保数据的完整性和准确性。对于这些外设,可能需要使用更复杂的DMA控制器或专门的驱动程序来处理数据传输。

此外,使用DMAC进行数据传输时,还需要注意一些潜在的问题,如内存对齐、数据宽度和传输大小等。这些问题可能会影响数据传输的效率和正确性,因此需要在设计和实现时予以充分考虑。

PL外围AXI事务

当PL中的大多数外设通过FIFO传输数据时,必须管理这些FIFO以避免溢出和下溢的情况。为此,提供了四个特定的外设请求接口来连接DMAC到PL中具有DMA能力的外设。这些接口中的每一个都可以分配给任何DMA通道。

DMAC被配置为可以接受每个PL外设接口最多四个活跃(active)请求。一个活跃请求是指DMAC还没有开始请求的AXI数据事务。

对于每个PL外设接口,DMAC都有一个请求FIFO,用于捕获来自PL外设的请求。当请求FIFO满时,DMAC会将对应的DMA{3:0}_DRREADY信号拉低,以指示DMAC无法接受来自该PL外设的任何新请求。

注意:

对于PS中的I/O外设(IOP),并没有直接指向它们的外设请求接口。这意味着当需要访问PS中的目标外设的FIFO时,避免FIFO的下溢或溢出需要处理器的介入。当涉及到处理系统中的目标外设FIFO时,确实需要处理器的介入来避免FIFO的下溢或溢出。

在处理DMAC和PL外设之间流动的数据量时,有两种不同的方法:

  1. PL外设长度管理(PL Peripheral Length Management):PL外设负责控制DMA周期内包含的数据量。PL外设通常会设置DMA描述符中的长度字段,以指示每个DMA传输周期中需要传输的数据字节数。DMAC将遵循这些长度指示,并在每个DMA周期内传输指定数量的数据。这种方法的好处是,PL外设可以根据其内部缓冲区和数据处理需求精确地控制数据传输量。
  2. DMAC长度管理(DMAC Length Management):DMAC负责控制DMA周期内传输的数据量。处理器或DMAC的配置软件将设置DMA描述符中的长度字段,以指定每个DMA传输周期的数据量。PL外设将按照DMAC提供的长度指示来发送或接收数据。这种方法的好处是,处理器或软件可以灵活地控制数据在内存和PL外设之间的传输量,以满足系统级的需求。

这两种方法的选择取决于系统的具体需求和架构。在某些情况下,PL外设可能需要精确地控制数据传输量,以确保其内部数据流的稳定性。在其他情况下,处理器或软件可能需要更灵活地控制数据传输,以适应不同的应用或工作负载。

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue组件全局注册

描述: vue组件的注册分为局部和全局注册两部分,局部注册相对容易,不做赘述;而不同框架的注册方法又有所不同,下面针对vite框架和vue-cli框架的注册分别进行说明 vue组件全局注册 一、vite框架中全局组件注册二、Vue-cl…

-bash: /snap/bin/docker: 没有那个文件或目录

-bash: /snap/bin/docker: 没有那个文件或目录 解决办法 export PATH$PATH:/usr/bin/docker然后,重新加载配置文件 source ~/.bashrc

使用ChatGPT提升Python性能:CUDA编程实战

PythonCUDA:将Python与GPU相结合的高性能计算工具 介绍 Python是一种简单易学的高级编程语言,而NVIDIA CUDA是一种基于GPU的并行计算平台。两者结合,可以实现高性能计算,Python可以做到数据处理方便快捷,而CUDA则以其强大的并行…

线程的等待通知机制

等待通知机制 之前所学到的join是等待线程结束,而此时的等待通知,等待代码给我们提示进行显示的通知(并不一定要结束),可以更加精细控制线程之间的执行顺序,在系统内部,线程是抢占式执行,随机调度,但是程序员也是有手段可以进行干预的,我们可以通过"等待"的方式让线…

【学术日记】关于读博,目标院校,意向导师,毕业要求,重要时间点

文章目录 一、目标院校二、重要时间点西安交通大学意向导师 华南理工大学意向导师 本文记录博主的科研日记。如果对博主的其他文章感兴趣,可以看这篇文章【CSDN文章】晚安66博客文章索引。 首次修改时间:2024年5月12日。当前修改时间:2024年5…

C : 线性规划例题求解

Submit Page TestData Time Limit: 1 Sec Memory Limit: 128 Mb Submitted: 93 Solved: 49 Description 求解下述线性规划模型的最优值min �1�1�2�2�3�3�.�. &…

Python项目开发实战,火车票分析助手,案例教程编程实例课程详解

一、项目背景与意义 火车票作为人们出行的重要交通工具之一,其购票难、查询繁琐等问题一直困扰着广大乘客。为了解决这些问题,我们开发了一款火车票分析助手,利用Python的强大数据处理能力和丰富的库资源,帮助用户更高效地查询和分析火车票信息。本项目旨在提高用户的购票体…

Spring Cloud LoadBalancer基础入门与应用实践

官网地址:https://docs.spring.io/spring-cloud-commons/reference/spring-cloud-commons/loadbalancer.html 【1】概述 Spring Cloud LoadBalancer是由SpringCloud官方提供的一个开源的、简单易用的客户端负载均衡器,它包含在SpringCloud-commons中用…

【Python第三方包】爬虫前言(request包)

文章目录 前言安装发送请求Response对象常用函数总结前言 在Python编程中,我们经常需要从互联网上获取或发送数据。这就涉及到了网络编程,而在网络编程中,我们常常需要使用到HTTP请求。Python的requests库就是一个非常强大的工具,它可以帮助我们轻松地发送HTTP请求。 req…

前端vue使用onlyoffice控件实现word在线编辑、预览(仅列出前端部分需要做的工作,不包含后端部分)

简介 ONLYOFFICE 文档 是一个开源办公套件,包括文本文档、电子表格、演示文稿和可填写表单的编辑器。 它提供以下功能: 创建、编辑和查看文本文档、电子表格、演示文稿和可填写表单; 与其他队友实时协作处理文件。 基于这个控件,…

通过window.scrollTo实现丝滑跳转到页面的某个位置

原理 通过计算对应id的组件距离页面顶部的距离&#xff0c;来使用window.scrollTo丝滑跳转到该位置 代码如下&#xff1a; <div id"test1"></div> <div id"test2"></div> <div id"test3"></div><butt…

PySide(PyQt),event.pos() 和 event.position()的区别

在 PySide6 中&#xff0c;event.pos() 和 event.position() 在处理鼠标事件时有所不同&#xff1a; event.pos(): event.pos() 返回的是鼠标指针相对于接收事件的小部件&#xff08;widget&#xff09;的局部坐标。这意味着它返回的是鼠标在接收事件的窗口或部件内的坐标位置。…

基于Java毕业生生活用品出售网站的设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

【算能全国产AI盒子】基于BM1688CV186AH+FPGA智能物联工作站,支持差异化泛AI视觉产品定制

在数据呈现指数级增长的今天&#xff0c;越来越多的领域和细分场景对实时、高效的数据处理和分析的需求日益增长&#xff0c;对智能算力的需求也不断增强。为应对新的市场趋势&#xff0c;凭借自身的硬件研发优势&#xff0c;携手算能相继推出了基于BM1684的边缘计算盒子&#…

Spring Boot中的日志管理最佳实践

Spring Boot中的日志管理最佳实践 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨一下在Spring Boot应用中如何有效管理日志&#xff0c;确保系统…

C4D快捷键整合所有快捷键

C4D快捷键整合所有快捷键 快捷键常用快捷键主菜单建模材质管理器物体管理器图片浏览器结构管理器浏览器编辑器动画模块属性管理器Body Paint 3D时间线视窗Mocca 小技巧 快捷键 常用快捷键 作用快捷键备注裁切时间线ALT【 】最大化显示所限物体0最大化显示场景所有物体H物体属…

解读防水防腐保温二级资质:为何社保需缴纳X月以上?

解读防水防腐保温二级资质中关于社保需缴纳X月以上的要求&#xff0c;可以从以下几个方面进行&#xff1a; 一、社保缴纳的重要性 稳定雇佣关系的体现&#xff1a;社保缴纳是企业与员工之间稳定雇佣关系的直接体现&#xff0c;它展示了企业对员工的长期承诺和责任感。员工权益…

esp32使用TFT_eSPI库,系统双闪,指针溢出的问题

问题描述 使用TFT_eSPI烧录进esp32c3之后&#xff0c;开发板灯双闪&#xff0c;串口输出指针越界的错误。 问题原因 不小心点到了更新&#xff0c;把esp32的库给更新了。 问题解决 把esp32的库改到2.0.9版本。

Spring Boot与Redis集成的最佳实践

Spring Boot与Redis集成的最佳实践 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何在Spring Boot应用中实现与Redis的集成&#xff0c;以及一…

c++ std::forward 笔记

请您查看如下代码块&#xff0c;这样方便复制过去直接运行 int x 5; q_forward w1(x); // 使用左值构造 q_forward w2(10); // 使用右值构造 w2.wrapper_func(); /*** std::forward<>() 向前的&#xff0c;前进的&#xff1b;* 通常与模板和右值引用&#xff08;r…