之前文章介绍了基于zynq的图像处理架构问题。其中,作为开发者,需要重点关注图像传感器接口、处理算法、显示接口,这些模块。现在我们一同学习用于视频数据接口的DVP模块,并将其封装成AXI-stream接口便于直接和VDMA IP通信。
DVP_AXI stream IP v1.0使用说明
1.设计概述
•用于cmos传感器视频数据采集,将cmos输出的8位视频数据拼接成RGB 565模式
•AXI_stream主机接口,用于和PS端内存的数据交互
•基于vivado 18.3软件设计
2.模块分析
此设计包括DVP模块及AXI_stream 协议部分。DVP模块负责将采集的8位视频数据及行、场同步信号按照相应时序转换成16位RGB模式输出,DVP模块独立封装,在顶层模块中调用。AXI_stream 部分用于产生相应的AXI_stream接口信号,设计采用AXI_stream主机模式。模块框架图如下图所示。
图1.DVP_AXI stream IP 核模块框架图
DVP模块:
DVP模块是实现视频数据采集的主要部分。
等到初始化摄像完成且行场同步信号出现,释放清零信号,开始写入数据;利用采样计数器对采样数据计数,计数值在行同步信号有效时加1,否则清零;见以下代码。
//在HREF为高电平时,计数输出数据个数
//565模式下的计数器
always@(posedge PCLK or posedge Rst_p)
if(Rst_p)
Hcount_1 <= 0;
else if(r_Href)
Hcount_1 <= Hcount_1 + 1'd1;
else
Hcount_1 <= 0;
cmos输出采样的数据是8位的,需要将其转换成16位的RGB565数据模式输出。根据采样计数器的计数值奇偶情况输出数据,在计数值为偶数时,将采样的8位数据存到待输出像素数据的高字节,在计数值为奇数时,将数据存到输出像素数据的低字节。见以下代码。
begin
if(!Hcount_1[0])
r_DataPixel[15:8] <= r_Data;
else
r_DataPixel[7:0] <= r_Data;
end
在此数据拼接过程中,相当于每两个时钟像素完成了一次数据输出,需要指定输出数据有效的标志,以避免错误的数据输出。在将两个单字节采样数据拼接成一个两个字节数据的过程中,第一个时刻的采样数据给到输出数据的高字节,第二个时刻的采样数据给到输出数据的低字节,并且采样计数器从0开始计数,因此指定当采样计数器为奇数时数据有效。见以下代码。
begin
if(Hcount_1[0] && r_Href)
r_DataValid <= 1;
else
r_DataValid <= 0;
end
为保证传图的稳定性,传感器开始工作时舍弃前10帧,见以下代码。
/*帧计数器,对每次系统开始运行后的前10帧图像进行计数*/
always@(posedge PCLK or posedge Rst_p)
if(Rst_p)
FrameCnt <= 0;
else if({ r_Vsync,Vsync}== 2'b01)