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外设可能需要精确地控制数据传输量,以确保其内部数据流的稳定性。在其他情况下,处理器或软件可能需要更灵活地控制数据传输,以适应不同的应用或工作负载。

相关推荐
transfer_ICer17 小时前
Vscode搭建verilog开发环境
vscode·fpga开发·编辑器
沐欣工作室_lvyiyi1 天前
汽车牌照识别系统的设计与仿真(论文+源码)
人工智能·单片机·fpga开发·汽车·单片机毕业设计·matlab车牌识别
绅士羊OuO1 天前
FPGA学习笔记#5 Vitis HLS For循环的优化(1)
c++·笔记·嵌入式硬件·学习·fpga开发
Panda 皮2 天前
FPGA时钟之时钟偏移
fpga开发
stm 学习ing2 天前
FPGA 第5讲 点亮你的LED灯
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
tiger1192 天前
理解 FPGA 的关键知识点整理
学习·fpga开发·fpga
17岁boy想当攻城狮2 天前
FPGA实战篇:Moore/Mealy状态机
fpga开发
Panda 皮2 天前
优化扇出
fpga开发
stm 学习ing3 天前
FPGA 第二讲 初始FPGA
c语言·开发语言·stm32·fpga开发·c#·visual studio·嵌入式实时数据库
搬砖的小码农_Sky3 天前
Xilinx FPGA的Vivado开发流程
fpga开发