本文对VDMA模块功能、性能、寄存器和软件编程方法进行简要介绍。
设计概要
实现AXI Stream格式与Memory Map格式数据的互相转换。
**In the Write path **
在AXI4-Stream Slave 接口接收数据,将数据通过AXI4 Master interface 接口写入system memory。
**In the Read path **
使用AXI4 Master interface 从system memory 读取数据,将数据从AXI4-Stream Master 接口输出。
**Genlock Synchronization **
Genlock synchronization支持在frame buffer 中同步读写帧数据。避免master和slave同时使用同一个buffer。
Clocking
memory map侧时钟频率要大于或等于streaming 侧。
**Resets **
AXI VDMA使用低电平复位,复位信号要与 s_axi_lite_aclk同步。每次复位信号出发时间要不小于16个s_axi_lite_aclk时钟周期。
通过MM2S VDMA Control Register Reset bit置1或S2MM VDMA Control Register Reset bit置1可以单独复位读写通道。
stride
Indicates the number of address bytes between the first pixels of each video line.
Note: A stride value less than MM2S_HSIZE causes data to be corrupted.
circle模式与park模式
circle模式,VDMA自动完成帧循环切换
park模式,VDMA不主动控制帧缓存地址,通过PS程序控制,需要使用中断函数
寄存器
寄存器又分为Write path 和Read path两部分,下面主要介绍Write path 相关寄存器,Read path类似。
**S2MM_VDMACR **
bit2->Reset 将bit2置1,复位S2MM通道,复位完成后,bit2由1变0。
bit0->RS bit0控制VDMA运行或停止,VDMA正常运行时,该位必须置1。
bit1->Circular_Park 选择Park Mode或Circular Mode。
bit3->GenlockEn 选择是否使能Genlock 或Dynamic Genlock Synchronization
bit4->FrameCntEn 将该位置1,S2MM通道允许缓存IRQFrameCount帧数据
bit23-16->IRQFrameCount 当FrameCntEn 置1,S2MM通道允许缓存IRQFrameCount帧数据。
bit12->FrmCnt_IrqEn 当该位置1,每缓存一帧数据,IRQFrameCount减1,当IRQFrameCount为0时,发出中断。
**S2MM_REG_INDEX **
当Frame Buffers 小于16时,不使用该寄存器
**S2MM Vertical Size **
该寄存器有两个作用,一、是设置图像垂直方向像元数,二、当设置该寄存器后启动S2MM发送。
**S2MM Horizontal Size **
设置图像水平方向像元数。
**S2MM Frame Delay and Stride **
设置stride。
**S2MM Start Addresses **
设置缓存帧存储地址,最大可设置32帧缓存,当缓存大于16帧时,与S2MM_REG_INDEX寄存器配合使用。
性能
**Maximum Frequencies **
Zynq®-7000 All Programmable SoCs and UltraScale™ devices are expected to be similar to 7 series devices
软件编程
S2MM编程
- 将VDMACR.RS置1启动VDMA运行。(Offse 0x30 for S2MM )
- 将帧缓存地址写入START_ADDRESS寄存器 ,根据设定写入1 to N 地址。 (Offset 0xAC up to 0xE8 for S2MM)
- 将帧延迟 (valid only for Genlock Slave)和Stride写入FRMDLY_STRIDE寄存器(Offset 0xA8 for S2MM).
- 写 Horizontal Size 到l HSIZE寄存器 (Offset 0xA4 for S2MM)。
- 写 Vertical Size到VSIZE寄存器(Offset 0xA0 for S2MM),启动数据传输。
寄存器控制
写VDMACR为例,写入0x3008
XPAR_AXI_VDMA_0_BASEADDR与vivado设置的地址一致
#define VDMA_WRITE_BASEADDR XPAR_AXI_VDMA_0_BASEADDR
#define VDMACR (VDMA_WRITE_BASEADDR + 0x30)
volatile u32 *VdmaS2MMCrReg = (u32 *)(VDMA_WRITE_BASEADDR + 0x30);
方法1:
Xil_Out32((VDMACR), VDMA_SET);
方法2:
*VdmaMM2SCrReg = 0x3008;