VDMA从配置到编程

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

VDMA IP配置

这是基本配置,但也是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状态寄存器错误,数据没有更新等问题。

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();必须加。

经验证,OK。

原文链接: http://blog.csdn.net/wangbaodong070411209/article/details/71411391