VDMA从配置到编程

 VDMA从配置到编程

使用Zynq进行视频开发的同学们,基本上会用到VDMA,尤其,HLS自动化IP生成也成为开发的一种方法,最近,通过HLS生成IP,通常AXI-Stream接口,那么就需要VDMA接口进行数据搬移。而这过程中VDMA配置问题将决定调试的效率,下面把分享一下我配置VDMA的经验。

VDMA IP配置

 VDMA从配置到编程

这是基本配置,但也是SDK配置的依据。
Address Width:数据线位宽,一般就配置成32位了,除非数据宽度大于32.

Frame Buffers:帧缓冲数

用来缓冲输入图像的帧缓存数量,最大可以选择32帧,在这里选择3就可以了。

据我所了解这个值一般最小设置为3,因为VDMA有一个读通道,一个写通道,在实际使用时一般都是写完了一帧数据,然后再去读这一帧的数据(VDMA内有一种机制,保证读出的帧总是上一次写完的帧)。这样能够防止读取到的图像被撕裂或者别的情况发生。

正常情况下的读写速率一般相同或有可能是写入速度略高于读取速率,在图像写入和读出稳定后,为了保证写入的帧不重叠到读取帧上,Frame Buffers设置为3即可解决。

读写通道:

Memory Map Data Width: 根据图像的像素数据位宽设置即可,我这里用的RGB三色 共24位数据,选32就可以了

Write/Read Burst Size: 存储空间AXI读写的突发读写数量大小,这里选128。

Stream Data Width:数据流AXIS位宽,RGB 24位。

Line Buffer Depth:数据流AXIS的缓存深度,用来缓存图像数据每一行数据的buffer深度。这里设置的1024,总之在读写速率相同的情况下这个值可以设置的稍微小一些,但最小也要超过行长度的1/4为好。

 VDMA从配置到编程

这里面的每一项对数据流都有影响,通常会出现VDMA状态寄存器错误,数据没有更新等问题。

Fsyn Options(Write): 选择了s2mm_tuser,这样每一帧写图像的同步操作是根据前一级IP的AXIS输出总线内的tuser来触发的。这是很好的方法,帧同步起来方便快捷,不会出太大问题。

总之,我暂时还是用了第一种默认配置,第二种配置尝试过,但同步起来稍微要考虑的多了一些。也正是因为如此,Frame Buffers我选择了3,防止读写不同步时可能带来的问题。

Fsync Options(Read): 选择了None,Free Running,我的理解就是不需要单独外部同步触发信号,VDMA是通过M_AXIS_MM2S中tuser和反馈回来的tready信号握手成功后来开始触发一帧的读写的。

GenLock Mode: 写通道设置为Dynamic-Master,读通道设置为Dynamic-Slave

为了保证视频图像的读写实时性,需要内部有着一定的机制,这个机制就是通过GenLock模块来完成的。

Dynamic的前缀意思是读写GenLock会互相锁定,而另外两种没有前缀的Master和Slave则需要一些额外的软件开销,或者不太符合我的功能要求,我就没有仔细研究了。

Allow unaligned Transfers:默认不选择,这种高级功能就先不研究了,不选.

最后,导入到SDK,SDK配置VDMA基本上都差不多,这里也上传上我配置的:

// Left VDMA 0x0010c080, 0x002ce080, 0x00490080
Xil_Out32(CMOS_ADDR_0 + 0x30, 0x0001810B); // enable run, circular_park
Xil_Out32(CMOS_ADDR_0 + 0xAC, 0x0010c080); // Start address of the 1st frame(3 frames in all)
Xil_Out32(CMOS_ADDR_0 + 0xB0, 0x002ce080); // Start address of the 2nd frame(3 frames in all)
Xil_Out32(CMOS_ADDR_0 + 0xB4, 0x00490080); // Start address of the 3rd frame(3 frames in all)
Xil_Out32(CMOS_ADDR_0 + 0xA8, 0x0F00); // Stride number
Xil_Out32(CMOS_ADDR_0 + 0xA4, 0x0A00); // number of bytes per line(640 x 3)
Xil_Out32(CMOS_ADDR_0 + 0xA0, 0x01E0); // number of lines per frame(480)

还有一点需要注意,就是 cleanup_platform();必须加。

 VDMA从配置到编程

用户喜欢...

Arduino 环境中的 FPGA:使用 Alorium 的 Snō 模块支持预配置和定制 IP

当固件在微控制器或微处理器上的运行速度过慢时,现场可编程门阵列 (FPGA) 可解决实时嵌入式设计的硬件问题。同时,FPGA 还具有外设灵活性。然而,要使用 FPGA,设计工程师就需要学习全新的...


深入研究音频插孔开关和配置

音频插孔是一种行业标准的连接器,除了提供基本的音频连接外,还有许多潜在的用途。了解各种可用配置,包括导体数量和开关选项,使设计人员能够充分利用这种熟悉,紧凑和可靠的互连...


FPGA配置采用高速NOR闪存

NOR闪存被广泛部署为FPGA的配置器件。工业,通信和汽车ADAS应用中的FPGA使用取决于NOR Flash的低延迟和高数据吞吐量特性。快速启动时间要求的一个很好的例子是汽车环境中的摄像机系统。点火后...


通信IP:固定功能 vs 软件可编程?

作者:Richard Edgar,Imagination科技,通信技术营销总监 当我们决定使用第三方IP实现系统的无线通信功能时我们需要作出一个选择,是采用固定功能的IP还是软件可编程的IP。可以说这两种方式...


Zynq VDMA 自测

首先,建立Zedboard的工程,创建如下Block Design: VDMA设置一下读写通道,AXI-lite和MM2S 的时钟都采用同一个。 Processing 配置按图中所示,包含HP口。 添加ILA进行数据流入和数据流出测试。 运行工...


为IIoT提供高效安全的配置

在2016年的秋天,黑客招募了数十万个嵌入式设备,形成恶意僵尸网络。他们的Mirai恶意软件感染了宽带路由器,让僵尸网络的运营商利用它们进行分布式拒绝服务(DDoS)攻击。对于新兴的物联...


可编程SoC帮助制造商在可配置性和性能之间找到合适的平衡点

虽然半导体技术是所有电子产品的基础,但它是真正使我们的现代世界成为可能的软件。与硬件相比,软件提供了几乎无限的灵活性,在高性能微处理器上运行时,可以产生惊人的结果。例如,...


详解STM32的PWM输出及频率和脉宽(占空比)的计算——寄存器配置六步曲!

一、stm32的pwm输出引脚是使用的IO口的复用功能。 二、T2~T5这4个通用定时器均可输出4路PWM——CH1~CH4。 三、我们以tim3的CH1路pwm输出为例来进行图文讲解(其它类似),并在最后给出tim3的ch1和ch...


wmware vivado环境配置

上一节介绍了环境的安装,这里介绍几个细节,让vivado真正工作起来! 已知的问题,以前和windows下面一样,直接导入lic就可以用,但现在这样不行,查找了下,主要是环境变量的问题所致,...


C51编程经验汇总分享

在单片机的开发应用中,已逐渐开始引入高级语言,C语言就是其中的一种。用惯了汇编的人,总觉得高级语言“可控性”不好,不如汇编那样随心所欲。以下是笔者在C51编程中的几点经验,...


FPGA(现场可编程门阵列)市场报告

据麦姆斯咨询报道,2017年全球FPGA(现场可编程门阵列)市场规模预计为58.3亿美元,到2023年预计可增长至95亿美元,2017~2023年期间的复合年增长率(CAGR)可达8.5%。物联网及FPGA产品上市时间的...


单线SPI的在线编程方案

“串口下载”是大多数工程师最早接触的程序下载方式,尤其是一开始使用51单片机的工程师们。随着硬件集成度越来越高,芯片资源不断被压缩,工程师也想到了另一种“串口下载”方式,...


I2C配置顺序引发的异常案例

在参考Cube软件包中I2C例程后, 根据应用需要新增了一路I2C接口,结果新增I2C无法收发数据。本文主要对问题进行描述,分析产生原因,提供解决方法。 一、问题描述 如前言所述,现象表现...


EEVBlog拆解:Rigol DL3021可编程直流电子负载

想必大家对EEVBlog已经不陌生了,有着丰富电子开发经验的工程师Dave Jones在该网站上发布各种电子设备的拆解视频,并对设计的一些优点和缺点给出专业的解说,近日在上传的视频中对一款电...


petalinux(一)自动登录及启动配置

最近开始使用zynq7020开发产品,使用的了petalinux创建系统的确很方便,但创建的系统每次都要人工登录,查看相关文档实现自动登录步骤如下: 1、创建自动登录的APP ,调用命令如下: #peta...


可编程中断控制器8259A详解

中断系统的使用极大的提高了CPU的利用率。 中断是一种机制,这种机制实现的过程可分为请求--响应--服务--返回。 可编程中断控制器8259A是Intel公司专为80x86 CPU控制外部中断而设计开发的芯片...