软件版本:VIVADO2017.4
操作系统:WIN10 64bit
硬件平台:适用米联客 ZYNQ系列开发板
米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!!
25.1 概述
本课使用MT9V034搭建两路基于VDMA的摄像头图形采集系统,并对OSD实现字幕叠加功能说明。提供的代码也包含MT9V034、OV5640摄像头双目例程,实现过程大同小异,这里不做过多讲解。
25.2 双目图像采集传输系统架构图

25.3 FPGA BD工程
25.3.1 摄像头电路设计
本课使用两个MT9V034摄像头(配套的代码也给出了2路OV5640摄像头OSD方案),每路摄像头输出分辨率640*480。摄像头部分电路设计如下所示:
25.3.2 Vid_in IP电路搭建
MT9V034的vid_ce信号始终接电平。这里给出MT9V034部分电路设计:
25.3.3 VDMA设置


25.3.4 OSD设置
本章要使用OSD完成字幕的叠加功能,所以要开启AXI-lite控制接口。OSD配置如下所示:


LAYER2和LAYER3层设置

上面第一副图中,我们勾选了控制接口,开启了4个Layer,最大输出设置为了1280。至于为什么使用4个layer,这是因为要完成2路视频拼接和2路字幕叠加。另外最后2个layer就是字幕叠加层,所以将其设置为了Internal Graphics Controllers。第二副图是对各个层进行显示的设置,大家也可以修改这一部分的设置来完成各个图层的显示位置,功能也不仅仅局限于拼接视频,也可以完成画中画的功能,OSD是个功能很强大的IP!设置完这两部分之后,在LAYER2、3设置ASCII Offset为0,否则后面设置字符串会发生错位,其余的配置按默认即可。
25.3.5 PLL时钟设置
PLL时钟的设置取决于分辨率大小的设置,本节采用的是720P输出,因此PLL时钟设置如下:

25.3.6 VTC设置

25.3.7 AXI IIC设置
本节课要使用2路摄像头进行采集,需要两路IIC配置对摄像头寄存器进行配置。

此部分的设置如下图所示:

其余选项的设置参考之前历程的设置即可。
25.4 软件部分设计
软件部分主要可以分为三块,IIC协议实现、OSD驱动与VDMA配置。下面分别对这三个部分进行介绍。
25.4.1 IIC实现
本课节当中要对两个摄像头进行寄存器配置,如下图所示:

在main.c中可以看到摄像头IIC初始化配置函数。
在I2C_8bit.c文件中,找到I2C_config_init()配置函数。

其中,在I2C_8bit.c中可以查找到mt9v034_config_table[]与I2C_write相关定义。
相关定义mt9v034_config_table[]

其中write_i2c是ov5640的iic配置程序,write_i2c_mt是MT9V034的iic配置程序,程序的主要设计思想就是使用一个数字来存放要配置的寄存器地址和数据。
25.4.2 OSD驱动设计
OSD驱动部分主要由osd.c与osd.h组成。程序由官方驱动重新封装,此处重点介绍osd.c。OSD驱动如下表所示:
|
#include "xbasic_types.h" #include "xparameters.h" #include "xstatus.h" #include "osd.h" #include "xosd.h" #include "stdio.h"
/* * Device related constants. Defined in xparameters.h */ #define OSD_DEVICE_ID XPAR_OSD_0_DEVICE_ID
/* * OSD Device related data structures */ XOSD Osd; /* OSD Device driver instance */ XOSD_Config *OsdCfgPtr; /* OSD device configuration pointer */
/* * Color table definition */ u32 ColorData[16] = { 0x00000000, 0xa0a25f58, 0xa08080ff, 0xa0808010, 0xa0ef5a51, 0x00000000, 0xa0465289, 0x00000000, 0xa065ba6b, 0x00000000, 0xa09017c5, 0xa0a9c860, 0xa0bc3198, 0xa010a5a9, 0xa0808080, 0xa0ada1ab };
/* * Text table definition */ char __attribute__ ((aligned (4))) TextData[8][32] = { "OV5640", //"String #1", "OV7725", //"String #2", "MT9V034 CAMER TEST", "www.osrc.cn" "Xilinx", "String #5", "String #6", "String #7" // "String #8" };
/* * Font definition */ unsigned char __attribute__ ((aligned (4))) Font[128][8] = { {0x00, 0x36, 0x7F, 0x7F, 0x3E, 0x1C, 0x08, 0x00}, // NULL {0x18, 0x18, 0x18, 0x1F, 0x1F, 0x18, 0x18, 0x18}, {0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03}, {0x18, 0x18, 0x18, 0xF8, 0xF8, 0x00, 0x00, 0x00}, {0x18, 0x18, 0x18, 0xF8, 0xF8, 0x18, 0x18, 0x18}, {0x00, 0x00, 0x00, 0xF8, 0xF8, 0x18, 0x18, 0x18}, {0x03, 0x07, 0x0E, 0x1C, 0x38, 0x70, 0xE0, 0xC0}, {0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03}, {0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF}, {0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x0F, 0x0F}, {0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF}, {0x0F, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00}, {0xF0, 0xF0, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00}, {0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF}, {0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0}, {0x00, 0x1C, 0x1C, 0x77, 0x77, 0x08, 0x1C, 0x00}, {0x00, 0x00, 0x00, 0x1F, 0x1F, 0x18, 0x18, 0x18}, {0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00}, {0x18, 0x18, 0x18, 0xFF, 0xFF, 0x18, 0x18, 0x18}, {0x00, 0x00, 0x3C, 0x7E, 0x7E, 0x7E, 0x3C, 0x00}, {0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF}, {0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0}, {0x00, 0x00, 0x00, 0xFF, 0xFF, 0x18, 0x18, 0x18}, {0x18, 0x18, 0x18, 0xFF, 0xFF, 0x00, 0x00, 0x00}, {0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0}, {0x18, 0x18, 0x18, 0x1F, 0x1F, 0x00, 0x00, 0x00}, {0x78, 0x60, 0x78, 0x60, 0x7E, 0x18, 0x1E, 0x00}, {0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x00}, {0x00, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00}, {0x00, 0x18, 0x30, 0x7E, 0x30, 0x18, 0x00, 0x00}, {0x00, 0x18, 0x0C, 0x7E, 0x0C, 0x18, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // Space {0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x00}, {0x00, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x66, 0xFF, 0x66, 0x66, 0xFF, 0x66, 0x00}, {0x18, 0x3E, 0x60, 0x3C, 0x06, 0x7C, 0x18, 0x00}, {0x00, 0x66, 0x6C, 0x18, 0x30, 0x66, 0x46, 0x00}, {0x1C, 0x36, 0x1C, 0x38, 0x6F, 0x66, 0x3B, 0x00}, {0x00, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x0E, 0x1C, 0x18, 0x18, 0x1C, 0x0E, 0x00}, {0x00, 0x70, 0x38, 0x18, 0x18, 0x38, 0x70, 0x00}, {0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00}, {0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30}, {0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00}, {0x00, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0x00},// / {0x00, 0x3C, 0x66, 0x6E, 0x76, 0x66, 0x3C, 0x00},// 0 {0x00, 0x18, 0x38, 0x18, 0x18, 0x18, 0x7E, 0x00},//1 {0x00, 0x3C, 0x66, 0x0C, 0x18, 0x30, 0x7E, 0x00},//2 {0x00, 0x7E, 0x0C, 0x18, 0x0C, 0x66, 0x3C, 0x00}, |

本文介绍了如何在米联客ZYNQ开发板上,利用OSD功能实现双目摄像头图像采集系统,并通过VDMA设置和OSD驱动设计,完成字幕叠加功能。详细讲解了FPGA BD工程的配置,包括摄像头电路、VTC、VDMA、OSD等模块,并提供了软件部分的IIC协议、OSD驱动和VDMA配置设计。


被折叠的 条评论
为什么被折叠?



