Zynq PS DMA应用笔记

Hello,Panda

Zynq-7000系列器件PS端的DMA控制器采用ARM的IP核DMA-330(PL-330)实现。有关DMA控制器的硬件细节及相关指令集、编程实例内容参考ARM官方文档:

DDI0424D:dma330_r1p2_trm.pdf

DAI0239A:dma330_example_programs.pdf

本文开发环境为Xilinx SDK2015.2,DMA库版本为dmaps_v2_1。

1 结构特点

DMA控制器具有以下的特点:

n      8个独立的通道,4个可用于PL—PS间数据管理,每个通道有1024Byte的MFIFO;

n      使用CPU_2x 时钟搬运数据,CPU_2x = (CPU frq/6)*2;

n      执行自定义内存区域内的DMA指令运行DMA;

n      AHB控制寄存器支持安全和非安全模式;

n      每个通道内置4字Cache;

n      可以访问SoC的以下映射物理地址:

DDR、OCM、PL、Linear QSPI Read、SMC和M_AXI_GP设备,访问设备的互联结构如图1所示。

图1 Zynq 访问互联结构图

从图1可以看出DMA控制器可以访问连接到Central Interconnect上的所有设备,并提供了四个通道的外设管理接口可用于控制PL的数据搬运。

Zynq系列器件中DMA控制器采用ARM PL-330 IP和r1p1版,结构框图如图2所示。

                                                       图2 Zynq DMA控制器结构框图

如图2所示,DMA控制器由指令加速引擎,AXI Master数据接口,AXI APB寄存器访问接口以及可以连接到PL的外设请求接口,数据缓冲FIFO和控制及状态产生单元组成。

从图2可以看到,DMA PL330的设计思想是:DMA控制器通过DMA指令执行引擎执行自己的指令,并将执行状态通过APB总线和中断等形式反馈给CPU,达到数据搬运不占用CPU的目的。

DMA控制器共有八个通道,其中四个通道负责互联到Central Interconnectcun存储单元上的数据搬运;四个数据通道为外设请求接口,可用于PL AXI互联接口的数据访问管理。

每个DMA通道都执行自己的指令,拥有自己的独立线程,通道间互不影响。指令执行引擎有自己独立的Cache线。

2 编程模型

本文不考虑外设请求接口,DMA控制器编程分为以下几个部分:

u     DMA控制器初始化;

u     组织DMA引擎执行代码;

u     启动或停止DMA传输;

u     异常处理。

2.1 DMA控制器初始化

DMA控制器初始化,DMA初始化包括配置时钟、复位,安全状态,中断服务等,如下表1所示。

表1 DMAC初始化配置

步骤

配置项

相关寄存器

描述

1

配置时钟

使能APB时钟,一般已经使能

slcr.AER_CLK_CTRL

[DMA_CPU_2XCLKACT]=1’b1

使能CPU_2x时钟给AXI

2

配置安全状态

SLCR. TZ_DMA_NS = 1

非安全

SLCR. TZ_DMA_IRQ_NS=1

非安全

SLCR. TZ_DMA_PERIPH_NS=1

非安全

3

复位

slcr.DMAC_RST_CLTR[DMAC_RST]

复位DMAC

4

中断

设置中断服务函数

一般的时钟和复位都在FSBL里面完成,用户只需要设置DMA的APB总线安全模式和中断服务函数即可。特别要注意对安全模式的设置,否则在非安全模式下访问安全模式寄存器无任何有效应答。

2.2  组织DMA引擎执行代码

Xilinx SDK(gcc)不支持编译DMA引擎指令,因此需要自己对照ARM官方文档”DDI0424D_dma330_r1p2_trm.pdf”对指令集的描述一条一条的组织指令,特别注意执行指令的长度应为Cache线的整数倍,不足的用NOP补齐。

下面以DMAMOV指令为例,说明如何编写指令引擎执行的机器码,图3是DMAMOV指令的编码。

                                                                 图3 DMAMOV指令的编码

本条指令编码由48位(6字节)构成,如图3中的编码:

①   rd[2:0]:表示寄存器地址,000为源地址寄存器SAR,001为通道控制寄存器CCR,DAR为目的地址寄存器。

②   imm[31:0],为以上三个寄存器的配置值。

CCR为AXI总线配置寄存器,参见文档DDI0424D中 3.3.15 Channel Control Registers章节的描述;有关AXI总线协议接口描述自行参照ARM官方文档IHI 0022D:AMBA AXI andACE Protocol Specification。

那么生成DMAMOV机器码的函数如下所示:

INLINE int XDmaPs_Instr_DMAMOV(char *DmaProg, unsigned Rd, u32 Imm)

{

/*

* DMAMOV encoding

* 15 4 3 2 1 10 ... 8 7 6 5 4 3 2 1 0

*  0 0 00 0 |rd[2:0]|1 0 1 1 1 1 0 0

*

* 47 ... 16

imm[32:0]

*

* rd: b000 for SAR, b001 CCR, b010 DAR

*/

*DmaProg= 0xBC;

*(DmaProg+ 1) = Rd & 0x7;

XDmaPs_Memcpy4(DmaProg+ 2, (char *)&Imm);

return 6;

}

那么,看下面一段汇编代码,代码完成160K数据搬运,数据源和目的都是DDR:

DMAMOV  SAR  #SrcAddr

DMAMOV DAR   #DstAddr

DMAMOV CCR   #CCRn

DMALP lc1 outerloop

DMALP lc0 innerloop

DMALD

DMAST

DMALPEND lc0

DMALD

DMAST

DMALPEND lc1

DMASEV

DMAEND

DMAC提供了两个计数器lc0和lc1,都是8bit的,因此每层循环的次数都不能超过256次。指令执行到DMASEV时控制器发出完成中断,执行过程中遇到任何错误或异常均发出Abrot中断。

在本例中SrcAddr=0x10000000,DstAddr = 0x11000000,数据长度为160KB,CCRn的参数如下:

CCRn.EndianSwapSize = 0x00;

CCRn.DstCacheCtrl   =0x00;

CCRn.DstProtCtrl   = 0x00;

CCRn.DstBurstLen   = 0x07;

CCRn.DstBurstSize  = 0x03;

CCRn.DstInc          =0x01;

CCRn.SrcCacheCtrl  = 0x00;

CCRn.SrcProtCtrl   = 0x00;

CCRn.SrcBurstLen   = 0x07;

CCRn.SrcBurstSize  = 0x03;

CCRn.SrcInc          =0x01;

那么通过库函数XDmaPs_BuildDmaProg生成的可执行机器码就是:

[Addr]Code

[0] BC

[1] 0

[2] 0

[3] 0

[4] 0

[5] 10

[6] BC

[7] 2

[8] 0

[9] 0

[A] 0

[B] 11

[C] BC

[D] 1

[E] 77

[F] C0

[10] 1D

[11] 0

[12] 22

[13] 9

[14] 20

[15] FF

[16] 4

[17] 8

[18] 38

[19] 2

[1A] 3C

[1B] 6

[1C] 34

[1D] 0

[1E] 0

代码正常执行完成后产生SEV中断,需在中断服务程序中清除当前的中断状态。

2.3 启动或停止DMA传输

在DMA控制器的诸多寄存器中,绝大部分仅是反映DMA引擎的当前执行情况,用于实施跟踪执行状态。至关重要的寄存器DBGSTATUS、DBGCMD、DBGINST0、DBGINST1用于控制DMA的开始、中断和终止。也就是DMA指令中的DMAGO、DMASEV和DMAKILL,由于APB接口和DMA引擎间的异步关系,指令执行存在一定的延时,在下发下条指令前一定要通过读取DBGSTATUS的值轮询上次指令是否执行完毕。

2.4 异常处理

遇到DMA Abrot中断事件,都必须下发DMAKILL指令终止当前线程。

3 总结

ARM PL330 DMA控制器乍看来似乎难以理解,实际上它是把DMAC当成一个协处理来看待,有自己的指令执行引擎。用户组织好执行机器码后存到内存,用户通过APB接口发出DMAGO指令告诉DMAC的指令执行引擎执行代码的首地址并启动DMA指令引擎直到指令执行到DMAEND停止。

备注:比如将SDK安装到了D:\Vivado\SDK目录下,版本为2015.2,那么DMAC参考示例代码就存放在“D:\Vivado\SDK\2015.2\data\embeddedsw\

XilinxProcessorIPLib\drivers\dmaps_v2_1\examples”路径下。

Zynq PS DMA控制器应用笔记相关推荐

  1. linux zynq ps dma,Zynq PS DMA控制器应用笔记

    Zynq-7000系列器件PS端的DMA控制器采用ARM的IP核DMA-330(PL-330)实现.有关DMA控制器的硬件细节及相关指令集.编程实例内容参考ARM官方文档: DDI0424D:dma3 ...

  2. ZYNQ PS端模块读书笔记-中断

    作者:ShownSun 工作室:时沿科技 文章目录 ZYNQ PS端模块读书笔记-中断 0 引言 1 环境 1.1 私有.共享和软件中断 1.2 通用中断控制器 1.3 复位和时钟 1.4 模块框图 ...

  3. ZYNQ PS端模块读书笔记-XADC

    作者:ShownSun 工作室:时沿科技 文章目录 ZYNQ PS端模块读书笔记-XADC 1 介绍 1.1 特色 1.2 系统视角 1.3 PS-XADC接口框图 1.4 编程指南 2 功能描述 2 ...

  4. linux zynq ps dma,Zynq PS侧DMA驱动

    Linux中,驱动必然会有驱动对应的设备类型.在linux4.4版本中,其设备是以设备树的形式展现的. PS端设备树的devicetree表示如下 324 dmac_s: dmac@f8003000 ...

  5. zynq PS侧DMA驱动

    linux中,驱动必然会有驱动对应的设备类型.在linux4.4版本中,其设备是以设备树的形式展现的. PS端设备树的devicetree表示如下 324 dmac_s: dmac@f8003000 ...

  6. Zynq Qspi控制器应用笔记

    原文地址:http://blog.csdn.net/haoxingheng/article/details/47399437 1 Zynq Qspi控制器 Zynq Qspi控制器支持三种模式:I/O ...

  7. STM32学习笔记——DMA控制器(向原子哥学习)

    一.DMA简介 DMA,全称为:Direct Memory Access,即直接存储器访问,DMA 用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输.当 CPU 初始化这个传输动作,传输 ...

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

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

  9. AXI总线技术简介——ZYNQ PS和PL的互联技术

    AXI总线技术简介--ZYNQ PS和PL的互联技术 1.AXI总线介绍 2.AXI协议通道介绍 3.ZYNQ芯片内部的AXI总线 4.常用AXI接口IP介绍 5. 多个AXI接口互联交互 1.AXI ...

最新文章

  1. pandas使用dt.year(month/day/hour/minute/second)函数抽取dataframe日期数据列对应的年月日时分秒信息
  2. 4月25日日志(4.25)
  3. 2012年上半年网工考试试题分析
  4. 分模块开发创建父工程——(六)
  5. Oracle与OpenJDK之间的区别
  6. spring-kafka整合:DefaultKafkaProducerFactory默认kafka生产者工厂介绍
  7. commit git idea 速度慢_关于Idea使用git时commit特别慢的问题及解决方法
  8. 分布式链路追踪(Sleuth、Zipkin)
  9. Java自动化测试——打开浏览器
  10. python前面三个大于号是啥_JavaScript 无符号位移运算符 三个大于号 的使用方法...
  11. 2021年最佳Selenium替代品
  12. 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径, 使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。
  13. 异常处理·EF·准备命令定义时发生错误。有关详细信息,请参阅内部异常
  14. 【Microsoft Visual Studio 2010完成CLR窗体应用程序】计算器和画图板的设计
  15. # 代码块 while
  16. 感觉工作找不到了,那就找个找到工作的的男朋友吧
  17. asp.net发布web service时出现“未能创建类型”错误
  18. IE firefox chrome收藏夹同步问题
  19. 笔记合集 爬虫基础系列 临近结束 课件直接合一起 方便自己寻找 有空再整理
  20. (附源码)springboot+mysql+基于Java的学生请销假审批管理系统的设计与实现 毕业设计130939

热门文章

  1. Java基础进阶集合-map集合
  2. 基于php的动漫网站设计
  3. python排序算法 ——冒泡排序(附代码)
  4. 五分钟理解服务器 SMP、NUMA、MPP 三大体系结构
  5. 如何生成微信小程序短链?
  6. Django contrib Comments 评论模块详解
  7. php买东西扣钱,莫名被扣费有点慌?这几种方法,让你告别免密支付烦恼
  8. 如何与老外有效交流_英语联盟
  9. 从不赚钱到赚钱,最需要的改变是什么? | 赚钱游戏
  10. Python 神器 virtualenv / venv