Zynq7000系列FPGA中DMA引擎編程指南

DMA引擎的編程指南通常涉及一系列步驟和API調用,以確保數據在內存之間的高效傳輸,而無需CPU的直接干預。

DMA引擎的編程指南包括以下部分:

一、編寫微代碼為AXI事務編寫CCRx程序

通道微碼用于設置dmac.CCRx寄存器以定義AXI事務的屬性。這是通過使用DMAMOV CCR指令完成的。
在啟動DMA傳輸之前,用戶應該通過寫入dmac.CCR{7:0}寄存器對微碼進行編程。以下是微碼中寫入的AXI屬性:

  1. 基于突發的類型(遞增或固定地址)對src_inc和dst_inc比特字段進行編程。這會影響ARBURST[0]和AWBURST[0]AXI信號。
  2. 對src_burst_size和dst_burst_size比特字段(AXI上每個數據節拍的字節數)進行編程。這會影響ARSIZE[2:0]和AWSIZE[2:0]AXI信號。
  3. 對src_burst_len和dst_burst_len比特字段(每個AXI突發事務的數據節拍數)進行編程。這會影響ARLEN[3:0]和AWLEN[3.0]AXI信號。
  4. 對src_cache_ctrl和dst_cache_ctrl位字段進行編程(緩存策略)。這會影響ARCACHE[2:0]和AWCACHE[2:0]AXI信號。
  5. 對src_prot_ctrl和dst_prot_ctrl位字段(管理器線程的安全狀態)進行編程。如果管理器線程是安全的,則ARPROT[1]應設置為0,如果不安全,則應設置為1。ARPROT[0]和ARPROT[2]值應設置為=0。例如:

? ? ? ? ? --如果DMA管理器是安全的,則設置src_prot_ctrl=0'b0000;

? ? ? ? ? --如果DMA管理器是不安全的,則設置scr_prot_ctrl=0'b010。

? ? ? 6. 程序endian_swap_size=0(不交換)

二、內存到內存的傳輸

顯示DMAC操作以執行對齊、未對齊和固定數據傳輸的微碼示例。對齊傳輸請參見表1,未對齊傳輸請參閱表2,固定傳輸請參閱圖3。
注意:如果DMA傳輸使用緩存,程序員應確保使用適當的緩存操作來保持緩存一致性。在對DMA通道進行編程之前,應清除與存儲器地址范圍相對應的高速緩存條目并使其無效。

表1 DMAC對齊內存到內存的傳輸
描述代碼MFIFO使用

簡單對齊程序
在這個程序中,源地址和目的地址與AXI數據總線寬度對齊。

DMAMOV CCR, SB4 SS64
DB4 DS64
DMAMOV SAR, 0x1000
DMAMOV DAR, 0x4000
DMALP 16
DMALD
DMAST
DMALPEND
DMAEND

每個DMALD需要四個條目,而每個DMAST刪除四個條目。
此示例具有零個MFIFO條目的靜態要求和四個MFIF奧條目的動態要求。

具有多個負載的對齊不對稱程序
以下程序為每個存儲執行四次加載,并且源地址和目標地址與AXI數據總線寬度對齊。

DMAMOV CCR, SB1 SS64
DB4 DS64
DMAMOV SAR, 0x1000
DMAMOV DAR, 0x4000
DMALP 16
DMALD
DMALD
DMALD
DMALD
DMAST
DMALPEND

每個DMALD需要一個條目,而每個DMAST刪除四個條目。
此示例具有零個MFIFO條目的靜態要求和四個MFIF奧條目的動態要求。

具有多個存儲的對齊不對稱程序
以下程序為每個加載執行四個存儲,并且源地址和目的地地址與AXI數據總線寬度對齊。

DMAMOV CCR, SB4 SS64
DB1 DS64
DMAMOV SAR, 0x1000
DMAMOV DAR, 0x4000
DMALP 16
DMALD
DMAST
DMAST
DMAST
DMAST
DMALPEND
DMAEND

每個DMALD需要四個條目,而每個DMAST刪除一個條目。
此示例具有零個MFIFO條目的靜態要求和四個MFIF奧條目的動態要求。

表2 DMAC未對齊傳輸
描述代碼MFIFO使用

已對齊的源地址與未對齊的目標地址
在這個程序中,源地址與AXI數據總線寬度對齊,但目標地址不對齊。目的地址未與目的突發大小對齊,因此第一DMAST指令刪除的數據少于第一DMALD指令讀取的數據。
因此,需要單個字的最后DMAST來清除MFIFO中的數據。

DMAMOV CCR, SB4 SS64
DB4 DS64
DMAMOV SAR, 0x1000
DMAMOV DAR, 0x4004
DMALP 16
DMALD
DMAST
DMALPEND
DMAMOV CCR, SB4 SS64
DB1 DS32
DMAST
DMAEND

第一條DMALD指令加載四個雙字,但由于目標地址未對齊,DMAC將它們移位四個字節,因此它只刪除第一個循環中的三個條目,留下一個靜態MFIFO條目。每個DMAST只需要四個數據條目,因此額外的條目在程序的持續時間內一直使用,直到最后一個DMAST清空為止。
此示例具有一個MFIFO條目的靜態需求和四個MFIF奧條目的動態需求。

未對齊的源地址與對齊的目標地址
在這個程序中,源地址與AXI數據總線寬度不對齊,但目的地址對齊。源地址未與源突發大小對齊,因此第一個DMALD指令讀取的數據少于DMAST所需的數據。
因此,需要額外的DMALD來滿足第一DMAST。

DMAMOV CCR, SB4 SS64
DB4 DS64
DMAMOV SAR, 0x1004
DMAMOV DAR, 0x4000
DMALD
DMALP 15
DMALD
DMAST
DMALPEND
DMAMOV CCR, SB1 SS32
DB4 DS64
DMALD
DMAST
DMAEND

第一DMALD指令沒有加載足夠的數據以使DMAC能夠執行DMAST,因此在循環開始之前,程序包括額外的DMALD。在第一個DMALD之后,隨后的DMALD與源突發大小對齊。這優化了性能,但需要更多的MFIFO條目。
此示例具有四個MFIFO條目的靜態需求和四個MFINFO條目的動態需求。

未對齊的源地址到對齊的目標地址,初始負載過多
此程序是未對齊的源地址到對齊的目標地址中描述的程序的替代方案。該程序使用不同的源突發序列,這可能效率較低,但需要較少的MFIFO條目。

DMAMOV CCR, SB5 SS64
DB4 DS64
DMAMOV SAR, 0x1004
DMAMOV DAR, 0x4000
DMALD
DMAST
DMAMOV CCR, SB4 SS64
DB4 DS64
DMALP 14
DMALD
DMAST
DMALPEND
DMAMOV CCR, SB3 SS64
DB4 DS64
DMALD
DMAMOV CCR, SB1 SS32
DB4 DS64
DMALD
DMAST
DMAEND

第一DMALD指令加載五拍數據以使DMAC能夠執行第一DMAST。
在第一個DMALD之后,后續的DMALD不與源突發大小對齊,例如第二個DMALD從地址0x1028讀取。在循環之后,最后兩個DMALD讀取滿足最終DMAST所需的數據。
此示例具有一個MFIFO條目的靜態需求和四個MFIF奧條目的動態需求。

對齊的突發大小,未對齊的MFIFO
在該程序中,比MFIFO寬度窄的目標地址與突發大小對齊,但不與
MFIFO寬度。

DMAMOV CCR, SB4 SS32
DB4 DS32
DMAMOV SAR, 0x1000
DMAMOV DAR, 0x4004
DMALP 16
DMALD
DMAST
DMALPEND
DMAEND
如果DMAC配置具有32位AXI數據總線寬度,則該程序需要四個MFIFO條目。然而,在這個例子中,DMAC具有64位AXI數據總線寬度,并且由于目的地地址不是64位對齊的,所以它需要三個而不是預期的兩個MFIFO條目。
此示例具有零個MFIFO條目的靜態要求和三個MFIF奧條目的動態要求。

表3 DMAC固定傳輸

描述代碼MFIFO使用

地址對齊的固定目的地
在這個程序中,源地址和目的地地址與AXI數據總線寬度對齊,目的地地址是固定的。

DMAMOV CCR, SB2 SS64
DB4 DS32 DAF
DMAMOV SAR, 0x1000
DMAMOV DAR, 0x4000
DMALP 16
DMALD
DMAST
DMALPEND
DMAEND

程序中的每個DMALD將兩個64位數據傳輸加載到MFIFO中。因為目的地地址是32位固定地址,所以DMAC將每個64位數據項拆分為MFIFO中的兩個條目。
此示例具有零個MFIFO條目的靜態要求和四個MFIF奧條目的動態要求。

三、PL外設DMA傳輸長度管理

示例:由外圍設備管理的長度

以下示例顯示了一個DMAC程序,當外圍設備發送突發請求(DMA{3:0}_DRTYPE[1:0]=01)時,該程序將64個字從存儲器傳輸到外圍設備0。當外圍設備發送單個請求(DMA{3:0}_DRTYPE[1:0]=00)時,DMAC程序將一個字從存儲器傳輸到外圍設備0。

為了傳輸64個字,程序指示DMAC執行16個AXI總線事務。每個事務由4比特突發(SB=4,DB=4)組成,其每個節拍移動一個數據字(SS=32,DS=32)。

在本例中,程序顯示了以下說明的使用:

  • DMAWFP指令——DMAC等待來自外圍設備的突發或單個請求。
  • DMASTPB和DMASTPS指令——DMAC在傳輸完成時通知外圍設備。
# Set up for burst transfers (4-beat burst, so SB4 and DB4), 
# (word data width, so SS32 and DS32)
DMAMOV CCR SB4 SS32 DB4 DS32
DMAMOV SAR ...
DMAMOV DAR ...
# Initialize peripheral '0'
DMAFLUSHP P0
# Perform peripheral transfers
# Outer loop - DMAC responds to peripheral requests until peripheral
# sets drlast_0 = 1
DMALPFE
# Wait for request, DMAC sets request_type0 flag depending on the
# request type it receives
DMAWFP 0, periph
# Set up loop for burst request: first 15 of 16 sets of transactions
# Note: B suffix - conditionally executed only if request_type0 
# flag = Burst
DMALP 15
DMALDB
DMASTB
# Only loopback if servicing a burst, otherwise treat as a NOP
DMALPENDB
# Perform final transaction (16 of 16). Send the peripheral
# acknowledgement of burst request completion
DMALDB
DMASTPB P0
# Perform transaction if the peripheral signals a single request
# Note: S suffix - conditionally executed only if request_type0 
# flag = Single
DMALDS
DMASTPS P0
# Exit loop if DMAC receives the last request, that is, drlast_0 = 1
DMALPEND
DMAEND
示例:DMAC管理的長度

這個例子顯示了一個DMAC程序,當外圍設備發出16個連續的突發請求和3個連續的單個請求信號時,該程序可以傳輸1027個字。

# Set up for AXI burst transfer 
# (4-beat burst, so SB4 and DB4), (word data width, so SS32 and DS32)
DMAMOV CCR SB4 SS32 DB4 DS32
DMAMOV SAR ...
DMAMOV DAR ...
# Initialize peripheral '0'
DMAFLUSHP P0
# Perform peripheral transfers
# Burst request loop to transfer 1024 words
DMALP 16
# Wait for the peripheral to signal a burst request. 
# DMAC transfers 64 words for each burst request
DMAWFP 0, burst
# Set up loop for burst request: first 15 of 16 sets of transactions
DMALP 15
DMALD
DMAST
DMALPEND
# Perform final transaction (16 of 16).
# Send the peripheral acknowledgment of burst request completion
DMALD
DMASTPB 0
# Finish burst loop
DMALPEND
# Set up for AXI single transfer (word data width, so SS32 and DS32)
DMAMOV CCR SB1 SS32 DB1 DS32
# Single request loop to transfer 3 words
DMALP 3
# Wait for the peripheral to signal a single request. DMAC to transfer
# one word
DMAWFP 0, single
# Perform transaction for single request and send completion
# acknowledgement to the peripheral
DMALDS
DMASTPS P0
# Finish single loop
DMALPEND
# Flush the peripheral, in case the single transfers were in response
# to a burst request
DMAFLUSHP 0
DMAEND

四、使用事件重新啟動頻道

當INTEN寄存器被編程為生成事件時,DMASEV和DMAWFE指令可用于重新啟動一個或多個DMA通道。
以下部分描述了DMAC在以下情況下的行為:

  • DMAC在DMASEV之前執行DMAWFE
  • DMAC在DMAWFE之前執行DMASEV
DMAC在DMASEV之前執行DMAWFE

要重新啟動單個DMA通道:

  1. 第一個DMA通道執行DMAWFE,然后在等待事件發生時暫停。
  2. 另一個DMA通道使用相同的事件編號執行DMASEV。這將生成一個事件,并且第一個DMA通道將重新啟動。DMAC在執行DMASEV一個DMA{3:0}_ACLK周期后清除該事件。

可以對多個通道進行編程,以等待同一事件。例如,如果四個DMA通道都執行了事件12的DMAWFE,那么當另一個DMA通道執行事件12的DMASEV時,四個DMA信道都同時重新啟動。DMAC在執行DMASEV一個時鐘周期后清除事件。

DMAC在DMAWFE之前執行DMASEV

如果DMAC在另一個通道執行DMAWFE之前執行DMASEV,則該事件將一直掛起,直到DMAC執行DMAWFE。當DMAC執行DMAWFE時,它會在一個DMA{3:0}_ACLK周期內停止執行,清除事件,然后繼續執行通道線程。

例如,如果DMAC執行DMASEV 6,而其他線程都沒有執行DMAWFE 6,則該事件保持掛起狀態。如果DMAC對通道4執行DMAWFE 6指令,然后對通道3執行DMAWFE6指令,則:

  1. DMAC在一個DMA{3:0}_ACLK周期內停止信道4線程的執行。
  2. DMAC清除事件6。
  3. DMAC恢復信道4線程的執行。
  4. DMAC暫停通道3線程的執行,并且線程在等待事件6的下一次發生時暫停。

五、中斷處理器

控制器通過中斷控制器(GIC)向CPU提供七個活動的高敏感中斷(IRQ ID#75:72和49:46)。當INTEN寄存器被編程為生成中斷時,在DMAC執行DMASEV之后,控制器將相應的中斷設置為活動高狀態。

外部微處理器可以通過寫入中斷清除寄存器(ICR)來清除中斷。

執行DMAWFE不會清除中斷。

如果DMASEV指令用于在DMAC完成DMALD或DMAST指令時通知微處理器,Arm建議在DMASEV之前插入內存屏障指令。否則,DMAC可能會在AXI事務完成之前發出中斷信號。
以下示例對此進行了演示:

DMALD
DMAST
# Issue a write memory barrier
# Wait for the AXI write transfer to complete before the DMAC can
# send an interrupt
DMAWMB
# The DMAC sends the interrupt
DMASEV

六、 指令集引用

表4和表5總結了DMAC指令和命令。

表4?DMA引擎指令摘要

表5 匯編程序提供的DMA引擎附加命令


?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/37990.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/37990.shtml
英文地址,請注明出處:http://en.pswp.cn/web/37990.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TikTok直播限流與網絡的關系及解決方法

TikTok作為一款熱門的社交平臺,其直播功能吸引了大量用戶。然而,一些用戶可能會遇到TikTok直播限流的問題,例如直播過程中出現播放量低、直播畫面質量差等情況。那么,TikTok直播限流與所使用的網絡線路是否有關系?是否…

學習springIOC

第二章 Spring IOC 章節內容 Spring IOC技術實現Spring IOC設值注入Spring IOC構造注入 章節目標 掌握Spring IOC技術實現掌握Spring IOC設置注入掌握Spring IOC構造注入 第一節 Spring簡介 1. Spring 簡介 Spring 是目前主流的 Java 開發框架,是 Java 世界最…

Android實現手寫輸入

android應用開發中有時會有手寫輸入需求,非通過系統鍵盤手寫功能,比如自定義鍵盤,這時就需要自己來實現,一般有兩種場景:一種是類似手寫簽名保存;另一種是真正的手寫輸入,需要將筆跡識別成正確的…

JTracker IDEA 中最好的 MyBatis 日志格式化插件

前言 如果你使用 MyBatis ORM 框架,那么你應該用過 MyBatis Log 格式化插件,它可以讓我們的程序輸出的日志更人性化。 但是有一個問題,通常我們只能看到格式化后的效果,沒辦法知道這個 SQL 是誰執行的以及調用的鏈路。 如下圖所…

文章解讀與仿真程序復現思路——電網技術EI\CSCD\北大核心《考慮復合指標優化模態分解和 Stacking 集成的綜合能源系統多元負荷預測》

本專欄欄目提供文章與程序復現思路,具體已有的論文與論文源程序可翻閱本博主免費的專欄欄目《論文與完整程序》 論文與完整源程序_電網論文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 電網論文源程序-CSDN博客電網論文源…

【stm32】大一上學期筆記復制

砌墻單片機 外設是什么? ipage 8 nx軸 128 X0-127 y0-63 PWM脈沖寬度調制 PWM脈沖寬度調制 2023年10月13日 基本特性:脈沖寬度調制PWM是一種對模擬信號進行數字編碼的方法。廣泛引用于電機控制,燈光的亮度調節,功率控制等領域…

趕緊收藏!全網最佳WebSocket封裝:完美支持斷網重連,自動心跳!

文章目錄 一、WebSocket封裝庫簡介二、庫的安裝與配置2.1 安裝2.2 初始化 三、功能詳解3.1 斷網重連3.2 自動心跳3.3 消息隊列3.4 事件管理 四、示例代碼五、總結 🎉歡迎來到Java學習路線專欄~探索Java中的靜態變量與實例變量 ☆* o(≧▽≦)o *☆嗨~我是IT陳寒&…

Windows Server 2019部署網絡負載均衡NLB服務的詳細操作步驟

部署前準備 首先需要準備兩臺Windows Server 2019服務器,虛擬機創建請參考 VMware Workstation安裝Windows Server2019系統詳細操作步驟_安裝windows server 2019操作系統(寫出操作過程)-CSDN博客 克隆虛擬機請參考 VMware Workstation克隆虛擬機詳細步驟-CSDN博…

超詳細的 C++中的封裝繼承和多態的知識總結<2.多態>

引言 小伙伴們我們都知道了,什么是封裝和繼承,在有了這個的基礎上我們接著來看什么是多態。多態從字面上意思我們就可以知道,大概就是一個函數的不同形態,而且,前邊我們在學習函數重載的時候我們已經簡單的了解了如何用…

[Swiper]在React中使用Swiper時注意銷毀實例

swiper版本號: {"swiper": "^4.4.2", }在useEffect中初始化swiper實例,由于依賴項的變更,可能會重復初始化: useEffect(() > {swiper.current new Swiper(#mainSwiper, {autoplay: {delay: 3000,//3秒切換一次},on…

Android 休眠流程(三)

Android 休眠流程(三) 上一篇《Android 休眠流程(二)》簡單講解內核階段進入休眠流程,本篇繼續深挖,簡單講解休眠進入ATF。ATF(ARM Trusted Firmware) 的體系架構里將整個系統分成四種安全等級,分別為:EL0、EL1、EL2、EL3。將整個安全啟動的流程階段定義為:BL1、BL2…

相等運算符==與 === 的區別

相等運算符用來比較兩個值是否相等 1、運算符 如果相等會返回true,否則返回false使用 來做相等運算當使用來比較兩個值時,如果值的類型不同,則會自動進行類型轉換,將其轉換為相同的類型比較 console.log("1" 1); //true console.…

機器學習算法 —— 基于penguins_raw數據集的決策樹

??歡迎來到 我的博客 —— 探索技術的無限可能! ??博客的簡介(文章目錄) 目錄 實戰演示基于penguins_raw數據集的決策樹實戰導入模塊數據信息簡單查看可視化描述利用 決策樹模型 在二分類上 進行訓練和預測利用 決策樹模型 在三分類(多分類)上 進行訓練和預測實戰 演示…

OCI對象存儲數據轉移到另一個桶

// 舊桶 String bucketName_old “Bucket-old”; // 新桶 String bucketName_new “Bucket-new”; // 圖片前綴 String filePrefix “obj-filePrefix/”; AmazonS3 instance AmazonS3ClientFactory.getS3Instance(); String continuationToken null; int num 0; try { do…

推薦算法學習筆記2.1:基于深度學習的推薦算法-基于共線矩陣的深度推薦算法-AutoRec模型

AutoRec模型 前置知識:推薦算法學習筆記1.1:傳統推薦算法-協同過濾算法 AutoRec模型通過引入自編碼器結構,將共線矩陣中的用戶向量(基于用戶的U-AutoRec)或物品向量(基于物品的I-AutoRec)嵌入到低維空間后還…

訊方技術鴻蒙應用定制開發服務上架華為云商店

在當前智能化與互聯互通發展的時代背景下,鴻蒙操作系統已成為推動創新應用發展的新引擎。隨著企業對個性化智能解決方案需求的不斷增長,鴻蒙應用定制開發已成為企業技術轉型升級的重要途徑。 訊方技術作為一家致力于為客戶提供全面專業服務的企業&#…

LVM核心概念

1. LVM簡介 LVM是邏輯盤卷管理(Logical Volume Manager)的簡稱,它是Linux環境下對磁盤分區進行管理的一種機制,LVM是建立在硬盤和分區之上的一個邏輯層,來提高磁盤分區管理的靈活性。 優點: 可以靈活分配…

Java中如何實現一個線程安全的HashMap?

在Java中,實現一個線程安全的HashMap可以通過使用java.util.concurrent.ConcurrentHashMap類來實現。ConcurrentHashMap類是Java并發包java.util.concurrent的一部分,它提供了一種線程安全的哈希表實現。 以下是如何使用ConcurrentHashMap實現線程安全的…

2024年,精品課錄制新方式,站在大屏前錄出綠幕摳像的效果!感謝不坑盒子!

先做個小調查:你們那邊請工作室錄一節課,多少錢?留言區交流一下。 暑假了,老師們又有時間來錄課了。 早在2021年秋天,精品課遴選的第一年,我就第一時間給大家分享了2種錄精品課的方法:大屏前錄…

python源碼:opencv多視頻源同屏拼接播放

一、前言 如標題所示,這個python代碼的目的是利用opencv模塊實現多視頻源同屏拼接播放的,里面包含視頻播放尺寸修改、視頻播放加序號、視頻流存活檢測等方案,可做擴展開發使用。 二、代碼 import cv2 import time from func_timeout import …