0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ZYNQ开发案例之DMA控制器系统设计

454398 来源:FPGA技术联盟 作者:FPGA技术联盟 2020-12-05 10:17 次阅读

1. DMA外设特点:

1. DMA引擎拥有一个灵活的指令设置DMA的传输;
2. 拥有8个cache线,每一个cache线宽度是4个字;
3. 拥有8个可以并行的DMA通道线程;
4. 拥有8个中断给中断控制器
5. 拥有8个DMA触发事件并且可以编码控制;
6. 128个(64bit)的MFIFO,在传输的时候读写端可写入到此FIFO;
7. 支持任意内存到内存的传输;

整个系统中的DMA控制器如图1所示:

图1 DMA控制器系统图

DMAC包含一个指令处理单元,其能够编码控制DMA传输,每一个线程包含一个独立的状态机处理各自的DMA事件,包括通道仲裁,通道优先级。

当一个通道线程执行加载或者存储指令的时候控制器会将指令增加到读队列和写队列中,控制器使用这些队列来存储指令,并且按队列指令顺序在AXI总线上完成传输。

2. DMA在AXI总线上传输:

所有的DMA传输使用AXI接口移动数据,包括片上内存的移动,DDR内存,以及PL上的从外设内存。PL端的从外设正常连接到DMAC外设接口上控制其数据流。DMAC在PS端可以访问到IOPs,但是正常情况下不会使用,因为这些路径不会提供数据流信号。DMAC数据路径正常使用情况如图2所示,没一个AXI路径可以执行一个读或者一个写,其中拥有好多组合,典型的DMA传输有:

内存到内存的传输(片上内存到DDR内存);

内存到PL端外设或者PL端外设到内存(DDR内存到PL端外设)。

图2 数据流传输

3. DMA的管理:

DMAC实时操作时,用户可以通过下面的指令设置DMA的传输:

DMAGO:开始一个用户指定通道的DMA传输;

DMASEV:用户指定的一个事件或者中断发生时给出信号;

DMAKILL:终止一个线程。

当DMA管理器接受到一个从APB从接口的指令后,会等待若干个时钟周期,在执行指令之前(pipeline是处于忙的状态,在执行其他指令)。

4. 多通道数据FIFO(MFIFO)

MFIFO是一个当前所有活动通道共享的,基于先进入先服务的共享资源。对于编程角度来讲,它是以份额深度可变的并行的FIFO集合,每个通道都有一个FIFO,但是所有FIFO的总深度不能超多MFIFO的大小,DMAC的MFIFO深度最大为128个64bit的大小。

5. 事件和中断:

DMAC支持16个事件,开始的8个事件是中断信号,IRQs[7:0],这8个中断都会输出到PS或者PL的中断控制器。这些事件使用内部的DMA引擎通道与通道之间的传输。EMAC的中断事件表如图3所示。

图3 事件与中断

DMA的配置实例

配置DMA做内存到内存的传输实例。

DMA配置步骤:

1. 初始化dma的命令数据结构,主要配置传输源地址,目的地址,传输长度,burst的大小等信息

2. 通过DMA的ID信息,找到DMA外设信息;

3. 初始化dma的数据结构;

4. 连接到硬件中断,将GIC中断映射到中断向量表中;

5. 通过GIC的ID信息,找到GIC外设信息;

6. 链接DMA中断和GIC,将DMA中断映射到GIC控制器上;

7. 时能GIC中断;

8. 使能硬件中断;

9. 设置中断服务函数的映射配置;

10. 开始DMA的传输;

11. 等待DMA的传输完成;

程序源码:

XDmaPs_Config *DmaConfigPtr;

    XScuGic_Config *GicConfigPtr;

    XDmaPs_Cmd DmaCmd;

    volatile int Checked = 0;

    int Index = 0;

    memset(&DmaCmd, 0, sizeof(XDmaPs_Cmd));

    DmaCmd.ChanCtrl.SrcBurstSize = 4;

    DmaCmd.ChanCtrl.SrcBurstLen = 4;

    DmaCmd.ChanCtrl.SrcInc = 1;

    DmaCmd.ChanCtrl.DstBurstSize = 4;

    DmaCmd.ChanCtrl.DstBurstLen = 4;

    DmaCmd.ChanCtrl.DstInc = 1;

    DmaCmd.BD.SrcAddr = (u32) Src;

    DmaCmd.BD.DstAddr = (u32) Dst;

    DmaCmd.BD.Length = DMA_LENGTH * sizeof(int);

    //find device

 DmaConfigPtr = XDmaPs_LookupConfig (XPAR_XDMAPS_1_DEVICE_ID);

    //config xdmaps data

    XDmaPs_CfgInitialize(&Dma,DmaConfigPtr,DmaConfigPtr->BaseAddress);

    //config gic

    //config hardware interrupt

    Xil_ExceptionInit();

 Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_IRQ_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,(void *)&Gic);

    //find device

 GicConfigPtr = XScuGic_LookupConfig (XPAR_SCUGIC_SINGLE_DEVICE_ID);

    //config gic data

    XScuGic_CfgInitialize(&Gic,GicConfigPtr,GicConfigPtr->CpuBaseAddress);

    //connect gic handler

XScuGic_Connect(&Gic,XPAR_XDMAPS_0_FAULT_INTR,(Xil_InterruptHandler)XDmaPs_FaultISR, (void *)&Dma);

XScuGic_Connect(&Gic,DMA_DONE_INTR_0,(Xil_InterruptHandler)XDmaPs_DoneISR_0, (void *)&Dma);

    //enable gic

    XScuGic_Enable(&Gic,XPAR_XDMAPS_0_FAULT_INTR);

    XScuGic_Enable(&Gic,DMA_DONE_INTR_0);

    //enable hardware interrupt

    Xil_ExceptionEnable();

    //handler connect

XDmaPs_SetDoneHandler(&Dma,0,(XDmaPsDoneHandler)DmaDoneHandler,(void *)&Checked);

    /* Initialize source */

    for (Index = 0; Index 

编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • dma
    dma
    +关注

    关注

    3

    文章

    535

    浏览量

    99012
  • DDR内存
    +关注

    关注

    0

    文章

    11

    浏览量

    6775
收藏 人收藏

    评论

    相关推荐

    ZYNQ SOC案例开发:AXI DMA使用解析及环路测试

    一、AXI DMA介绍 本篇博文讲述AXI DMA的一些使用总结,硬件IP子系统搭建与SDK C代码封装参考米联客ZYNQ教程。若想让ZYNQ
    的头像 发表于 12-31 09:52 7282次阅读
    <b class='flag-5'>ZYNQ</b> SOC案例<b class='flag-5'>开发</b>:AXI <b class='flag-5'>DMA</b>使用解析及环路测试

    STM32 DMA控制器使用

    的请求,还有一个仲裁来协调各个DMA请求的优先权。DMA 控制器和Cortex-M3核共享系统数据总线执行直接存储
    发表于 01-13 14:02

    DMA控制器介绍

    本帖最后由 yyeee312 于 2015-11-12 15:17 编辑 DMA控制器是一种在系统内部转移数据的独特外设,可以将其视为一种能够通过一组专用总线将内部和外部存储
    发表于 11-04 22:50

    如何调试Zynq UltraScale+ MPSoC VCU DDR控制器

      如何调试Zynq UltraScale+ MPSoC VCU DDR控制器  Zynq UltraScale+ MPSoC VCU DDR 控制器是一款专用 DDR
    发表于 01-07 16:02

    Linux应用开发手册Python开发案

    本文档涉及的开发案例位于产品资料“4-软件资料\Demo\”路径下的base-demos和python-demos目录。base-demos目录存放Linux常用开发案例,案例bin目录存放
    发表于 05-11 10:21

    浅析DMA控制器与FSMC控制器

    直接存储存取DMACPU太忙了,那DMA你来帮我吧,这样很多事情CPU就不用停下来去管了。在DMA模式下,CPU只须向DMA控制器下达指令
    发表于 12-09 06:00

    一种以DMA控制器为基础的SoC系统设计

      引言   DMA(Direct Memory Access,直接存储器存取)是一种快速传送数据的机制。DMA控制器能够有效替代微处理器的加载/存储指令,显著提高系统的并行能力。
    发表于 09-08 11:08 2307次阅读
    一种以<b class='flag-5'>DMA</b><b class='flag-5'>控制器</b>为基础的SoC<b class='flag-5'>系统</b>设计

    NiosⅡ系统DMA控制器的原理及应用

    DMA控制器是一种在系统内部转移数据的独特外设,可以将其视为一种能够通过一组专用总线将内部和外部存储器与每个具有DMA能力的外设连接起来的控制器
    发表于 12-07 08:51 2069次阅读
    NiosⅡ<b class='flag-5'>系统</b>中<b class='flag-5'>DMA</b><b class='flag-5'>控制器</b>的原理及应用

    dma控制器芯片8257资料介绍

    DMA既可以指内存和外设直接存取数据这种内存访问的计算机技术,又可以指实现该技术的硬件模块(对于通用计算机PC而言,DMA控制逻辑由CPU和DMA
    发表于 12-07 10:23 1.6w次阅读
    <b class='flag-5'>dma</b><b class='flag-5'>控制器</b>芯片8257资料介绍

    dma控制器由什么组成?

    DMA(Direct Memory Access)控制器是一种在系统内部转移数据的独特外设,可以将其视为一种能够通过一组专用总线将内部和外部存储器与每个具有DMA能力的外设连接起来的
    发表于 12-07 14:43 3421次阅读
    <b class='flag-5'>dma</b><b class='flag-5'>控制器</b>由什么组成?

    基于AXI总线的DMA控制器的设计

    一般而言,DMA控制器的功能与结构是由本单位特定的系统结构决定的。但是作为IP而言,DMA控制器又要有其一般性。
    发表于 12-07 15:48 5945次阅读
    基于AXI总线的<b class='flag-5'>DMA</b><b class='flag-5'>控制器</b>的设计

    dma控制器由什么组成

    DMA既可以指内存和外设直接存取数据这种内存访问的计算机技术,又可以指实现该技术的硬件模块(对于通用计算机PC而言,DMA控制逻辑由CPU和DMA
    发表于 12-07 16:08 5190次阅读
    <b class='flag-5'>dma</b><b class='flag-5'>控制器</b>由什么组成

    浅谈Zynq Qspi控制器的三种模式

    Zynq Qspi控制器支持三种模式:I/O模式、线性地址模式和传统SPI模式,其中线性地址模式双片选支持最大的线性地址空间为32MB,可通过PS DMA读取。
    发表于 07-02 09:34 1.9w次阅读
    浅谈<b class='flag-5'>Zynq</b> Qspi<b class='flag-5'>控制器</b>的三种模式

    dma控制器的组成

    一个DMA控制器,实际上是采用DMA方式的外围设备与系统总线之间的接口电路,这个接口电路是在中断接口的基础上再加DMA机构组成。习惯上将
    的头像 发表于 04-01 16:08 1w次阅读

    dma控制器是什么_dma控制器工作方式

    DMA(Direct Memory Access)控制器是一种在系统内部转移数据的独特外设,可以将其视为一种能够通过一组专用总线将内部和外部存储器与每个具有DMA能力的外设连接起来的
    发表于 11-15 10:25 1.3w次阅读