Xilinx AXI Central Direct Memory Access (CDMA)笔记

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时钟同步。


寄存器地址采用小端模式,地址的[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内部错误

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步。

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。

循环CDMA模式
通过对BD链设置进行一些更改,可以在循环模式下运行AXI CDMA。在循环模式中, CDMA获取并处理相同的BD而没有任何中断。 该
CDMA继续获取和处理,直到被停止或复位。
它工作的流程与Scatter Gather Mode操作步骤一致,在编写尾部描述符寄存器之后, CDMA开始获取和处理BD(以环形方式设置),直到CDMA停止或复位。

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内部错误

中断
中断使能位在CDMA控制寄存器(CDMACR)中设置。
中断输出与s_axi_lite_aclk时钟输入同步。
简单模式每次传输完成都会有产生中断,效率较低;SG模式可以只产生一次中断,通过中断级联减少中断频率;循环模式数据传输自动在数据块之间轮询,没有中断产生,效率较高。

生成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
————————————————
版权声明:本文为CSDN博主「R@」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/real003/article/details/90054993

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值