此文是笔者记录的 AXI Central Direct Memory Access (CDMA)相关学习笔记及参考例程仿真说明。
仿真环境
win10 64bit
vivado 2017.4
modelsim
功能介绍
IP架构
模块分解介绍
Register Module
包含AXI-CDMA的控制及状态寄存器, 接口 AXI-lite ,寄存器列表如下:
Scatter/Gather Block
SG引擎模块,通过 AXI4-SG master接口,获取和更新系统内存中的CDMA 控制传输描述符链表。SG 引擎提供内部描述符队列,使得描述符的预取和处理能和CDMA数据传输同时进行。描述符链表定义如下:
DMA Controller
协调DM模块的命令加载,状态检索,并将状态更新会 register module
DataMover :用作高吞吐量数据传输。提供4Kbyte地址保护的CDMA操作,突发自动拆分,多次传输请求自动排队。提供任意地址读写数据的 byte-level 重对齐功能(最多512bit ???????)
IP接口
仿真说明
直接生成example例程,然后关联modelsim仿真,以下以SG模式举例说明,
仿真模型如下(自己画的,将就看下)
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信号。
AXI_ATG_LOGIC对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
对照datasheet, 写寄存器0x8 -> 0x000, 配置当前描述符指针指向地址0
对照datasheet, 写寄存器0x10 -> 0x0000_0040,配置尾描述符指针指向地址0x0000_0040
AXI_ATG_LOGIC 写完 0X10寄存器后,触发SG ENGINE工作,从SG_BRAM读取 discriptor list, discriptor的定义如下:
获取了两个链表,链表1如下:
链表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。
0x1c -> STATUS : 0X0000_0000 , 当前discriptor 的状态。bit[31]为0,表示未完成。
链表2说明:
链表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,表示未完成。
最后AXI_M_SG 更新 SG_BRAM的discriptor数据
写0x1c 和 0x5c 为0x8000_0000, 将 Transfer Descriptor Status Word (Status – Offset 1Ch)的bit31写1,complt = 1 ,置完成标志。
参考文献
pg034-axi-cdma