作者: 硬码农二毛哥,文章来源: 硬码农二毛哥
本文对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为例,写入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;