首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

FPGA高端项目:FPGA实现多路视频图像缩放+视频拼接+SDI视频编码输出工程解决方案,提供8套工程源码和技术支持

  • 25-03-04 15:21
  • 3332
  • 11812
blog.csdn.net

目录

  • 1、前言
    • 特别注意
    • 免责声明
  • 2、相关方案推荐
    • 本博已有的 SDI 编解码方案
    • 本方案的SDI解码+HDMI/SDI输出应用
    • 本方案的SDI图像缩放应用
    • 本方案的SDI图像缩放+视频拼接应用
    • 本方案的SDI图像缩放+UDP网络视频发送应用
    • 本方案的SDI视频编码输出应用
    • 本方案的SDI视频编码SFP光口收发应用
    • FPGA的SDI视频编解码项目培训
  • 3、详细设计方案
    • 设计原理框图
    • 视频源选择
    • 动态彩条
    • ov5640 i2c配置及采集
    • IT6802 i2c配置及采集
    • 图像缩放模块详解
    • 图像缩放模块使用
    • 多路视频拼接算法
    • 图像缓存
    • GTX 串化
    • SMPTE SD/HD/3G SDI IP核
    • VGA时序
    • RGB转BT1120
    • Gv8500 驱动器
    • SDI转HDMI盒子
    • 工程源码架构
  • 4、工程源码1详解-->OV5640图像缩放+2路视频拼接 转3G-SDI
  • 5、工程源码2详解-->OV5640图像缩放+4路视频拼接 转3G-SDI
  • 6、工程源码3详解-->OV5640图像缩放+8路视频拼接 转3G-SDI
  • 7、工程源码4详解-->OV5640图像缩放+16路视频拼接 转3G-SDI
  • 8、工程源码5详解-->HDMI图像缩放+2路视频拼接 转3G-SDI
  • 9、工程源码6详解-->HDMI图像缩放+4路视频拼接 转3G-SDI
  • 10、工程源码7详解-->HDMI图像缩放+8路视频拼接 转3G-SDI
  • 11、工程源码8详解-->HDMI图像缩放+16路视频拼接 转3G-SDI
  • 12、工程移植说明
    • vivado版本不一致处理
    • FPGA型号不一致处理
    • 其他注意事项
  • 13、上板调试验证
    • 准备工作
    • 工程1输出视频演示
    • 工程2输出视频演示
    • 工程3输出视频演示
    • 工程4输出视频演示
    • 工程5输出视频演示
    • 工程6输出视频演示
    • 工程7输出视频演示
    • 工程8输出视频演示
  • 14、福利:工程代码的获取

FPGA高端项目:FPGA实现多路视频图像缩放+视频拼接+SDI视频编码输出工程解决方案,提供8套工程源码和技术支持

1、前言

目前FPGA实现SDI视频编解码有两种方案:一是使用专用编解码芯片,比如典型的接收器GS2971,发送器GS2972,优点是简单,比如GS2971接收器直接将SDI解码为并行的YCrCb422,GS2972发送器直接将并行的YCrCb422编码为SDI视频,缺点是成本较高,可以百度一下GS2971和GS2972的价格;另一种方案是使用FPGA逻辑资源部实现SDI编解码,利用Xilinx系列FPGA的GTP/GTX资源实现解串,利用Xilinx系列FPGA的SMPTE SDI资源实现SDI编解码,优点是合理利用了FPGA资源,GTP/GTX资源不用白不用,缺点是操作难度大一些,对FPGA开发者的技术水平要求较高。有意思的是,这两种方案在本博这里都有对应的解决方案,包括硬件的FPGA开发板、工程源码等等。

本设计基于Xilinx的Kintex7-325T中端FPGA开发板实现多路视频缩放+视频拼接+SDI视频编码输出,也就是将普通视频图图像缩放和拼接的处理后转为SDI视频输出,在工业中常用来做SDI相机;输入源有多种选择,理论上任何视频都可以用本博客提供的方法转换为SDI视频,本博客提供的视频输入源由FPGA内部生成的动态彩条、OV5640摄像头、HDMI等,以适应不同的项目需求,如果你手里没有摄像头或输入设备,可以选择FPGA内部生成的动态彩条,如果你的手里有其他输入设备,则可选择对应的工程源码做移植,甚至是直接用于项目开发;FPGA采集到输入源视频后,根据需求做图像缩放或图像缓存;图像缩放使用本博常用的纯verilog代码实现的图像缩放架构实现图像任意尺寸缩放操作,将原始分辨率图像缩放为你想要的尺寸;图像缓存和视频拼接做在一起,使用本博常用的FDMA图像缓存架构实现视频拼接,将不同的视频写入不同的内存地址再统一读出来,以达到拼接效果,缓存介质为板载的DDR3;图像从DDR3读出后,经过RGB转BT1120模块实现视频格式转换,然后视频进入SMPTE SD/HD/3G SDI IP核进行SDI视频编码操作并输出SDI视频,再经过FPGA内部的GTX高速资源,实现并行数据到高速串行的转换,本博称之为串化,差分高速信号再进入板载的Gv8500芯片实现差分转单端和驱动增强的功能,SDI视频通过FPGA开发板的BNC座子输出,通过同轴线连接到SDI转SDI盒子连接到HDMI显示器即可显示;本博客提供8套工程源码,具体如下:
在这里插入图片描述
现对上述8套工程源码做如下解释,方便读者理解:
工程源码1:
输入视频为OV5640摄像头,输入分辨率为1280x720@30Hz,经过图像采集+图像缩放+2路视频拼接+RGB转BT1120+SMPTE SDI编码+GTX串化后,以3G-SDI方式输出,输入视频从1280x720缩放为960x1080,然后将缩放后的视频复制为2份以模拟2路视频,再将这2路视频进行视频拼接,最后在3G-SDI 1920x1080的输出分辨率下叠加2路拼接视频,即2分屏显示;适用于多路视频缩放+视频拼接+SDI视频编码输出的项目需求;

工程源码2:
输入视频为OV5640摄像头,输入分辨率为1280x720@30Hz,经过图像采集+图像缩放+4路视频拼接+RGB转BT1120+SMPTE SDI编码+GTX串化后,以3G-SDI方式输出,输入视频从1280x720缩放为960x540,然后将缩放后的视频复制为4份以模拟4路视频,再将这4路视频进行视频拼接,最后在3G-SDI 1920x1080的输出分辨率下叠加4路拼接视频,即4分屏显示;适用于多路视频缩放+视频拼接+SDI视频编码输出的项目需求;

工程源码3:
输入视频为OV5640摄像头,输入分辨率为1280x720@30Hz,经过图像采集+图像缩放+8路视频拼接+RGB转BT1120+SMPTE SDI编码+GTX串化后,以3G-SDI方式输出,输入视频从1280x720缩放为480x540,然后将缩放后的视频复制为8份以模拟8路视频,再将这8路视频进行视频拼接,最后在3G-SDI 1920x1080的输出分辨率下叠加8路拼接视频,即8分屏显示;适用于多路视频缩放+视频拼接+SDI视频编码输出的项目需求;

工程源码4:
输入视频为OV5640摄像头,输入分辨率为1280x720@30Hz,经过图像采集+图像缩放+16路视频拼接+RGB转BT1120+SMPTE SDI编码+GTX串化后,以3G-SDI方式输出,输入视频从1280x720缩放为240x540,然后将缩放后的视频复制为16份以模拟16路视频,再将这16路视频进行视频拼接,最后在3G-SDI 1920x1080的输出分辨率下叠加16路拼接视频,即4分屏显示;适用于多路视频缩放+视频拼接+SDI视频编码输出的项目需求;

工程源码5:
输入视频为HDMI(笔记本电脑模拟,IT6802芯片解码),输入分辨率为1920x1080@60Hz,经过图像采集+图像缩放+2路视频拼接+RGB转BT1120+SMPTE SDI编码+GTX串化后,以3G-SDI方式输出,输入视频从1920x1080缩放为960x1080,然后将缩放后的视频复制为2份以模拟2路视频,再将这2路视频进行视频拼接,最后在3G-SDI 1920x1080的输出分辨率下叠加2路拼接视频,即2分屏显示;适用于多路视频缩放+视频拼接+SDI视频编码输出的项目需求;

工程源码6:
输入视频为HDMI(笔记本电脑模拟,IT6802芯片解码),输入分辨率为1920x1080@60Hz,经过图像采集+图像缩放+4路视频拼接+RGB转BT1120+SMPTE SDI编码+GTX串化后,以3G-SDI方式输出,输入视频从1920x1080缩放为960x540,然后将缩放后的视频复制为4份以模拟4路视频,再将这4路视频进行视频拼接,最后在3G-SDI 1920x1080的输出分辨率下叠加4路拼接视频,即4分屏显示;适用于多路视频缩放+视频拼接+SDI视频编码输出的项目需求;

工程源码7:
输入视频为HDMI(笔记本电脑模拟,IT6802芯片解码),输入分辨率为1920x1080@60Hz,经过图像采集+图像缩放+8路视频拼接+RGB转BT1120+SMPTE SDI编码+GTX串化后,以3G-SDI方式输出,输入视频从1920x1080缩放为480x540,然后将缩放后的视频复制为8份以模拟8路视频,再将这8路视频进行视频拼接,最后在3G-SDI 1920x1080的输出分辨率下叠加8路拼接视频,即8分屏显示;适用于多路视频缩放+视频拼接+SDI视频编码输出的项目需求;

工程源码8:
输入视频为HDMI(笔记本电脑模拟,IT6802芯片解码),输入分辨率为1920x1080@60Hz,经过图像采集+图像缩放+16路视频拼接+RGB转BT1120+SMPTE SDI编码+GTX串化后,以3G-SDI方式输出,输入视频从1920x1080缩放为240x540,然后将缩放后的视频复制为16份以模拟16路视频,再将这16路视频进行视频拼接,最后在3G-SDI 1920x1080的输出分辨率下叠加16路拼接视频,即16分屏显示;适用于多路视频缩放+视频拼接+SDI视频编码输出的项目需求;

本文详细描述了Xilinx的Kintex7-325T中端FPGA开发板实现多路视频缩放+视频拼接+SDI视频编码输出,工程代码编译通过后上板调试验证,可直接项目移植,适用于在校学生做毕业设计、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字成像和图像传输领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;
关于MIPI协议,请自行搜索,csdn就有很多大佬讲得很详细,我就不多写这块了;

特别注意

本工程源码必须配合特定的FPGA开发板才能使用,因为工程源码对FPGA GTX电路有特殊且严格的要求,本博提供已经调试运行成功且稳定的FPGA开发板,也就是本工程源码运行的开发板,本博可提供该开发板给您,配合本工程源码直接跑起来,起飞。。。该开发板基本信息如下:
核心板配置:
FPGA型号:Xilinx–Kintex7–xc7k325tffg676-2;
内存:DDR3 16Gb,型号为K4B1G1646G-BCK0;
FLASH:QSPI FLASH,128Mb,型号为W25Q128FVSG;
底板配置:
1路10/100M/1000M以太网RJ-45接口,PHY为B50610;
2路SFP高速光纤接口,连接GTX,但路最高速率达12Gb/s;
1路HDMI输入,解码芯片为IT6802,最高支持1080p@60Hz;
1路HDMI输出,采用FPGA TMDS电平 IO输出,最高支持1080p@60Hz;
2路SDI输入接口,连接到GTX,支持SD/HD/3G/6G SDI;
2路SDI输出接口,连接到GTX,支持SD/HD/3G/6G SDI;
1路音频输出接口,采用TLV320AIC3104编码芯片;
1路SATA HOST接口;
1路USB2.0接口,采用Cypress CY7C68013A USB2.0控制器芯片;
1路串口,采用Silicon Labs CP2104GM芯片;
1路PCIe x4接口,直连GTX;
40针2.54mm间距的扩展口;
LED、按键等常规器件若干;

免责声明

本工程及其源码即有自己写的一部分,也有网络公开渠道获取的一部分(包括CSDN、Xilinx官网、Altera官网等等),若大佬们觉得有所冒犯,请私信批评教育;基于此,本工程及其源码仅限于读者或粉丝个人学习和研究,禁止用于商业用途,若由于读者或粉丝自身原因用于商业用途所导致的法律问题,与本博客及博主无关,请谨慎使用。。。

2、相关方案推荐

本博已有的 SDI 编解码方案

我的博客主页开设有SDI视频专栏,里面全是FPGA编解码SDI的工程源码及博客介绍;既有基于GS2971/GS2972的SDI编解码,也有基于GTP/GTX资源的SDI编解码;既有HD-SDI、3G-SDI,也有6G-SDI、12G-SDI等;专栏地址链接:点击直接前往

本方案的SDI解码+HDMI/SDI输出应用

SDI视频解码后,可以以HDMI方式输出,也可以以SDI方式输出或者其他,本应用就是解决这个问题,本应用高度符合项目需求,提供3套工程源码,具体如下:
在这里插入图片描述
上述所有工程源码均已上板调试通过,详细设计说明请参考我之前的博客,博客链接如下:
点击之前前往

本方案的SDI图像缩放应用

SDI视频解码后,可以进行多种图像处理,本应用就是图像缩放,有的项目需要对SDI图像进行缩放,本应用高度符合项目需求,提供3套工程源码,具体如下:
在这里插入图片描述
上述所有工程源码均已上板调试通过,详细设计说明请参考我之前的博客,博客链接如下:
点击之前前往

本方案的SDI图像缩放+视频拼接应用

SDI视频解码后,可以进行多种图像处理,本应用就是图像缩放+视频拼接,有的项目需要对SDI图像进行缩放拼接,本应用高度符合项目需求,提供8套工程源码,具体如下:
在这里插入图片描述
上述所有工程源码均已上板调试通过,详细设计说明请参考我之前的博客,博客链接如下:
点击之前前往

本方案的SDI图像缩放+UDP网络视频发送应用

SDI视频解码后,可以进行多种图像处理,本应用就是图像缩放+UDP视频发送,有的项目需要对SDI图像进行网络传输,本应用高度符合项目需求,提供1套工程源码,具体如下:
在这里插入图片描述
上述所有工程源码均已上板调试通过,详细设计说明请参考我之前的博客,博客链接如下:
点击之前前往

本方案的SDI视频编码输出应用

有些项目不需要SDI视频解码,只需要SDI编码输出,比如SDI相机,本应用就针对此类项目,将其他视频转换为SDI视频发送出去,提供10套工程源码,具体如下:
在这里插入图片描述
上述所有工程源码均已上板调试通过,上述所有工程源码均已上板调试通过,详细设计说明请参考我之前的博客,博客链接如下:
点击之前前往

本方案的SDI视频编码SFP光口收发应用

有些项目不需要SDI视频解码,只需要SDI编码输出,但对SDI视频输出方式有要求,比如要用GT高速接口的SFP光口收发,本方案就是解决此类项目,提供1套工程源码,具体如下:
在这里插入图片描述

FPGA的SDI视频编解码项目培训

基于目前市面上FPGA的SDI视频编解码项目培训较少的特点,本博专门开设了FPGA的SDI视频编解码高级项目培训班,专门培训SDI视频的编解码,具体培训计划细节如下:
1、我发你上述共计31套工程源码和对应的工程设计文档网盘链接,你保存下载,作为培训的核心资料;
2、你根据自己的实际情况安装好对应的开发环境,然后对着设计文档进行浅层次的学习;
3、遇到不懂的随时问我,包括代码、职业规划、就业咨询、人生规划、战略规划等等;
4、每周末进行一次腾讯会议,我会检查你的学习情况和面对面沟通交流;
5、你可以移植代码到你自己的FPGA开发板上跑,如果你没有板子,你根据你自己的需求修改代码后,编译工程,把bit发我,我帮你下载到我的板子上验证;或者你可以买我的开发板;

3、详细设计方案

设计原理框图

FPGA多路视频缩放+视频拼接+SDI视频编码输出的设计原理框图如下:
在这里插入图片描述

视频源选择

视频源有两种,分别对应开发者手里有没有摄像头的情况,一种是使用常规的输入设备,比如本博用到的OV5640、HDMI等;如果你的手里没有摄像头,或者你的开发板没有摄像头接口,则可使用代码内部生成的动态彩条模拟摄像头视频;视频源的选择通过代码顶层的define宏定义进行,默认使用ov5640作为视频源;视频源的选择通过代码顶层的`define宏定义进行;如下:
在这里插入图片描述
OV5640的选择逻辑代码部分如下,其他的工程与之类似
在这里插入图片描述
选择逻辑如下:
当(注释) define COLOR_TEST时,输入源视频是ov5640摄像头;
当(不注释) define COLOR_TEST时,输入源视频是动态彩条;

动态彩条

如果你的手里没有ov5640,或者你得开发板没有ov5640接口,则可使用代码内部生成的动态彩条模拟摄像头视频;视频源的选择通过代码顶层的define宏定义进行,动态彩条可配置为不同分辨率的视频,视频的边框宽度,动态移动方块的大小,移动速度等都可以参数化配置,我这里配置为辨率1280x720,动态彩条模块代码位置和顶层接口和例化如下:
在这里插入图片描述
在这里插入图片描述
动态彩条模块的例化请参考工程源码的顶层代码;

ov5640 i2c配置及采集

视频源有两种,分别对应开发者手里有没有摄像头的情况,一种是使用廉价的OV5640摄像头模组;如果你的手里没有摄像头,或者你的开发板没有摄像头接口,则可使用代码内部生成的动态彩条模拟摄像头视频;视频源的选择通过代码顶层的define宏定义进行,默认使用ov5640作为视频源;ov5640需要i2c配置才能使用,需要i2c配置分辨率,然后将DVP接口的两个时钟一个像素的GRB565视频数据采集为一个时钟一个像素的RGB565或者RGB888视频数据;ov5640i2c配置及采集代码如下:
在这里插入图片描述
ov5640配置和采集模块顶层参数如下:

module helai_ov5640_rx #(
	parameter DELAY        = 1    ,	// 有的摄像头使用转接板与FPGA开发板连接,可能需要考虑上电延时,不需要是设为0
	parameter DEVID        = 8'h78, // i2c 从机器件地址
	parameter IMAGE_WIDTH  = 1280 ,	// ov5640输出视频宽度
	parameter IMAGE_HEIGHT = 720  ,	// ov5640输出视频高度
	parameter RGB_TYPE     = 1'd0	// 设为0-->输出RGB565;设为1-->输出RGB888	
)(
	input         clk_25m     ,	// 固定输入 25M 时钟
	input         rst_n       ,	// 低电平复位
	output        cmos_scl    ,	// ov5640的scl接口
	inout         cmos_sda    ,	// ov5640的sda接口
	input         cmos_pclk_i ,	// ov5640的pclk接口
	input         cmos_href_i ,	// ov5640的href接口
	input         cmos_vsync_i,	// ov5640的vsync接口
	input  [7:0]  cmos_data_i ,	// ov5640的data接口
	output        cmos_xclk_o ,	// ov5640的xclk接口,如果你的摄像头自带晶振,则此信号不需要
    output [23:0] ov5640_rgb  ,	// 输出的RGB视频像素数据
    output        ov5640_de   ,	// 输出的RGB视频像素数据有效信号
    output        ov5640_vs   ,	// 输出的RGB视频场同步信号
    output        ov5640_hs   ,	// 输出的RGB视频行同步信号
	output        cfg_done      // ov5640配置完成拉高信号
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

ov5640配置和采集模块的例化请参考工程源码的顶层代码;

IT6802 i2c配置及采集

工程5、6使用HDMI输入视频,采用IT6802作为HDMI解码芯片,IT6802需要i2c配置才能使用,需要i2c配置分辨率,然后将输入视频数据打两拍以同步数据;IT6802 i2c配置及采集代码如下:
在这里插入图片描述
HDMI输入设备为笔记本电脑,将笔记本电脑分辨率设置为1920x1080@60Hz作为输入源,通过HDMI线连接到FPGA开发板的HDMI输入接口;

图像缩放模块详解

图像缩放模块功能框图如下,由跨时钟FIFO、插值+RAM阵列构成,跨时钟FIFO的目的是解决跨时钟域的问题,比如从低分辨率视频放大到高分辨率视频时,像素时钟必然需要变大,这是就需要异步FIFO了,插值算法和RAM阵列具体负责图像缩放算法层面的实现;
在这里插入图片描述
插值算法和RAM阵列以ram和fifo为核心进行数据缓存和插值实现,设计架构如下:
在这里插入图片描述
图像缩放模块代码架构如下:模块的例化请参考工程源码的顶层代码;
在这里插入图片描述
图像缩放模块FIFO的选择可以调用工程对应的vivado工具自带的FIFO IP核,也可以使用纯verilog实现的FIFO,可通过接口参数选择,图像缩放模块顶层接口如下:

module helai_video_scale #(
	//---------------------------Parameters----------------------------------------
	parameter FIFO_TYPE          =	"xilinx",		// "xilinx" for xilinx-fifo ; "verilog" for verilog-fifo
	parameter DATA_WIDTH         =	8       ,		//Width of input/output data
	parameter CHANNELS           =	1       ,		//Number of channels of DATA_WIDTH, for color images
	parameter INPUT_X_RES_WIDTH  =	11      		//Widths of input/output resolution control signals	
)(
	input                            i_reset_n         ,    // 输入--低电平复位信号
	input  [INPUT_X_RES_WIDTH-1:0]   i_src_video_width ,	// 输入视频--即缩放前视频的宽度
	input  [INPUT_X_RES_WIDTH-1:0]   i_src_video_height,	// 输入视频--即缩放前视频的高度
	input  [INPUT_X_RES_WIDTH-1:0]   i_des_video_width ,	// 输出视频--即缩后前视频的宽度
	input  [INPUT_X_RES_WIDTH-1:0]   i_des_video_height,	// 输出视频--即缩后前视频的高度
	input                            i_src_video_pclk  ,	// 输入视频--即缩前视频的像素时钟
	input                            i_src_video_vs    ,	// 输入视频--即缩前视频的场同步信号,必须为高电平有效
	input                            i_src_video_de    ,	// 输入视频--即缩前视频的数据有效信号,必须为高电平有效
	input  [DATA_WIDTH*CHANNELS-1:0] i_src_video_pixel ,	// 输入视频--即缩前视频的像素数据
	input                            i_des_video_pclk  ,	// 输出视频--即缩后视频的像素时钟,一般为写入DDR缓存的时钟
	output                           o_des_video_vs    ,	// 输出视频--即缩后视频的场同步信号,高电平有效
	output                           o_des_video_de    ,	// 输出视频--即缩后视频的数据有效信号,高电平有效
	output [DATA_WIDTH*CHANNELS-1:0] o_des_video_pixel 		// 输出视频--即缩后视频的像素数据
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

FIFO_TYPE选择原则如下:
1:总体原则,选择"xilinx"好处大于选择"verilog";
2:当你的FPGA逻辑资源不足时,请选"xilinx";
3:当你图像缩放的视频分辨率较大时,请选"xilinx";
4:当你的FPGA没有FIFO IP或者FIFO IP快用完了,请选"verilog";
5:当你向自学一下异步FIFO时,,请选"verilog";
6:不同FPGA型号对应的工程FIFO_TYPE参数不一样,但选择原则一样,具体参考代码;

2种插值算法的整合与选择
本设计将常用的双线性插值和邻域插值算法融合为一个代码中,通过输入参数选择某一种算法;
具体选择参数如下:

input  wire i_scaler_type //0-->bilinear;1-->neighbor
  • 1

通过输入i_scaler_type 的值即可选择;

输入0选择双线性插值算法;
输入1选择邻域插值算法;

代码里的配置如下:
在这里插入图片描述

图像缩放模块使用

图像缩放模块使用非常简单,顶层代码里设置了四个参数,举例如下:
在这里插入图片描述
上图视频通过图像缩放模块但不进行缩放操作,旨在掌握图像缩放模块的用法;如果需要将图像放大到1080P,则修改为如下:
在这里插入图片描述
当然,需要修改的不仅仅这一个地方,FDMA的配置也需要相应修改,详情请参考代码,但我想要证明的是,图像缩放模块使用非常简单,你都不需要知道它内部具体怎么实现的,上手就能用;

多路视频拼接算法

纯verilog多路视频拼接方案如下:以4路视频拼接为例;
在这里插入图片描述
输出屏幕分辨率为1920X1080;
需要拼接的4路视频分辨率为960X540;
4路输入刚好可以占满整个屏幕;
多路视频的拼接显示原理如下:
在这里插入图片描述
以把 2 个摄像头 CAM0 和 CAM1 输出到同一个显示器上为列,为了把 2 个图像显示到 1 个显示器,首先得搞清楚以下关系:
hsize:每 1 行图像实际在内存中占用的有效空间,以 32bit 表示一个像素的时候占用内存大小为 hsize X 4;
hstride:用于设置每行图像第一个像素的地址,以 32bit 表示一个像素的时候 v_cnt X hstride X 4;
vsize:有效的行;
因此很容易得出 cam0 的每行第一个像素的地址也是 v_cnt X hstride X 4;
同理如果我们需要把 cam1 在 hsize 和 vsize 空间的任何位置显示,我们只要关心 cam1 每一行图像第一个像素的地址,可以用以下公式 v_cnt X hstride X 4 + offset;
uifdma_dbuf 支持 stride 参数设置,stride 参数可以设置输入数据 X(hsize)方向每一行数据的第一个像素到下一个起始像素的间隔地址,利用 stride 参数可以非常方便地摆放输入视频到内存中的排列方式。
关于uifdma_dbuf,可以参考我之前写的文章点击查看:FDMA实现视频数据三帧缓存
根据以上铺垫,每路摄像头缓存的基地址如下:
CAM0:ADDR_BASE=0x80000000;
CAM1:ADDR_BASE=0x80000000+(1920-960)X4;
CAM2:ADDR_BASE=0x80000000+(1080-540)X1920X4;
CAM3:ADDR_BASE=0x80000000+(1080-540)X1920X4+(1920-960)X4;
地址设置完毕后基本就完事儿了;

图像缓存

使用本博常用的FDMA图像缓存架构实现图像3帧缓存,缓存介质为板载的DDR3;FDMA图像缓存架构由FDMA、FDMA控制器、缓存帧选择器构成、Xilinx MIG IP核构成;图像缓存使用Xilinx vivado的Block Design设计,他的作用是将图像送入DDR中做3帧缓存再读出显示,目的是匹配输入输出的时钟差和提高输出视频质量,关于FDMA,请参考我之前的博客,博客地址:点击直接前往
FDMA图像缓存架构如下图所示:截图为4路视频拼接,其他多路视频拼接与之类似;
在这里插入图片描述
这里多路视频拼接时,调用多路FDMA进行缓存,具体讲就是每一路视频调用1路FDMA,以4路视频拼接为例:
调用4路FDMA,其中三路配置为写模式,因为这三路视频在这里只需要写入DDR3,读出是由另一个FDMA完成,配置如下:
在这里插入图片描述
另外1路FDMA配置为读写模式,因为4路视频需要同时一并读出,配置如下:
在这里插入图片描述
视频拼接的关键点在于4路视频在DDR3中缓存地址的不同,还是以4路视频拼接为例,4路FDMA的写地址以此为:
第一路视频缓存写基地址:0x80000000;
第二路视频缓存写基地址:0x80000f00;
第三路视频缓存写基地址:0x803f4800;
第四路视频缓存写基地址:0x803f5700;
视频缓存读基地址:0x80000000;

GTX 串化

本设计使用Xilinx特有的GTX高速信号处理资源实现SDI差分视频信号的解串与串化,对于SDI视频发送而言,GTX起到串化的作用,即将输入的并行的数字信号串化为高速串行的差分信号;GTX的使用一般需要例化GTX IP核,通过vivado的UI界面进行配置,但本设计需要对SD-SDI、HD-SDI、3G-SDI视频进行自动识别和自适应处理,所以需要使得GTX具有动态改变线速率的功能,该功能可通过DRP接口配置,也可通过GTX的rate接口配置,所以不能使用vivado的UI界面进行配置,而是直接例化GTX的GTXE2_CHANNEL和GTXE2_COMMON源语直接使用GTX资源;此外,为了动态配置GTX线速率,还需要GTX控制模块,该模块参考了Xilinx的官方设计方案,具有动态监测SDI模式,动态配置DRP等功能;该方案参考了Xilinx官方的设计;GTX 解串与串化模块代码架构如下:
在这里插入图片描述

SMPTE SD/HD/3G SDI IP核

SMPTE SD/HD/3G SDI IP核是Xilinx系列FPGA特有的用于SDI视频编解码的IP,该IP配置使用非常简单,vivado的UI界面如下:
在这里插入图片描述
SMPTE SD/HD/3G SDI IP核必须与GTX配合才能使用,对于SDI视频发送而言,该IP接收来自于用户侧的的BT1120视频数据,然后将BT1120视频编码为SDI视频输出;该方案参考了Xilinx官方的设计;SMPTE SD/HD/3G SDI IP核代码架构如下:
在这里插入图片描述

VGA时序

VGA时序模块负责产生VGA时序,他有两个作用,一是控制FDMA控制器从DDR3中读出缓存的视频,二是将同步后的VGA视频送入下一级模块,在HDMI输出方式下VGA时序模块的像素时钟由用户提供;在SDI输出方式下VGA时序模块的像素时钟由SMPTE SD/HD/3G SDI IP核的发送用户时钟提供,在不同的SDI模式下像素时钟不同,比如在3G-SDI模式下像素时钟为148.5M,VGA时序模块代码架构如下:
SDI输出方式下的VGA时序模块代码架构如下:
在这里插入图片描述

RGB转BT1120

在SDI输出方式下需要使用该模块;RGB转BT1200模块的作用是将用户侧的RGB视频转换为BT1200视频输出给SMPTE SD/HD/3G SDI IP核;RGB转BT1120模块由RGB888转YUV444模块、YUV444转YUV422模块、SDI视频编码模块、数据嵌入模块组成,该方案参考了Xilinx官方的设计;BT1120转RGB模块代码架构如下:
在这里插入图片描述

Gv8500 驱动器

Gv8500芯片实现差分转单端和增强驱动的功能,这里选用Gv8500是因为借鉴了了Xilinx官方的方案,当然也可以用其他型号器件。Gv8500驱动器原理图如下:
在这里插入图片描述

SDI转HDMI盒子

在SDI输出方式下需要使用到SDI转HDMI盒子,因为我手里的显示器没有SDI接口,只有HDMI接口,为了显示SDI视频,只能这么做,当然,如果你的显示器有SDI接口,则可直接连接显示,我的SDI转HDMI盒子在某宝购买,不到100块;

工程源码架构

本博客提供8套工程源码,8套代码的vivado Block Design设计具有相似性,以工程4的4路视频拼接为例,Block Design截图如下,其他工程与之类似;
在这里插入图片描述
以工程2为例,工程源码架构如下图,工程1、3、4、5、6、7、8与之类似:
在这里插入图片描述

4、工程源码1详解–>OV5640图像缩放+2路视频拼接 转3G-SDI

开发板FPGA型号:Xilinx–Kintex7–xc7k325tffg676-2;
开发环境:Vivado2019.1;
输入:OV5640摄像头,分辨率1280x720@30Hz;
输出:3G-SDI,1080P分辨率下的960x1080的2路视频拼接2分屏显示;
视频缩放方案:1920x1080–>960x1080;
视频拼接方案:2路视频拼接;
工程作用:此工程目的是让读者掌握FPGA实现多路视频图像缩放+视频拼接转3G-SDI的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节“详细设计方案”的“工程源码架构”小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

5、工程源码2详解–>OV5640图像缩放+4路视频拼接 转3G-SDI

开发板FPGA型号:Xilinx–Kintex7–xc7k325tffg676-2;
开发环境:Vivado2019.1;
输入:OV5640摄像头,分辨率1280x720@30Hz;
输出:3G-SDI,1080P分辨率下的960x540的4路视频拼接4分屏显示;
视频缩放方案:1920x1080–>960x540;
视频拼接方案:4路视频拼接;
工程作用:此工程目的是让读者掌握FPGA实现多路视频图像缩放+视频拼接转3G-SDI的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节“详细设计方案”的“工程源码架构”小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

6、工程源码3详解–>OV5640图像缩放+8路视频拼接 转3G-SDI

开发板FPGA型号:Xilinx–Kintex7–xc7k325tffg676-2;
开发环境:Vivado2019.1;
输入:OV5640摄像头,分辨率1280x720@30Hz;
输出:3G-SDI,1080P分辨率下的480x540的8路视频拼接8分屏显示;
视频缩放方案:1920x1080–>480x540;
视频拼接方案:8路视频拼接;
工程作用:此工程目的是让读者掌握FPGA实现多路视频图像缩放+视频拼接转3G-SDI的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节“详细设计方案”的“工程源码架构”小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

7、工程源码4详解–>OV5640图像缩放+16路视频拼接 转3G-SDI

开发板FPGA型号:Xilinx–Kintex7–xc7k325tffg676-2;
开发环境:Vivado2019.1;
输入:OV5640摄像头,分辨率1280x720@30Hz;
输出:3G-SDI,1080P分辨率下的240x540的16路视频拼接16分屏显示;
视频缩放方案:1920x1080–>240x540;
视频拼接方案:16路视频拼接;
工程作用:此工程目的是让读者掌握FPGA实现多路视频图像缩放+视频拼接转3G-SDI的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节“详细设计方案”的“工程源码架构”小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

8、工程源码5详解–>HDMI图像缩放+2路视频拼接 转3G-SDI

开发板FPGA型号:Xilinx–Kintex7–xc7k325tffg676-2;
开发环境:Vivado2019.1;
输入:HDMI(笔记本电脑模拟,IT6802芯片解码),分辨率1920x1080@60Hz;
输出:3G-SDI,1080P分辨率下的960x1080的2路视频拼接2分屏显示;
视频缩放方案:1920x1080–>960x1080;
视频拼接方案:2路视频拼接;
工程作用:此工程目的是让读者掌握FPGA实现多路视频图像缩放+视频拼接转3G-SDI的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节“详细设计方案”的“工程源码架构”小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

9、工程源码6详解–>HDMI图像缩放+4路视频拼接 转3G-SDI

开发板FPGA型号:Xilinx–Kintex7–xc7k325tffg676-2;
开发环境:Vivado2019.1;
输入:HDMI(笔记本电脑模拟,IT6802芯片解码),分辨率1920x1080@60Hz;
输出:3G-SDI,1080P分辨率下的960x540的4路视频拼接4分屏显示;
视频缩放方案:1920x1080–>960x540;
视频拼接方案:4路视频拼接;
工程作用:此工程目的是让读者掌握FPGA实现多路视频图像缩放+视频拼接转3G-SDI的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节“详细设计方案”的“工程源码架构”小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

10、工程源码7详解–>HDMI图像缩放+8路视频拼接 转3G-SDI

开发板FPGA型号:Xilinx–Kintex7–xc7k325tffg676-2;
开发环境:Vivado2019.1;
输入:HDMI(笔记本电脑模拟,IT6802芯片解码),分辨率1920x1080@60Hz;
输出:3G-SDI,1080P分辨率下的480x540的8路视频拼接8分屏显示;
视频缩放方案:1920x1080–>480x540;
视频拼接方案:8路视频拼接;
工程作用:此工程目的是让读者掌握FPGA实现多路视频图像缩放+视频拼接转3G-SDI的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节“详细设计方案”的“工程源码架构”小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

11、工程源码8详解–>HDMI图像缩放+16路视频拼接 转3G-SDI

开发板FPGA型号:Xilinx–Kintex7–xc7k325tffg676-2;
开发环境:Vivado2019.1;
输入:HDMI(笔记本电脑模拟,IT6802芯片解码),分辨率1920x1080@60Hz;
输出:3G-SDI,1080P分辨率下的240x540的16路视频拼接16分屏显示;
视频缩放方案:1920x1080–>240x540;
视频拼接方案:16路视频拼接;
工程作用:此工程目的是让读者掌握FPGA实现多路视频图像缩放+视频拼接转3G-SDI的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节“详细设计方案”的“工程源码架构”小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

12、工程移植说明

vivado版本不一致处理

1:如果你的vivado版本与本工程vivado版本一致,则直接打开工程;
2:如果你的vivado版本低于本工程vivado版本,则需要打开工程后,点击文件–>另存为;但此方法并不保险,最保险的方法是将你的vivado版本升级到本工程vivado的版本或者更高版本;
在这里插入图片描述
3:如果你的vivado版本高于本工程vivado版本,解决如下:
在这里插入图片描述
打开工程后会发现IP都被锁住了,如下:
在这里插入图片描述
此时需要升级IP,操作如下:
在这里插入图片描述
在这里插入图片描述

FPGA型号不一致处理

如果你的FPGA型号与我的不一致,则需要更改FPGA型号,操作如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
更改FPGA型号后还需要升级IP,升级IP的方法前面已经讲述了;

其他注意事项

1:由于每个板子的DDR不一定完全一样,所以MIG IP需要根据你自己的原理图进行配置,甚至可以直接删掉我这里原工程的MIG并重新添加IP,重新配置;
2:根据你自己的原理图修改引脚约束,在xdc文件中修改即可;
3:纯FPGA移植到Zynq需要在工程中添加zynq软核;

13、上板调试验证

准备工作

需要准备的器材如下:
FPGA开发板;
测试摄像头,没有摄像头则选彩条;
显示器;
我的开发板了连接如下:
在这里插入图片描述

工程1输出视频演示

输入视频为OV5640摄像头,输入分辨率为1280x720@30Hz,经过图像采集+图像缩放+2路视频拼接+RGB转BT1120+SMPTE SDI编码+GTX串化后,以3G-SDI方式输出,输入视频从1280x720缩放为960x1080,然后将缩放后的视频复制为2份以模拟2路视频,再将这2路视频进行视频拼接,最后在3G-SDI 1920x1080的输出分辨率下叠加2路拼接视频,即2分屏显示;输出视频演示如下:

SDI-TX-OV5640_X2_2024

工程2输出视频演示

输入视频为OV5640摄像头,输入分辨率为1280x720@30Hz,经过图像采集+图像缩放+4路视频拼接+RGB转BT1120+SMPTE SDI编码+GTX串化后,以3G-SDI方式输出,输入视频从1280x720缩放为960x540,然后将缩放后的视频复制为4份以模拟4路视频,再将这4路视频进行视频拼接,最后在3G-SDI 1920x1080的输出分辨率下叠加4路拼接视频,即4分屏显示;输出视频演示如下:

SDI-TX-OV5640_X4_2024

工程3输出视频演示

输入视频为OV5640摄像头,输入分辨率为1280x720@30Hz,经过图像采集+图像缩放+8路视频拼接+RGB转BT1120+SMPTE SDI编码+GTX串化后,以3G-SDI方式输出,输入视频从1280x720缩放为480x540,然后将缩放后的视频复制为8份以模拟8路视频,再将这8路视频进行视频拼接,最后在3G-SDI 1920x1080的输出分辨率下叠加8路拼接视频,即8分屏显示;输出视频演示如下:

SDI-TX-OV5640_X8_2024

工程4输出视频演示

输入视频为OV5640摄像头,输入分辨率为1280x720@30Hz,经过图像采集+图像缩放+16路视频拼接+RGB转BT1120+SMPTE SDI编码+GTX串化后,以3G-SDI方式输出,输入视频从1280x720缩放为240x540,然后将缩放后的视频复制为16份以模拟16路视频,再将这16路视频进行视频拼接,最后在3G-SDI 1920x1080的输出分辨率下叠加16路拼接视频,即16分屏显示;输出视频演示如下:

SDI-TX-OV5640_X16_2024

工程5输出视频演示

输入视频为HDMI(笔记本电脑模拟,IT6802芯片解码),输入分辨率为1920x1080@60Hz,经过图像采集+图像缩放+2路视频拼接+RGB转BT1120+SMPTE SDI编码+GTX串化后,以3G-SDI方式输出,输入视频从1920x1080缩放为960x1080,然后将缩放后的视频复制为2份以模拟2路视频,再将这2路视频进行视频拼接,最后在3G-SDI 1920x1080的输出分辨率下叠加2路拼接视频,即2分屏显示;输出视频演示如下:

SDI-TX-HDMI_X2_2024

工程6输出视频演示

输入视频为HDMI(笔记本电脑模拟,IT6802芯片解码),输入分辨率为1920x1080@60Hz,经过图像采集+图像缩放+4路视频拼接+RGB转BT1120+SMPTE SDI编码+GTX串化后,以3G-SDI方式输出,输入视频从1920x1080缩放为960x540,然后将缩放后的视频复制为4份以模拟4路视频,再将这4路视频进行视频拼接,最后在3G-SDI 1920x1080的输出分辨率下叠加4路拼接视频,即4分屏显示;输出视频演示如下:

SDI-TX-HDMI_X4_2024

工程7输出视频演示

输入视频为HDMI(笔记本电脑模拟,IT6802芯片解码),输入分辨率为1920x1080@60Hz,经过图像采集+图像缩放+8路视频拼接+RGB转BT1120+SMPTE SDI编码+GTX串化后,以3G-SDI方式输出,输入视频从1920x1080缩放为480x540,然后将缩放后的视频复制为8份以模拟8路视频,再将这8路视频进行视频拼接,最后在3G-SDI 1920x1080的输出分辨率下叠加8路拼接视频,即8分屏显示;输出视频演示如下:

SDI-TX-HDMI_X8_2024

工程8输出视频演示

输入视频为HDMI(笔记本电脑模拟,IT6802芯片解码),输入分辨率为1920x1080@60Hz,经过图像采集+图像缩放+16路视频拼接+RGB转BT1120+SMPTE SDI编码+GTX串化后,以3G-SDI方式输出,输入视频从1920x1080缩放为240x540,然后将缩放后的视频复制为16份以模拟16路视频,再将这16路视频进行视频拼接,最后在3G-SDI 1920x1080的输出分辨率下叠加16路拼接视频,即16分屏显示;输出视频演示如下:

SDI-TX-HDMI_X16_2024

14、福利:工程代码的获取

福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
网盘资料如下:
在这里插入图片描述

源码技术支持加我微信哦
微信名片
注:本文转载自blog.csdn.net的9527华安的文章"https://blog.csdn.net/qq_41667729/article/details/136209666"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top