首页 最新 热门 推荐

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

FPGA高端项目:FPGA基于GS2971的SDI视频接收+纯verilog图像缩放+多路视频拼接,提供8套工程源码和技术支持

  • 25-03-04 14:21
  • 4304
  • 5986
blog.csdn.net

目录

  • 1、前言
    • 免责声明
  • 2、相关方案推荐
    • 本博已有的 SDI 编解码方案
    • 本方案的SDI接收转HDMI输出应用
    • 本方案的SDI接收+图像缩放应用
    • 本方案的SDI接收+HLS图像缩放+HLS多路视频拼接应用
    • 本方案的SDI接收+OSD多路视频融合叠加应用
    • 本方案的SDI接收+HLS多路视频融合叠加应用
    • 本方案的SDI接收+GTX 8b/10b编解码SFP光口传输
    • FPGA的SDI视频编解码项目培训
  • 3、详细设计方案
    • 设计原理框图
    • SDI 相机
    • GS2971
    • BT1120转RGB
    • 纯verilog图像缩放模块详解
    • 纯verilog图像缩放模块使用
    • 多路视频拼接算法
    • 图像缓存
    • HDMI输出
    • 工程源码架构
  • 4、工程源码7详解-->SDI接收+图像缩放+2路视频拼接 FDMA缓存PL端DDR3
  • 5、工程源码8详解-->SDI接收+图像缩放+4路视频拼接 FDMA缓存PL端DDR3
  • 6、工程源码9详解-->SDI接收+图像缩放+8路视频拼接 FDMA缓存PL端DDR3
  • 7、工程源码10详解-->SDI接收+图像缩放+16路视频拼接 FDMA缓存PL端DDR3
  • 8、工程源码11详解-->SDI接收+图像缩放+2路视频拼接 FDMA缓存PS端DDR3
  • 9、工程源码12详解-->SDI接收+图像缩放+4路视频拼接 FDMA缓存PS端DDR3
  • 10、工程源码13详解-->SDI接收+图像缩放+8路视频拼接 FDMA缓存PS端DDR3
  • 11、工程源码14详解-->SDI接收+图像缩放+16路视频拼接 FDMA缓存PS端DDR3
  • 12、工程移植说明
    • vivado版本不一致处理
    • FPGA型号不一致处理
    • 其他注意事项
  • 13、上板调试验证
    • 准备工作
    • 工程7、11的2路视频缩放拼接-->输出视频演示
    • 工程8、12的4路视频缩放拼接-->输出视频演示
    • 工程9、13的8路视频缩放拼接-->输出视频演示
    • 工程10、14的16路视频缩放拼接-->输出视频演示
  • 14、福利:工程代码的获取

FPGA高端项目:FPGA基于GS2971的SDI视频接收+纯verilog图像缩放+多路视频拼接,提供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的Zynq7100-xc7z100ffg900-2中端FPGA开发板使用GS2971实现SDI视频接收+纯verilog图像缩放+多路视频拼接+转HDMI输出,输入源为一个HD-SDI相机,也可以使用SD-SDI或者3G-SDI相机,因为本设计是三种SDI视频自适应的;同轴的SDI视频通过同轴线连接到GS2971转接板,GS2971解码芯片将同轴的串行的SDI视频解码为并行的BT1120格式视频,至此,SDI视频解码操作已经完成,可以进行常规的图像处理操作了;本设计的目的是做纯verilog图像缩放+纯verilog多路视频拼接后输出解码的SDI视频,针对目前市面上的主流项目需求,本博设计了HDMI输出方式,需要进行BT1120视频进行转RGB+纯verilog图像缩放+纯verilog多路视频拼接+图像缓存操作;本设计使用BT1120转RGB模块实现视频格式转换;图像缩放采用纯verilog代码实现的图像缩放架构实现SDI的图像缩放操作,将原始的1920x1080分辨率的SDI视频缩小为960x540,当然,读者也可以缩放为其他分辨率;纯verilog多路视频拼接+图像缓存使用FDMA架构,该架构简单灵活,输入接口为VGA视频时序,即用VS、DE、RGB数据,将不同的视频写入不同的内存地址再统一读出来,以达到拼接效果,FDMA架构的视频既可以缓存到PL端DDR,也可以缓存到PS端DDR,针对不同的项目需求;图像从DDR3读出后,进入HDMI发送模块输出HDMI显示器;本博客提供8套工程源码,具体如下:
在这里插入图片描述
现对上述8套工程源码做如下解释,方便读者理解:
工程源码7:
输入视频为HD-SDI相机,输入分辨率为1920x1080@30Hz,经过GS2971解码+BT1120转RGB+纯verilog图像缩放+FDMA图像缓存+2路视频拼接+HDMI输出模块后,以HDMI接口方式输出,图像缩放方案采用纯verilog代码实现,从1920x1080缩放为960x1080,然后将缩放后的视频复制为2份以模拟2路视频,再将这2路视频进行视频拼接,最后在HDMII 1920x1080的输出分辨率下叠加2路拼接视频,即2分屏显示;此工程的FDMA图像缓存架构将视频缓存到PL端DDR3,适应于纯FPGA项目,比如可用于Xilinx的Artix7、Kintex7、Virtex7等FPGA;

工程源码8:
输入视频为HD-SDI相机,输入分辨率为1920x1080@30Hz,经过GS2971解码+BT1120转RGB+纯verilog图像缩放+FDMA图像缓存+4路视频拼接+HDMI输出模块后,以HDMI接口方式输出,图像缩放方案采用纯verilog代码实现,从1920x1080缩放为960x540,然后将缩放后的视频复制为4份以模拟4路视频,再将这4路视频进行视频拼接,最后在HDMII 1920x1080的输出分辨率下叠加4路拼接视频,即4分屏显示;此工程的FDMA图像缓存架构将视频缓存到PL端DDR3,适应于纯FPGA项目,比如可用于Xilinx的Artix7、Kintex7、Virtex7等FPGA;

工程源码9:
输入视频为HD-SDI相机,输入分辨率为1920x1080@30Hz,经过GS2971解码+BT1120转RGB+纯verilog图像缩放+FDMA图像缓存+8路视频拼接+HDMI输出模块后,以HDMI接口方式输出,图像缩放方案采用纯verilog代码实现,从1920x1080缩放为480x540,然后将缩放后的视频复制为8份以模拟8路视频,再将这8路视频进行视频拼接,最后在HDMII 1920x1080的输出分辨率下叠加8路拼接视频,即8分屏显示;此工程的FDMA图像缓存架构将视频缓存到PL端DDR3,适应于纯FPGA项目,比如可用于Xilinx的Artix7、Kintex7、Virtex7等FPGA;

工程源码10:
输入视频为HD-SDI相机,输入分辨率为1920x1080@30Hz,经过GS2971解码+BT1120转RGB+纯verilog图像缩放+FDMA图像缓存+16路视频拼接+HDMI输出模块后,以HDMI接口方式输出,图像缩放方案采用纯verilog代码实现,从1920x1080缩放为240x540,然后将缩放后的视频复制为16份以模拟16路视频,再将这16路视频进行视频拼接,最后在HDMII 1920x1080的输出分辨率下叠加16路拼接视频,即16分屏显示;此工程的FDMA图像缓存架构将视频缓存到PL端DDR3,适应于纯FPGA项目,比如可用于Xilinx的Artix7、Kintex7、Virtex7等FPGA;

工程源码11:
输入视频为HD-SDI相机,输入分辨率为1920x1080@30Hz,经过GS2971解码+BT1120转RGB+纯verilog图像缩放+FDMA图像缓存+2路视频拼接+HDMI输出模块后,以HDMI接口方式输出,图像缩放方案采用纯verilog代码实现,从1920x1080缩放为960x1080,然后将缩放后的视频复制为2份以模拟2路视频,再将这2路视频进行视频拼接,最后在HDMII 1920x1080的输出分辨率下叠加2路拼接视频,即2分屏显示;此工程的FDMA图像缓存架构将视频缓存到PS端DDR3,既可用于纯FPGA项目,比如可用于Xilinx的Artix7、Kintex7、Virtex7等FPGA,配合MicroBlaze;也可用于Zynq系列FPGA项目,比如可用于Xilinx的Zynq7000系列、Zynq7000、Zynq UltraScale等FPGA;

工程源码12:
输入视频为HD-SDI相机,输入分辨率为1920x1080@30Hz,经过GS2971解码+BT1120转RGB+纯verilog图像缩放+FDMA图像缓存+4路视频拼接+HDMI输出模块后,以HDMI接口方式输出,图像缩放方案采用纯verilog代码实现,从1920x1080缩放为960x540,然后将缩放后的视频复制为4份以模拟4路视频,再将这4路视频进行视频拼接,最后在HDMII 1920x1080的输出分辨率下叠加4路拼接视频,即4分屏显示;此工程的FDMA图像缓存架构将视频缓存到PS端DDR3,既可用于纯FPGA项目,比如可用于Xilinx的Artix7、Kintex7、Virtex7等FPGA,配合MicroBlaze;也可用于Zynq系列FPGA项目,比如可用于Xilinx的Zynq7000系列、Zynq7000、Zynq UltraScale等FPGA;

工程源码13:
输入视频为HD-SDI相机,输入分辨率为1920x1080@30Hz,经过GS2971解码+BT1120转RGB+纯verilog图像缩放+FDMA图像缓存+8路视频拼接+HDMI输出模块后,以HDMI接口方式输出,图像缩放方案采用纯verilog代码实现,从1920x1080缩放为480x540,然后将缩放后的视频复制为8份以模拟8路视频,再将这8路视频进行视频拼接,最后在HDMII 1920x1080的输出分辨率下叠加8路拼接视频,即8分屏显示;此工程的FDMA图像缓存架构将视频缓存到PS端DDR3,既可用于纯FPGA项目,比如可用于Xilinx的Artix7、Kintex7、Virtex7等FPGA,配合MicroBlaze;也可用于Zynq系列FPGA项目,比如可用于Xilinx的Zynq7000系列、Zynq7000、Zynq UltraScale等FPGA;

工程源码14:
输入视频为HD-SDI相机,输入分辨率为1920x1080@30Hz,经过GS2971解码+BT1120转RGB+纯verilog图像缩放+FDMA图像缓存+16路视频拼接+HDMI输出模块后,以HDMI接口方式输出,图像缩放方案采用纯verilog代码实现,从1920x1080缩放为240x540,然后将缩放后的视频复制为16份以模拟16路视频,再将这16路视频进行视频拼接,最后在HDMII 1920x1080的输出分辨率下叠加16路拼接视频,即16分屏显示;此工程的FDMA图像缓存架构将视频缓存到PS端DDR3,既可用于纯FPGA项目,比如可用于Xilinx的Artix7、Kintex7、Virtex7等FPGA,配合MicroBlaze;也可用于Zynq系列FPGA项目,比如可用于Xilinx的Zynq7000系列、Zynq7000、Zynq UltraScale等FPGA;

本文详细描述了Xilinx的Zynq7100-xc7z100ffg900-2 FPGA开发板使用GS2971实现SDI视频接收+纯verilog图像缩放+纯verilog多路视频拼接+转HDMI输出,工程代码编译通过后上板调试验证,可直接项目移植,适用于在校学生做毕业设计、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字成像和图像传输领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

免责声明

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

2、相关方案推荐

本博已有的 SDI 编解码方案

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

本方案的SDI接收转HDMI输出应用

本方案采用GS2971接收SDI视频,然后进行图像缓存操作(图像缓存方案包括FDMA方案和VDMA方案,缓存介质包括PL端DDR3、PS端DDR3),最后以HDMI方式输出,提供3套工程源码,3套工程源码详情请参考“1、前言”中的截图,详细设计方案请参考我专门的博客,博客链接如下:
点击直接前往

本方案的SDI接收+图像缩放应用

本方案采用GS2971接收SDI视频,然后进行图像缩放操作(图像缩放方案包括纯verilog图像缩放方案和HLS图像缩放方案),再进行图像缓存操作(图像缓存方案包括FDMA方案和VDMA方案,缓存介质包括PL端DDR3、PS端DDR3),最后以HDMI方式输出,提供3套工程源码,3套工程源码详情请参考“1、前言”中的截图,详细设计方案请参考我专门的博客,博客链接如下:
点击直接前往

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

本方案采用GS2971接收SDI视频,然后进行图像缩放操作(图像缩放方案为HLS图像缩放),再进行多路视频拼接(拼接方案为Xilinx官方的Video Mixer方案,包括2路、4路、8路、16路视频拼接),再进行图像缓存操作(图像缓存方案为VDMA方案,缓存介质包括PS端DDR3),最后以HDMI方式输出,提供4套工程源码,4套工程源码详情请参考“1、前言”中的截图,详细设计方案请参考我专门的博客,博客链接如下:
点击直接前往

本方案的SDI接收+OSD多路视频融合叠加应用

本方案采用GS2971接收SDI视频,然后进行多路视频融合叠加(方案为HLS多路视频融合叠加),再进行图像缓存操作(图像缓存方案为VDMA方案,缓存介质包括PS端DDR3),最后以HDMI方式输出,提供1套工程源码,工程源码详情请参考“1、前言”中的截图,详细设计方案请参考我专门的博客,博客链接如下:
点击直接前往

本方案的SDI接收+HLS多路视频融合叠加应用

本方案采用GS2971接收SDI视频,然后进行多路视频融合叠加(方案为HLS多路视频融合叠加),再进行图像缓存操作(图像缓存方案为VDMA方案,缓存介质包括PS端DDR3),最后以HDMI方式输出,提供1套工程源码,工程源码详情请参考“1、前言”中的截图,详细设计方案请参考我专门的博客,博客链接如下:
点击直接前往

本方案的SDI接收+GTX 8b/10b编解码SFP光口传输

本方案采用GS2971接收SDI视频,然后进行8b/10b编解码作(8b/10b编解码方案为GTX高速接口方案,线速率为5G),再通过板载的SFP光口实现数据回环,再进行图像缓存操作(图像缓存方案为FDMA方案,缓存介质包括PL端DDR3、PS端DDR3),最后以HDMI方式输出,提供2套工程源码,2套工程源码详情请参考“1、前言”中的截图,详细设计方案请参考我专门的博客,博客链接如下:
点击直接前往

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

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

3、详细设计方案

设计原理框图

8套工程源码设计原理框图如下,该设计采用纯verilog代码缩放方案+verilog代码多路视频拼接方案:
在这里插入图片描述

SDI 相机

我用到的是SDI相机为HD-SDI相机,输出分辨率为1920x1080@30Hz,本工程对SDI相机的选择要求范围很宽,可以是SD-SDI、HD-SDI、3G-SDI,因为很设计对这三种SDI视频是自动识别并自适应的;如果你的手里没有SDI相机,也可以去某宝买HDMI转SDI盒子,一百多块钱就可以搞定,使用笔记本电脑模拟视频源,用HDMI线连接HDMI转SDI盒子,输出SDI视频做事视频源,可以模拟SDI相机;

GS2971

本设计采用GS2971芯片解码SDI,GS2971不需要软件配置,硬件电阻上下拉即可完成配置,本设计配置为输出BT1120格式视频,当然,你在设计电路时也可以配置为输出CEA861格式视频;GS2971硬件架构如下,提供PDF格式原理图:
在这里插入图片描述

BT1120转RGB

BT1120转RGB模块的作用是将SMPTE SD/HD/3G SDI IP核解码输出的BT1120视频转换为RGB888视频,它由BT1120转CEA861模块、YUV422转YUV444模块、YUV444转RGB888三个模块组成,该方案参考了Xilinx官方的设计;BT1120转RGB模块代码架构如下:
在这里插入图片描述

纯verilog图像缩放模块详解

图像缩放模块功能框图如下,由跨时钟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选择邻域插值算法;

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

纯verilog图像缩放模块使用

图像缩放模块使用非常简单,顶层代码里设置了四个参数,举例如下:
在这里插入图片描述
上图视频通过图像缩放模块但不进行缩放操作,旨在掌握图像缩放模块的用法;如果需要将图像放大到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;

HDMI输出

HDMI输出架构由VGA时序和HDMI输出模块构成,VGA时序负责产生输出的1920x1080@60Hz的时序,并控制FDMA数据读出,HDMI输出模块负责将VGA的RGB视频转换为差分的TMDS视频,代码架构如下:
在这里插入图片描述
HDMI输出模块采用verilog代码手写,可以用于FPGA的HDMI发送应用,关于这个模块,请参考我之前的博客,博客地址:点击直接前往

工程源码架构

本博客提供8套工程源码,8套代码的vivado Block Design设计具有相似性,以4路视频拼接工程为例,Block Design截图如下,其他工程与之类似;
在这里插入图片描述
以2路视频拼接工程为例,工程源码架构如下图,其他几套工程与之类似:
在这里插入图片描述
工程11、12、13、14使用了自定义的FDMA方案,虽然不需要SDK配置,但FDMA的AXI4接口时钟由Zynq提供,所以需要运行SDK程序才能启动Zynq,从而为PL端逻辑提供时钟;由于不需要SDK配置,所以SDK软件代码就变得极度简单,只需运行一个“Hello World”即可,如下:
在这里插入图片描述

4、工程源码7详解–>SDI接收+图像缩放+2路视频拼接 FDMA缓存PL端DDR3

开发板FPGA型号:Xilinx–Zynq7100–xc7z100ffg900-2;
开发环境:Vivado2019.1;
输入:HD-SDI相机,分辨率1920x1080@30Hz;
输出:HDMI,1080P分辨率下的960x1080的2路视频拼接2分屏显示;
缩放方案:纯verilog图像缩放方案;
输入输出缩放:输入1920x1080–>输出960x1080;
视频拼接方案:2路视频拼接;
图像缓存方案:FDMA方案;
图像缓存路径:PL端DDR3;
工程作用:此工程目的是让读者掌握FPGA实现SDI接收+图像缩放+2路视频拼接的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节“工程源码架构“小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

5、工程源码8详解–>SDI接收+图像缩放+4路视频拼接 FDMA缓存PL端DDR3

开发板FPGA型号:Xilinx–Zynq7100–xc7z100ffg900-2;
开发环境:Vivado2019.1;
输入:HD-SDI相机,分辨率1920x1080@30Hz;
输出:HDMI,1080P分辨率下的960x540的4路视频拼接4分屏显示;
缩放方案:纯verilog图像缩放方案;
输入输出缩放:输入1920x1080–>输出960x540;
视频拼接方案:4路视频拼接;
图像缓存方案:FDMA方案;
图像缓存路径:PL端DDR3;
工程作用:此工程目的是让读者掌握FPGA实现SDI接收+图像缩放+4路视频拼接的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节“工程源码架构“小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

6、工程源码9详解–>SDI接收+图像缩放+8路视频拼接 FDMA缓存PL端DDR3

开发板FPGA型号:Xilinx–Zynq7100–xc7z100ffg900-2;
开发环境:Vivado2019.1;
输入:HD-SDI相机,分辨率1920x1080@30Hz;
输出:HDMI,1080P分辨率下的480x540的8路视频拼接8分屏显示;
缩放方案:纯verilog图像缩放方案;
输入输出缩放:输入1920x1080–>输出480x540;
视频拼接方案:8路视频拼接;
图像缓存方案:FDMA方案;
图像缓存路径:PL端DDR3;
工程作用:此工程目的是让读者掌握FPGA实现SDI接收+图像缩放+8路视频拼接的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节“工程源码架构“小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

7、工程源码10详解–>SDI接收+图像缩放+16路视频拼接 FDMA缓存PL端DDR3

开发板FPGA型号:Xilinx–Zynq7100–xc7z100ffg900-2;
开发环境:Vivado2019.1;
输入:HD-SDI相机,分辨率1920x1080@30Hz;
输出:HDMI,1080P分辨率下的240x540的8路视频拼接16分屏显示;
缩放方案:纯verilog图像缩放方案;
输入输出缩放:输入1920x1080–>输出240x540;
视频拼接方案:16路视频拼接;
图像缓存方案:FDMA方案;
图像缓存路径:PL端DDR3;
工程作用:此工程目的是让读者掌握FPGA实现SDI接收+图像缩放+16路视频拼接的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节“工程源码架构“小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

8、工程源码11详解–>SDI接收+图像缩放+2路视频拼接 FDMA缓存PS端DDR3

开发板FPGA型号:Xilinx–Zynq7100–xc7z100ffg900-2;
开发环境:Vivado2019.1;
输入:HD-SDI相机,分辨率1920x1080@30Hz;
输出:HDMI,1080P分辨率下的960x1080的2路视频拼接2分屏显示;
缩放方案:纯verilog图像缩放方案;
输入输出缩放:输入1920x1080–>输出960x1080;
视频拼接方案:2路视频拼接;
图像缓存方案:FDMA方案;
图像缓存路径:PS端DDR3;
工程作用:此工程目的是让读者掌握FPGA实现SDI接收+图像缩放+2路视频拼接的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节“工程源码架构“小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

9、工程源码12详解–>SDI接收+图像缩放+4路视频拼接 FDMA缓存PS端DDR3

开发板FPGA型号:Xilinx–Zynq7100–xc7z100ffg900-2;
开发环境:Vivado2019.1;
输入:HD-SDI相机,分辨率1920x1080@30Hz;
输出:HDMI,1080P分辨率下的960x540的4路视频拼接4分屏显示;
缩放方案:纯verilog图像缩放方案;
输入输出缩放:输入1920x1080–>输出960x540;
视频拼接方案:4路视频拼接;
图像缓存方案:FDMA方案;
图像缓存路径:PS端DDR3;
工程作用:此工程目的是让读者掌握FPGA实现SDI接收+图像缩放+4路视频拼接的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节“工程源码架构“小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

10、工程源码13详解–>SDI接收+图像缩放+8路视频拼接 FDMA缓存PS端DDR3

开发板FPGA型号:Xilinx–Zynq7100–xc7z100ffg900-2;
开发环境:Vivado2019.1;
输入:HD-SDI相机,分辨率1920x1080@30Hz;
输出:HDMI,1080P分辨率下的480x540的8路视频拼接8分屏显示;
缩放方案:纯verilog图像缩放方案;
输入输出缩放:输入1920x1080–>输出480x540;
视频拼接方案:8路视频拼接;
图像缓存方案:FDMA方案;
图像缓存路径:PS端DDR3;
工程作用:此工程目的是让读者掌握FPGA实现SDI接收+图像缩放+8路视频拼接的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节“工程源码架构“小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

11、工程源码14详解–>SDI接收+图像缩放+16路视频拼接 FDMA缓存PS端DDR3

开发板FPGA型号:Xilinx–Zynq7100–xc7z100ffg900-2;
开发环境:Vivado2019.1;
输入:HD-SDI相机,分辨率1920x1080@30Hz;
输出:HDMI,1080P分辨率下的240x540的8路视频拼接16分屏显示;
缩放方案:纯verilog图像缩放方案;
输入输出缩放:输入1920x1080–>输出240x540;
视频拼接方案:16路视频拼接;
图像缓存方案:FDMA方案;
图像缓存路径:PS端DDR3;
工程作用:此工程目的是让读者掌握FPGA实现SDI接收+图像缩放+16路视频拼接的设计能力,以便能够移植和设计自己的项目;
工程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开发板;
SDI摄像头;
SDI转HDMI盒子;
HDMI显示器;
我的开发板了连接如下:
在这里插入图片描述

工程7、11的2路视频缩放拼接–>输出视频演示

输入视频为HD-SDI相机,输入分辨率为1920x1080@30Hz,经过GS971 SDI接收+图像缩放+2路视频拼接,以HDMI方式输出,输入视频从1920x1080缩放为960x1080,然后将缩放后的视频复制为2份以模拟2路视频,再将这2路视频进行视频拼接,最后在HDMI 1920x1080的输出分辨率下叠加2路拼接视频,即2分屏显示;输出视频演示如下:

GS2971接收SDI视频-图像缩放+2路视频拼接

工程8、12的4路视频缩放拼接–>输出视频演示

输入视频为HD-SDI相机,输入分辨率为1920x1080@30Hz,经过GS971 SDI接收+图像缩放+4路视频拼接,以HDMI方式输出,输入视频从1920x1080缩放为960x540,然后将缩放后的视频复制为4份以模拟4路视频,再将这4路视频进行视频拼接,最后在3G-SDI 1920x1080的输出分辨率下叠加4路拼接视频,即4分屏显示;输出视频演示如下:

GS2971接收SDI视频-图像缩放+4路视频拼接

工程9、13的8路视频缩放拼接–>输出视频演示

输入视频为HD-SDI相机,输入分辨率为1920x1080@30Hz,经过GS971 SDI接收+图像缩放+8路视频拼接,以HDMI方式输出,输入视频从1920x1080缩放为480x540,然后将缩放后的视频复制为8份以模拟8路视频,再将这8路视频进行视频拼接,最后在3G-SDI 1920x1080的输出分辨率下叠加8路拼接视频,即8分屏显示;输出视频演示如下:

GS2971接收SDI视频-图像缩放+8路视频拼接

工程10、14的16路视频缩放拼接–>输出视频演示

输入视频为HD-SDI相机,输入分辨率为1920x1080@30Hz,经过GS971 SDI接收+图像缩放+8路视频拼接,以HDMI方式输出,输入视频从1920x1080缩放为240x540,然后将缩放后的视频复制为16份以模拟16路视频,再将这16路视频进行视频拼接,最后在3G-SDI 1920x1080的输出分辨率下叠加16路拼接视频,即16分屏显示;输出视频演示如下:

GS2971接收SDI视频-图像缩放+16路视频拼接

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

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

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

/ 登录

评论记录:

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

分类栏目

后端 (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