1. DMA外設(shè)特點:
1. DMA引擎擁有一個靈活的指令設(shè)置DMA的傳輸;
2. 擁有8個cache線,每一個cache線寬度是4個字;
3. 擁有8個可以并行的DMA通道線程;
4. 擁有8個中斷給中斷控制器;
5. 擁有8個DMA觸發(fā)事件并且可以編碼控制;
6. 128個(64bit)的MFIFO,在傳輸?shù)臅r候讀寫端可寫入到此FIFO;
7. 支持任意內(nèi)存到內(nèi)存的傳輸;
整個系統(tǒng)中的DMA控制器如圖1所示:
圖1 DMA控制器系統(tǒng)圖
DMAC包含一個指令處理單元,其能夠編碼控制DMA傳輸,每一個線程包含一個獨立的狀態(tài)機(jī)處理各自的DMA事件,包括通道仲裁,通道優(yōu)先級。
當(dāng)一個通道線程執(zhí)行加載或者存儲指令的時候控制器會將指令增加到讀隊列和寫隊列中,控制器使用這些隊列來存儲指令,并且按隊列指令順序在AXI總線上完成傳輸。
2. DMA在AXI總線上傳輸:
所有的DMA傳輸使用AXI接口移動數(shù)據(jù),包括片上內(nèi)存的移動,DDR內(nèi)存,以及PL上的從外設(shè)內(nèi)存。PL端的從外設(shè)正常連接到DMAC外設(shè)接口上控制其數(shù)據(jù)流。DMAC在PS端可以訪問到IOPs,但是正常情況下不會使用,因為這些路徑不會提供數(shù)據(jù)流信號。DMAC數(shù)據(jù)路徑正常使用情況如圖2所示,沒一個AXI路徑可以執(zhí)行一個讀或者一個寫,其中擁有好多組合,典型的DMA傳輸有:
內(nèi)存到內(nèi)存的傳輸(片上內(nèi)存到DDR內(nèi)存);
內(nèi)存到PL端外設(shè)或者PL端外設(shè)到內(nèi)存(DDR內(nèi)存到PL端外設(shè))。
圖2 數(shù)據(jù)流傳輸
3. DMA的管理:
DMAC實時操作時,用戶可以通過下面的指令設(shè)置DMA的傳輸:
DMAGO:開始一個用戶指定通道的DMA傳輸;
DMASEV:用戶指定的一個事件或者中斷發(fā)生時給出信號;
DMAKILL:終止一個線程。
當(dāng)DMA管理器接受到一個從APB從接口的指令后,會等待若干個時鐘周期,在執(zhí)行指令之前(pipeline是處于忙的狀態(tài),在執(zhí)行其他指令)。
4. 多通道數(shù)據(jù)FIFO(MFIFO)
MFIFO是一個當(dāng)前所有活動通道共享的,基于先進(jìn)入先服務(wù)的共享資源。對于編程角度來講,它是以份額深度可變的并行的FIFO集合,每個通道都有一個FIFO,但是所有FIFO的總深度不能超多MFIFO的大小,DMAC的MFIFO深度最大為128個64bit的大小。
5. 事件和中斷:
DMAC支持16個事件,開始的8個事件是中斷信號,IRQs[7:0],這8個中斷都會輸出到PS或者PL的中斷控制器。這些事件使用內(nèi)部的DMA引擎通道與通道之間的傳輸。EMAC的中斷事件表如圖3所示。
圖3 事件與中斷
DMA的配置實例
配置DMA做內(nèi)存到內(nèi)存的傳輸實例。
DMA配置步驟:
1. 初始化dma的命令數(shù)據(jù)結(jié)構(gòu),主要配置傳輸源地址,目的地址,傳輸長度,burst的大小等信息;
2. 通過DMA的ID信息,找到DMA外設(shè)信息;
3. 初始化dma的數(shù)據(jù)結(jié)構(gòu);
4. 連接到硬件中斷,將GIC中斷映射到中斷向量表中;
5. 通過GIC的ID信息,找到GIC外設(shè)信息;
6. 鏈接DMA中斷和GIC,將DMA中斷映射到GIC控制器上;
7. 時能GIC中斷;
8. 使能硬件中斷;
9. 設(shè)置中斷服務(wù)函數(shù)的映射配置;
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
+關(guān)注
關(guān)注
3文章
566瀏覽量
100964 -
DDR內(nèi)存
+關(guān)注
關(guān)注
0文章
20瀏覽量
6891
發(fā)布評論請先 登錄
相關(guān)推薦
ZYNQ開發(fā)案例之ZYNQ的UART加載
![<b class='flag-5'>ZYNQ</b><b class='flag-5'>開發(fā)案</b>例<b class='flag-5'>之</b><b class='flag-5'>ZYNQ</b>的UART加載](https://file.elecfans.com/web1/M00/D2/7C/o4YBAF_K7F-AQ2n0AAFZHrfx6C8701.png)
DMA控制器介紹
一種以DMA控制器為基礎(chǔ)的SoC系統(tǒng)設(shè)計
![一種以<b class='flag-5'>DMA</b><b class='flag-5'>控制器</b>為基礎(chǔ)的SoC<b class='flag-5'>系統(tǒng)</b>設(shè)計](https://file1.elecfans.com//web2/M00/A5/B3/wKgZomUMOa2AcfyWAADagAH59zk101.jpg)
基于DMA控制器的UART串行通信設(shè)計
![基于<b class='flag-5'>DMA</b><b class='flag-5'>控制器</b>的UART串行通信設(shè)計](https://file.elecfans.com/web2/M00/49/58/pYYBAGKhtEeAEyCfAAAJlXeVLRg737.jpg)
LED顯示系統(tǒng)DMA控制器的設(shè)計
![LED顯示<b class='flag-5'>系統(tǒng)</b><b class='flag-5'>DMA</b><b class='flag-5'>控制器</b>的設(shè)計](https://file1.elecfans.com//web2/M00/A7/08/wKgZomUMQeyAUEuGAAAu9gJBEck026.png)
NiosⅡ系統(tǒng)中DMA控制器的原理及應(yīng)用
![NiosⅡ<b class='flag-5'>系統(tǒng)</b>中<b class='flag-5'>DMA</b><b class='flag-5'>控制器</b>的原理及應(yīng)用](https://file1.elecfans.com//web2/M00/A7/09/wKgZomUMQfmAd1EMAAANwgFQd-Q779.jpg)
dma控制器芯片8257資料介紹
![<b class='flag-5'>dma</b><b class='flag-5'>控制器</b>芯片8257資料介紹](https://file1.elecfans.com//web2/M00/A7/0A/wKgZomUMQfqAQnrMAAA8JKu0o4A505.png)
dma控制器由什么組成?
![<b class='flag-5'>dma</b><b class='flag-5'>控制器</b>由什么組成?](https://file1.elecfans.com//web2/M00/A7/0A/wKgZomUMQf6Abx0iAAAaoUqBma4221.jpg)
基于AXI總線的DMA控制器的設(shè)計
![基于AXI總線的<b class='flag-5'>DMA</b><b class='flag-5'>控制器</b>的設(shè)計](https://file1.elecfans.com//web2/M00/A7/0A/wKgZomUMQf-AOIx0AAAm5WMv5nc369.png)
dma控制器由什么組成
![<b class='flag-5'>dma</b><b class='flag-5'>控制器</b>由什么組成](https://file1.elecfans.com//web2/M00/A7/0A/wKgZomUMQgCABhq8AAA1oOzBZfk741.png)
可提高系統(tǒng)響應(yīng)速度的DMA控制器SoC系統(tǒng)架構(gòu)
![可提高<b class='flag-5'>系統(tǒng)</b>響應(yīng)速度的<b class='flag-5'>DMA</b><b class='flag-5'>控制器</b>SoC<b class='flag-5'>系統(tǒng)</b>架構(gòu)](https://file.elecfans.com/web1/M00/61/33/pIYBAFt_tZ-AGvhPAAAZn9RHIeo705.jpg)
dma控制器的組成
dma控制器是什么_dma控制器工作方式
ZYNQ基礎(chǔ)---AXI DMA使用
![<b class='flag-5'>ZYNQ</b>基礎(chǔ)---AXI <b class='flag-5'>DMA</b>使用](https://file1.elecfans.com/web3/M00/04/ED/wKgZPGd7SvCAE7QTAAAid90C1HA013.png)
評論