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
+關注
關注
3文章
568瀏覽量
101499 -
DDR內存
+關注
關注
0文章
21瀏覽量
6942
發布評論請先 登錄
相關推薦
ZYNQ開發案例之ZYNQ的UART加載

DMA控制器介紹
一種以DMA控制器為基礎的SoC系統設計

基于DMA控制器的UART串行通信設計

NiosⅡ系統中DMA控制器的原理及應用

dma控制器芯片8257資料介紹

dma控制器由什么組成?

dma控制器由什么組成

可提高系統響應速度的DMA控制器SoC系統架構

dma控制器的組成
dma控制器是什么_dma控制器工作方式
ZYNQ基礎---AXI DMA使用

評論