xilinx AXI-CDMA 学习笔记

时间:2024-03-20 13:30:09

此文是笔者记录的 AXI Central Direct Memory Access (CDMA)相关学习笔记及参考例程仿真说明。

仿真环境

win10 64bit

vivado 2017.4

modelsim 

功能介绍

IP架构

xilinx AXI-CDMA 学习笔记

模块分解介绍

Register Module
包含AXI-CDMA的控制及状态寄存器, 接口 AXI-lite ,寄存器列表如下:

xilinx AXI-CDMA 学习笔记

xilinx AXI-CDMA 学习笔记

Scatter/Gather Block
SG引擎模块,通过 AXI4-SG master接口,获取和更新系统内存中的CDMA 控制传输描述符链表。SG 引擎提供内部描述符队列,使得描述符的预取和处理能和CDMA数据传输同时进行。描述符链表定义如下:

DMA Controller
协调DM模块的命令加载,状态检索,并将状态更新会 register module 

DataMover :用作高吞吐量数据传输。提供4Kbyte地址保护的CDMA操作,突发自动拆分,多次传输请求自动排队。提供任意地址读写数据的 byte-level 重对齐功能(最多512bit  ???????)

IP接口

xilinx AXI-CDMA 学习笔记

 

仿真说明

直接生成example例程,然后关联modelsim仿真,以下以SG模式举例说明,

仿真模型如下(自己画的,将就看下)

xilinx AXI-CDMA 学习笔记

1) AXI_ATG_LOGIC 配置CDMA寄存器,设置SG Descriptor的 Current Descriptor Pointer和tail Descriptor Pointer

2)   AXI_M_SG根据 AXI_S_LITE设置的指针,从SG_BRAM中获取Descriptor list

3)DataMover 根据Descriptor list 从 U0_read 获取数据,写入到 U0_write 中。

4)写入U0_write的数据,同时给一份S2MM_DATA_CHECK模块,比较数据和AXI4_FULL产生的数据是否一致,数据pass/fail信号。

xilinx AXI-CDMA 学习笔记

 

AXI_ATG_LOGIC对CDMA配置如下:

xilinx AXI-CDMA 学习笔记

分别配置 0x0, 0x8, 0x10寄存器

对照datasheet, 写寄存器0x0 -> 0x0002_7008

bit[3] = 1 表示 SG mode

bit[12] = 1 表示 IOC_IrqEn

bit[13] = 1表示 Dly_IrqEn

bit[14] = 1 表示ERR_IrqEn

bit[23:16] = 0x2 表示 IRQThreshold = 0x2

xilinx AXI-CDMA 学习笔记

xilinx AXI-CDMA 学习笔记

xilinx AXI-CDMA 学习笔记

对照datasheet, 写寄存器0x8 -> 0x000, 配置当前描述符指针指向地址0

xilinx AXI-CDMA 学习笔记

对照datasheet, 写寄存器0x10 -> 0x0000_0040,配置尾描述符指针指向地址0x0000_0040

xilinx AXI-CDMA 学习笔记

AXI_ATG_LOGIC 写完 0X10寄存器后,触发SG ENGINE工作,从SG_BRAM读取 discriptor list, discriptor的定义如下:

xilinx AXI-CDMA 学习笔记

获取了两个链表,链表1如下:

xilinx AXI-CDMA 学习笔记

链表1说明:

0x0 -> NXTDESC_PNTR : 0x0000_0040 ,  下一个链表起始地址为0x0000_0040

0x4 -> NXTDESC_PNTR_MSB : 0x0000_0000, 地址高位为0

0x8 -> SA : 0x0000_0000, 数据源地址为0x0000_0000

0xc -> SA_MSB : 0x0000_0000, 数据源高位地址为0x0000_0000

0x10 -> DA : 0x0000_0000, 数据搬运的目的地址为0x0000_0000

0x14 -> DA_MSB : 0x0000_0000, 数据搬运的目的高位地址为0x0000_0000

0x18 -> CONTROL : 0x0000_0100 ,  BTT = 0x100 , 表示搬运 256byte。

xilinx AXI-CDMA 学习笔记

0x1c -> STATUS : 0X0000_0000 , 当前discriptor 的状态。bit[31]为0,表示未完成。

xilinx AXI-CDMA 学习笔记

链表2说明:

xilinx AXI-CDMA 学习笔记

链表2的地址为0x0000_0040,是axi_lite 配置的 tail discriptor pointer,表示最后一个discriptor。

0x0 -> NXTDESC_PNTR : 0x0000_0040 ,  下一个链表起始地址为0x0000_0040

0x4 -> NXTDESC_PNTR_MSB : 0x0000_0000, 地址高位为0

0x8 -> SA : 0x0000_0000, 数据源地址为0x0000_0100, 数据源地址为0x0000_0100

0xc -> SA_MSB : 0x0000_0000, 数据源高位地址为0x0000_0000

0x10 -> DA : 0x0000_0000, 数据搬运的目的地址为0x0000_0000

0x14 -> DA_MSB : 0x0000_0000, 数据搬运的目的高位地址为0x0000_0000

0x18 -> CONTROL : 0x0000_0100 ,  BTT = 0x100 , 表示搬运 256byte。

0x1c -> STATUS : 0X0000_0000 , 当前discriptor 的状态。bit[31]为0,表示未完成。

xilinx AXI-CDMA 学习笔记

最后AXI_M_SG 更新 SG_BRAM的discriptor数据

xilinx AXI-CDMA 学习笔记

写0x1c 和 0x5c 为0x8000_0000, 将 Transfer Descriptor Status Word (Status – Offset 1Ch)的bit31写1,complt = 1 ,置完成标志。

 

参考文献

pg034-axi-cdma