Xilinx AXI Central Direct Memory Access (CDMA)手冊筆記

官方手冊地址:https://china.xilinx.com/support/documentation/ip_documentation/axi_cdma/v4_1/pg034-axi-cdma.pdf
筆記主要是記錄手冊中比較有用的,具體詳細的還是得去細看手冊!!!

聲明:所有文章屬於個人在工作中所記下和蒐集的筆記,不得轉載

  1. CDMA:Central Direct Memory Access,IP核內部框架如下:
    從框架圖可以看出:
    S_AXI-Lite接口用來配置CDMA內部的寄存器,M_AXI接口用來搬運數據,M_AXI_SG接口一般與Bram連接,用來存儲描述符。cdma_introut表示中斷輸出,一般用於DMA傳輸完成標誌。
    s_axi_lite_aclk時鐘應該小於等於m_axi_aclk。
    s_axi_lite_aresetn低電平復位,復位應該至少保持16個時鐘週期內核纔會對復位生效,且必須與s_axi_lite_aclk時鐘同步。
    在這裏插入圖片描述在這裏插入圖片描述

  2. 寄存器地址採用小端模式,地址的[1:0]必須爲0。地址空間偏移量與C_BASEADDR分配有關,寄存器配置通過S_AXI_LITE接口控制
    重點關注的幾個地址:
    0x00:CDMA控制寄存器,bit[2]:復位bit位,bit[3]:SGMod,bit[6]:BD循環使能開關,bit[12]:DMA完成產生中斷標誌
    0x04:CDMA狀態寄存器,bit[1]:Idle,1表示Idle,0表示Not Idle
    0x08:當前描述符指針,[31:6]R/W,[5:0]Reserved,SG模式下可用,CDMACR.IDLE = 1時寫入,寫入此字段的
    描述符地址必須對齊到64字節邊界(8個64bit),示例是0x00,0x40,0x80
    0x10:末尾描述符指針,[31:6]R/W,[5:0]Reserved,SG模式下可用,CDMACR.IDLE = 1時寫入,寫入該寄存器會啓動SG模式DMA傳輸
    0x18:取數的源地址,[31:0]R/W,Simple模式下可用,CDMACR.IDLE = 1時寫入
    0x20:送往目的地的地址,[31:0]R/W,Simple模式下可用,CDMACR.IDLE = 1時寫入
    0x28:要轉移的字節數,[25:0]R/W,[31:26]Reserved,Simple模式下可用,CDMACR.IDLE = 1時寫入,寫入BTT寄存器會啓動Simple模式DMA傳輸,不允許值爲零(0),會導致DMA內部錯誤
    在這裏插入圖片描述
    在這裏插入圖片描述

  3. Simple DMA 模式操作步驟:
    在此模式下, CDMA執行一個編程的DMA命令後停止。需要外部AXI4主機爲每個所需的DMA操作設置CDMA寄存器。
    以下步驟描述瞭如何在簡單操作模式下建立和啓動CDMA傳輸。
    a). 驗證CDMASR.IDLE = 1。
    b). 將CDMACR.IOC_IrqEn bit[12]位編程爲傳輸完成時產生中斷所需的狀態。還可以設置錯誤中斷啓用(CDMACR.ERR_IrqEn)。
    c). 將傳輸源地址寫入源地址(SA)寄存器, 該源地址的傳輸數據必須有效並準備好傳輸。如果地址空間大於32位,還得寫SA_MSB寄存器。
    d). 將傳輸目標地址寫入(DA)寄存器。如果地址空間大於32位,則還要寫入DA_MSB寄存器。
    e). 寫入要傳輸的字節數。一次傳輸最多可以指定8,388,607(8M)個字節(使用DataMover Lite除外),寫入BTT寄存器開始數據傳輸。
    f). 輪詢CDMASR.IDLE位進行斷言(CDMASR.IDLE = 1)或等待CDMA產生輸出中斷(假設CDMACR.IOC_IrqEn = 1) 。
    g). 如果基於中斷,則確定中斷源(傳輸完成或發生錯誤)。
    h). 通過向DMASR.IOC_Irq位寫入1來清除CDMASR.IOC_Irq位。
    i). 準備另一次傳輸,回到第1步。

  4. Scatter Gather Mode操作步驟:

SG DMA模式由AXI CDMA SG接口訪問相關指令,該指令列表被組織成傳輸描述符鏈。每個描述符都有一個指向要處理的下一個順序描述符的地址指針。鏈中的最後一個描述符通常指向鏈中的第一個描述符,但也不是必需的。
a). 寫一個有效指針到通道CURDESC_PNTR寄存器(偏移量0x08),如果選擇的地址空間大於32,則寫入CURDESC_PNTR_MSB以指定
當前描述符指針的高位。
b). 如果有需要得話將控制信息寫入通道CDMACR寄存器(偏移量0x00)以設置中斷使能和鍵孔功能。
c). 寫一個有效指針到通道TAILDESC_PNTR寄存器(偏移量0x10),將啓動通道數據提取和處理描述符。如果選擇的地址空間大於32,則寫入TAILDESC_PNTR_MSB指定當前的高位描述符指針。
d). CDMA數據搬移操作繼續,直到處理 TAILDESC_PNTR 處的描述符,然後引擎才空閒,此時CDMASR.Idle = 1。

  1. 循環CDMA模式
    通過對BD鏈設置進行一些更改,可以在循環模式下運行AXI CDMA。在循環模式中, CDMA獲取並處理相同的BD而沒有任何中斷。 該
    CDMA繼續獲取和處理,直到被停止或復位。
    它工作的流程與Scatter Gather Mode操作步驟一致,在編寫尾部描述符寄存器之後, CDMA開始獲取和處理BD(以環形方式設置),直到CDMA停止或復位。
    在這裏插入圖片描述
  2. Scatter Gather 傳輸描述符定義

傳輸描述符由8個32bitd的字組成,描述符表示單個CDMA傳輸加上到下一個順序描述符的地址鏈接所需的控制和狀態信息。每個描述符可以定義多達8,388,607(8M)字節數據的單個CDMA傳輸。描述符通過M_AXI_SG接口讀取

地址空間偏移量相對於系統存儲器中傳輸描述符的第一個字的地址,傳輸描述符必須在16位32位字對齊上對齊。示例有效偏移量爲0x00,0x40,0x80和0xC0,所以bit[5:0]必須爲0
在這裏插入圖片描述
0x00:下一個描述符指針,[31:6]R/W,[5:0]Reserved
0x04:下一個描述符指針的MSB,[31:0]R/W
0x08:DMA傳輸的數據讀取操作的起始地址,[31:0]R/W
0x0c:DMA傳輸的數據讀取操作的起始地址MSB,[31:0]R/W
0x10:DMA傳輸的數據寫操作的起始地址,[31:0]R/W
0x14:DMA傳輸的數據寫操作的起始地址MSB,[31:0]R/W
0x18:要轉移的字節數,此字段最多可以指定67,108,863(63M)字節的數據,不允許值爲零(0),會導致AXI CDMA設置DMA內部錯誤。[25:0]R/W,[31:26]Reserved
0x1c:CDMA傳輸描述符的狀態,完成傳輸描述符時狀態字被更新,然後由SG引擎寫該寄存器使該寄存器復位。
在這裏插入圖片描述
bit[31]:Cmplt,傳輸完成標誌
bit[30]:DMADecErr,DMA解碼錯誤
bit[29]:DMASlvErr,DMA從設備錯誤
bit[28]:DMAIntErr,DMA內部錯誤

  1. 中斷
    中斷使能位在CDMA控制寄存器(CDMACR)中設置。
    中斷輸出與s_axi_lite_aclk時鐘輸入同步。
    簡單模式每次傳輸完成都會有產生中斷,效率較低;SG模式可以只產生一次中斷,通過中斷級聯減少中斷頻率;循環模式數據傳輸自動在數據塊之間輪詢,沒有中斷產生,效率較高。

  2. 生成IP後,打開Example進行仿真可以看到波形如下:
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述

在仿真波形中:
a) 首先通過s_axi_lite接口配置CDMA的寄存器:
寫地址0x00,寫數據0x0002_7008,CDMAR寄存器
寫地址0x08,寫數據0x0000_0000,當前描述符指針
寫地址0x10,寫數據0x0000_0004,末尾描述符指針
b)然後通過m_axi_sg接口讀取兩個描述符分別8個數據:
addr=0x00,length=7,arsize=2,
data=0x0000_0040,(NEXT_DESC_PNTR)
0x0000_0000,(NEXT_DESC_PNTR_MSB)
0x0000_0000,(SA)
0x0000_0000,(SA_MSB)
0x0000_0000,(DA)
0x0000_0000,(DA_MSB)
0x0000_0080,(CONTROL),要轉移的字節數,63M地址空間,ox80bytes=128bytes=16個64bit
0x0000_0000;(STATUS),bit[31]:Cmplt,傳輸完成標誌
因爲m_axi_sg接口掛的是RAM,所以這個描述符的意思是把源地址0x00到0x0f的數據讀出來,寫入目的地址0x00到0x0f

addr=0x40,length=7,arsize=2,
data=0x0000_0080,(NEXT_DESC_PNTR)
0x0000_0000,(NEXT_DESC_PNTR_MSB)
0x0000_0080,(SA)
0x0000_0000,(SA_MSB)
0x0000_0000,(DA)
0x0000_0000,(DA_MSB)
0x0000_0080,(CONTROL),要轉移的字節數,63M地址空間,ox80bytes=128bytes=16個64bit
0x0000_0000;(STATUS),bit[31]:Cmplt,傳輸完成標誌
因爲m_axi_sg接口掛的是RAM,所以這個描述符的意思是把源地址0x80到0x8f的數據讀出來,寫入目的地址0x00到0x0f
c).m_axi接口讀取16個數據:
addr=0x00,length=0f,arsize=3,
data=0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f
m_axi接口寫16個數據:
addr=0x00,length=0f,arsize=3,
data=0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f

m_axi接口讀取16個數據:
addr=0x80,length=0f,arsize=3,
data=0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f
m_axi接口寫16個數據:
addr=0x00,length=0f,arsize=3,
data=0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f

d).m_axi_sg接口寫兩個地址的數據(目前還沒搞明白這一步的作用,如果有誰知道的話可以在下面評論留言
addr=0x1c,length=0,arsize=2,data=0x8000_000;
addr=0x5c,length=0,arsize=2,data=0x8000_000;

e).最後cdma_introut中斷輸出

更多有關中斷的詳細信息可以查看手冊。

在網上看到這個鏈接也可以做參考:https://blog.csdn.net/Lily_9/article/details/81233478

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章