VDMA设计

作者: 硬码农二毛哥,文章来源: 硬码农二毛哥

本文对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;

    最新文章

    最新文章