1. 程式人生 > >Zynq PS DMA控制器應用筆記

Zynq PS DMA控制器應用筆記

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控制器應用筆記

Zynq PS DMA應用筆記 Hello,Panda Zynq-7000系列器件PS端的DMA控制器採用ARM的IP核DMA-330(PL-330)實現。有關DMA控制器的硬體細節及相關指令集、程式設計例項內容參考ARM官方文件:       DDI0424D:dma33

Zynq Qspi控制器應用筆記

1 Zynq Qspi控制器         Zynq Qspi控制器支援三種模式:I/O模式、線性地址模式和傳統SPI模式,其中線性地址模式雙片選支援最大的線性地址空間為32MB,可通過PS DMA讀取。 1.1 線性地址模式         線性地址模式只可從Q

STM32學習及應用筆記二:一次運算符優先級造成的錯誤

位與 指向 cells 偏移 getchar() 取地址 大於 沒有 事情 本人在最近一個項目的開發中,出現一個應為疏忽運算符優先級造成的問題,檢查了很久才發現問題,所以覺得運算符的優先級問題還是有必要再研究一下。具體的問題是這樣的,我采集了傳感器的原始數據,然後會

APPium自動化啟動手機應用筆記

自動化appiumjava啟動方法1、需要安裝JAR2、啟動如下:public class InitDriver {public static AndroidDriver<AndroidElement> initDriver() throws Exception{File app=new File

專用於jsp到jsp/html的轉發控制器--學習筆記

專用於jsp到jsp/html的轉發控制 <!-- 專用於jsp到jsp/html的轉發控制器 --> <bean name="/index.action" class="org.springframework.web.servlet.mvc.ParameterizableV

PID控制器開發筆記之六:不完全微分PID控制器的實現

沒有 pan IV bsp 算法 濾波器 process 位置 之間   從PID控制的基本原理我們知道,微分信號的引入可改善系統的動態特性,但也存在一個問題,那就是容易引進高頻幹擾,在偏差擾動突變時尤其顯出微分項的不足。為了解決這個問題人們引入低通濾波方式來解決這一問題。

PID控制器開發筆記之九:基於前饋補償的PID控制器的實現

傳遞 了解 都沒有 控制 結構體 控制器 基本 跟蹤 模型   對於一般的時滯系統來說,設定值的變動會產生較大的滯後才能反映在被控變量上,從而產生合理的調節。而前饋控制系統是根據擾動或給定值的變化按補償原理來工作的控制系統,其特點是當擾動產生後,被控變量還未變化以前,根據擾

C語言學習及應用筆記之二:C語言static關鍵字及其使用

static關鍵字 可能 語言 需要 c語言 UNC function 不必要 能夠   C語言有很多關鍵字,大多關鍵字使用起來是很明確的,但有一些關鍵字卻要相對復雜一些。我們這裏要說明的static關鍵字就是如此,它的功能很強大,相應的使用也就更復雜。   一般來說sta

C語言學習及應用筆記之四:C語言volatile關鍵字及其使用

  在C語言中,還有一個並不經常使用但卻非常有用的關鍵字volatile。那麼使用volatile關鍵字究竟能幹什麼呢?接下來我將就此問題進行討論。   一個使用volatile關鍵字定義變數,其實就是告訴編譯系統這變數可能會被意想不到地改變。那麼編譯時,編譯器就不會自作主張的去假設這個變數的值,而進行程式

Zephyr應用筆記:mcuboot載入程式簡單介紹

本文對mcuboot(version 1.1.0)做一個簡單介紹供參考,Github地址:https://github.com/runtimeco/mcuboot 以下內容都是針對(version 1.1.0)做介紹: 目前支援三種作業系統: Ze

Pod控制器應用進階五(kubernetes service)

kubernetes service是強依賴CoreDNS或者是kube-dns功能 node network節點網路 pod network pod網路 cluster network service ip kube-proxy元件是監控apiservice和service 資源變動的資訊,通

Pod控制器應用進階四(Pod更新,擴縮容)

vim deploy-demo.yaml [[email protected] test]# cat deploy-demo.yaml apiVersion: apps/v1 kind: Deployment metadata: name: myapp-deploy name

Pod控制器應用進階三

spec: spec:     name     image     imagePullPolicy:Always,Never,IfNotPresent     ports

嵌入式實時作業系統small RTOS51原理及應用 ----筆記 第三章 一個簡單的例子

嵌入式實時作業系統small RTOS51原理及應用 ----筆記 第三章 一個簡單的例子 keil C51 除錯程式碼: 軟體模擬模擬 執行 原始碼 #define OS_ENTER_CRITICAL() EA = 0,Os_Enter_Sum++

嵌入式實時作業系統small RTOS51原理及應用 ----筆記 前言 緒論

圍繞 DP-51 微控制器模擬實驗儀的硬體電路, 闡述Small RTOS51 作業系統的設計原理。 詳細的介紹了RS232 ,I2C,USB1.1和CANBUS等一系列外圍器件及其功能部件的應用設計。 本書的原理篇,以Small RTOS V1.12.1版本為基礎, 微型嵌入式

嵌入式實時作業系統small RTOS51原理及應用 ----筆記 第五章 如何任務切換

嵌入式實時作業系統small RTOS51原理及應用 ----筆記 第五章 如何任務切換 5.3 何時進行任務切換 參考書籍<MCS-51微控制器原理與應用.pdf> TMOD = (TMOD & 0XF0) | 0X01; TL0 = 0x0;

PID控制器開發筆記之十二:模糊PID控制器的實現

poi 技術 last 全部 arr linear 數值 .com 數據   在現實控制中,被控系統並非是線性時不變的,往往需要動態調整PID的參數,而模糊控制正好能夠滿足這一需求,所以在接下來的這一節我們將討論模糊PID控制器的相關問題。模糊PID控制器是將模糊算法與PI

通訊系統模擬原理與無線應用筆記-MATLAB

  帶通訊號與系統的低通模擬模型 1.脈衝成形濾波器通常使用的是巴特沃斯濾波器     因為我們需要使用零ISI(inter-symbol interference)濾波器,如平方根升餘弦濾波器以保證差錯概率不會因為濾波器的“記憶性”而增大。然而,高階巴特沃斯濾

NUCLEO-8L152開發板中文應用筆記整理集合

【AN5182】基於Adafruit TFT Shield與STM8 Nucleo-64板的圖片檢視器:https://www.yiboard.com/thread-962-1-1.html 本應用筆記簡要介紹瞭如何將Adafruit 1.8”TFT shield與STM8 Nucleo-64開發板配

C語言學習及應用筆記之五:C語言typedef關鍵字及其使用

緩沖區 delta 定義類 學習 語言 函數指針 alt ora 枚舉   在C語言中有一個typedef關鍵字,其用來定義用戶自定義類型。當然,並不是真的創造了一種數據類型,而是給已有的或者符合型的以及復雜的數據類型取一個我們自己更容易理解的別名。總之,可以使用typed