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

本文主要是介绍FPGA高端项目:FPGA基于GS2971+GS2972架构的SDI视频收发+纯verilog图像缩放+多路视频拼接,提供8套工程源码和技术支持,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1、前言
    • 免责声明
  • 2、相关方案推荐
    • 本博已有的 SDI 编解码方案
    • 本方案的SDI接收+发送
    • 本方案的SDI接收+图像缩放应用
    • 本方案的SDI接收+HLS图像缩放+HLS多路视频拼接应用
    • 本方案的SDI接收+OSD动态字符叠加输出应用
    • 本方案的SDI接收+HLS多路视频融合叠加应用
    • 本方案的SDI接收+GTX 8b/10b编解码SFP光口传输
    • FPGA的SDI视频编解码项目培训
  • 3、详细设计方案
    • 设计原理框图
    • 视频源选择
    • 动态彩条
    • SDI 相机
    • GS2971+GS2972架构
    • BT1120转RGB
    • 纯verilog图像缩放模块详解
    • 纯verilog图像缩放模块使用
    • 多路视频拼接算法
    • 图像缓存
    • RGB转BT1120
    • SDI转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+GS2972架构的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图像缩放+多路视频拼接+GS2972实现SDI视频发送,视频源有两种,分别对应开发者手里有没有SDI相机的情况,一种是使用HD-SDI相机,也可以使用SD-SDI或者3G-SDI相机,因为本设计是三种SDI视频自适应的;如果你的手里没有SDI相机或者没有SDI相机输入接口,则可使用FPGA内部生成的动态彩条模拟SDI相机视频;视频源的选择通过代码顶层的define宏定义进行选择,默认使用SDI相机作为视频源;同轴的SDI视频通过同轴线连接到GS2971转接板,GS2971解码芯片将同轴的串行的SDI视频解码为并行的BT1120格式视频,至此,SDI视频解码操作已经完成,可以进行常规的图像处理操作了;本设计的目的是做纯verilog图像缩放+纯verilog多路视频拼接后再经过GS2972后输出,需要进行BT1120视频进行转RGB+纯verilog图像缩放+纯verilog多路视频拼接+图像缓存+RGB转BT1120视频操作;本设计使用BT1120转RGB模块实现视频格式转换;图像缩放采用纯verilog代码实现的图像缩放架构实现SDI的图像缩放操作,将原始的1920x1080分辨率的SDI视频缩小为960x540,当然,读者也可以缩放为其他分辨率;纯verilog多路视频拼接+图像缓存使用FDMA架构,该架构简单灵活,输入接口为VGA视频时序,即用VS、DE、RGB数据,将不同的视频写入不同的内存地址再统一读出来,以达到拼接效果,FDMA架构的视频既可以缓存到PL端DDR,也可以缓存到PS端DDR,针对不同的项目需求;图像从DDR3读出后,进入纯verilog代码实现RGB转BT1120视频模块实现视频格式转换;最后BT1120视频经过GS2972编码芯片被编码为同轴的串行的SDI视频输出,并经过SDI转HDMI盒子输出到显示器;本博客提供8套工程源码,具体如下:
在这里插入图片描述
现对上述8套工程源码做如下解释,方便读者理解:
工程源码7:
输入视频为HD-SDI相机或动态彩条,输入分辨率为1920x1080@30Hz,经过GS2971解码+BT1120转RGB+纯verilog图像缩放+FDMA图像缓存+2路视频拼接+RGB转BT1120模块+GS2972编码后,以3G-SDI接口方式输出,图像缩放方案采用纯verilog代码实现,从1920x1080缩放为960x1080,然后将缩放后的视频复制为2份以模拟2路视频,再将这2路视频进行视频拼接,最后在3G-SDI 1920x1080的输出分辨率下叠加2路拼接视频,即2分屏显示;此工程的FDMA图像缓存架构将视频缓存到PL端DDR3,适应于纯FPGA项目,比如可用于Xilinx的Artix7、Kintex7、Virtex7等FPGA;

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

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

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

工程源码11:
输入视频为HD-SDI相机或动态彩条,输入分辨率为1920x1080@30Hz,经过GS2971解码+BT1120转RGB+纯verilog图像缩放+FDMA图像缓存+2路视频拼接+RGB转BT1120模块+GS2972编码后,以3G-SDI接口方式输出,图像缩放方案采用纯verilog代码实现,从1920x1080缩放为960x1080,然后将缩放后的视频复制为2份以模拟2路视频,再将这2路视频进行视频拼接,最后在3G-SDI 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路视频拼接+RGB转BT1120模块+GS2972编码后,以3G-SDI接口方式输出,图像缩放方案采用纯verilog代码实现,从1920x1080缩放为960x540,然后将缩放后的视频复制为4份以模拟4路视频,再将这4路视频进行视频拼接,最后在3G-SDI 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路视频拼接+RGB转BT1120模块+GS2972编码后,以3G-SDI接口方式输出,图像缩放方案采用纯verilog代码实现,从1920x1080缩放为480x540,然后将缩放后的视频复制为8份以模拟8路视频,再将这8路视频进行视频拼接,最后在3G-SDI 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路视频拼接+RGB转BT1120模块+GS2972编码后,以3G-SDI接口方式输出,图像缩放方案采用纯verilog代码实现,从1920x1080缩放为240x540,然后将缩放后的视频复制为16份以模拟16路视频,再将这16路视频进行视频拼接,最后在3G-SDI 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+GS2972架构的SDI视频收发+纯verilog图像缩放+多路视频拼接,工程代码编译通过后上板调试验证,可直接项目移植,适用于在校学生做毕业设计、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字成像和图像传输领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

免责声明

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

2、相关方案推荐

本博已有的 SDI 编解码方案

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

本方案的SDI接收+发送

本方案采用GS2971接收SDI视频,然后进行图像缓存操作(图像缓存方案包括FDMA方案和VDMA方案,缓存介质包括PL端DDR3、PS端DDR3),最后用GS2971发送SDI视频,最终以3G-SDI输出;提供3套工程源码,3套工程源码详情请参考“1、前言”中的截图,上述所有工程源码均已上板调试通过,详细设计说明等待本博更新对用的博客。。。

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

本方案采用GS2971接收SDI视频,然后进行图像缩放操作(图像缩放方案包括纯verilog图像缩放方案和HLS图像缩放方案),再进行图像缓存操作(图像缓存方案包括FDMA方案和VDMA方案,缓存介质包括PL端DDR3、PS端DDR3),最后用GS2971发送SDI视频,最终以3G-SDI输出;提供3套工程源码,3套工程源码详情请参考“1、前言”中的截图,上述所有工程源码均已上板调试通过,详细设计说明等待本博更新对用的博客。。。

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

本方案采用GS2971接收SDI视频,然后进行图像缩放操作(图像缩放方案为HLS图像缩放),再进行多路视频拼接(拼接方案为Xilinx官方的Video Mixer方案,包括2路、4路、8路、16路视频拼接),再进行图像缓存操作(图像缓存方案为VDMA方案,缓存介质包括PS端DDR3),最后用GS2972编码器发送SDI视频,最终以3G-SDI输出;提供4套工程源码,4套工程源码详情请参考“1、前言”中的截图,上述所有工程源码均已上板调试通过,详细设计说明等待本博更新对用的博客。。。

本方案的SDI接收+OSD动态字符叠加输出应用

本方案采用GS2971接收SDI视频,然后进行动态字符叠加(方案为HLS动态字符叠加),再进行图像缓存操作(图像缓存方案为VDMA方案,缓存介质包括PS端DDR3),最后用GS2972编码器发送SDI视频,最终以3G-SDI输出;提供1套工程源码,工程源码详情请参考“1、前言”中的截图,上述所有工程源码均已上板调试通过,详细设计说明等待本博更新对用的博客。。。

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

本方案采用GS2971接收SDI视频,然后进行多路视频融合叠加(方案为HLS多路视频融合叠加),再进行图像缓存操作(图像缓存方案为VDMA方案,缓存介质包括PS端DDR3),最后用GS2972编码器发送SDI视频,最终以3G-SDI输出;提供1套工程源码,工程源码详情请参考“1、前言”中的截图,上述所有工程源码均已上板调试通过,详细设计说明等待本博更新对用的博客。。。

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

本方案采用GS2971接收SDI视频,然后进行8b/10b编解码作(8b/10b编解码方案为GTX高速接口方案,线速率为5G),再通过板载的SFP光口实现数据回环,再进行图像缓存操作(图像缓存方案为FDMA方案,缓存介质包括PL端DDR3、PS端DDR3),最后用GS2972编码器发送SDI视频,最终以3G-SDI输出;提供2套工程源码,2套工程源码详情请参考“1、前言”中的截图,详细设计方案请参考我专门的博客,上述所有工程源码均已上板调试通过,详细设计说明等待本博更新对用的博客。。。

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

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

3、详细设计方案

设计原理框图

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

视频源选择

视频源有两种,分别对应开发者手里有没有SDI相机的情况,一种是使用HD-SDI相机,也可以使用SD-SDI或者3G-SDI相机,因为本设计是三种SDI视频自适应的;如果你的手里没有SDI相机或者没有SDI相机输入接口,则可使用FPGA内部生成的动态彩条模拟SDI相机视频;视频源的选择通过代码顶层的define宏定义进行选择,默认使用SDI相机作为视频源;如下:
在这里插入图片描述
选择逻辑代码部分如下:
在这里插入图片描述
选择逻辑如下:
当(注释) define COLOR_TEST时,输入源视频是SDI相机;
当(不注释) define COLOR_TEST时,输入源视频是动态彩条;

动态彩条

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

SDI 相机

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

GS2971+GS2972架构

本设计采用GS2971解码芯片接收SDI+GS2972芯片编码发送SDI,GS2971和GS2972不需要软件配置,硬件电阻上下拉即可完成配置,本设计配置为输出/输入BT1120格式视频,当然,你在设计电路时也可以配置为输出CEA861格式视频;GS2971+GS2972硬件架构如下,提供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-fifoparameter DATA_WIDTH         =	8       ,		//Width of input/output dataparameter CHANNELS           =	1       ,		//Number of channels of DATA_WIDTH, for color imagesparameter 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 		// 输出视频--即缩后视频的像素数据
);

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

通过输入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;

RGB转BT1120

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

SDI转HDMI盒子

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

工程源码架构

本博客提供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;
输出:3G-SDI,1080P分辨率下的960x1080的2路视频拼接2分屏显示;
SDI接收方案:GS2971解码芯片;
SDI发送方案:GS2972编码芯片;
缩放方案:纯verilog图像缩放方案;
输入输出缩放:输入1920x1080–>输出960x1080;
视频拼接方案:2路视频拼接;
图像缓存方案:FDMA方案;
图像缓存路径:PL端DDR3;
工程作用:此工程目的是让读者掌握FPGA实现基于GS2971+GS2972架构的SDI接收+图像缩放+2路视频拼接的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节“工程源码架构“小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

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

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

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

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

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

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

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

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

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

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

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

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

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

开发板FPGA型号:Xilinx–Zynq7100–xc7z100ffg900-2;
开发环境:Vivado2019.1;
输入:HD-SDI相机,分辨率1920x1080@30Hz;
输出:3G-SDI,1080P分辨率下的240x540的8路视频拼接16分屏显示;
SDI接收方案:GS2971解码芯片;
SDI发送方案:GS2972编码芯片;
缩放方案:纯verilog图像缩放方案;
输入输出缩放:输入1920x1080–>输出240x540;
视频拼接方案:16路视频拼接;
图像缓存方案:FDMA方案;
图像缓存路径:PS端DDR3;
工程作用:此工程目的是让读者掌握FPGA实现基于GS2971+GS2972架构的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显示器;
我的开发板了连接如下:
在这里插入图片描述
图中居左者为GS2971接收芯片,对应的金色同轴线连接SDI相机;居右者为GS2972发送芯片,对应的黑色同轴线连接SDI转HDMI盒子;SDI转HDMI盒子再连接显示器;

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

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

GS2971接收+2路视频缩放拼接+GS2972发送

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

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

GS2971接收+4路视频缩放拼接+GS2972发送

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

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

GS2971接收+8路视频缩放拼接+GS2972发送

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

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

GS2971接收+16路视频缩放拼接+GS2972发送

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

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

这篇关于FPGA高端项目:FPGA基于GS2971+GS2972架构的SDI视频收发+纯verilog图像缩放+多路视频拼接,提供8套工程源码和技术支持的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/804519

相关文章

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将

Python视频处理库VidGear使用小结

《Python视频处理库VidGear使用小结》VidGear是一个高性能的Python视频处理库,本文主要介绍了Python视频处理库VidGear使用小结,文中通过示例代码介绍的非常详细,对大家的... 目录一、VidGear的安装二、VidGear的主要功能三、VidGear的使用示例四、VidGea

Python 中 requests 与 aiohttp 在实际项目中的选择策略详解

《Python中requests与aiohttp在实际项目中的选择策略详解》本文主要介绍了Python爬虫开发中常用的两个库requests和aiohttp的使用方法及其区别,通过实际项目案... 目录一、requests 库二、aiohttp 库三、requests 和 aiohttp 的比较四、requ

SpringBoot项目启动后自动加载系统配置的多种实现方式

《SpringBoot项目启动后自动加载系统配置的多种实现方式》:本文主要介绍SpringBoot项目启动后自动加载系统配置的多种实现方式,并通过代码示例讲解的非常详细,对大家的学习或工作有一定的... 目录1. 使用 CommandLineRunner实现方式:2. 使用 ApplicationRunne

使用IntelliJ IDEA创建简单的Java Web项目完整步骤

《使用IntelliJIDEA创建简单的JavaWeb项目完整步骤》:本文主要介绍如何使用IntelliJIDEA创建一个简单的JavaWeb项目,实现登录、注册和查看用户列表功能,使用Se... 目录前置准备项目功能实现步骤1. 创建项目2. 配置 Tomcat3. 项目文件结构4. 创建数据库和表5.

Python项目打包部署到服务器的实现

《Python项目打包部署到服务器的实现》本文主要介绍了PyCharm和Ubuntu服务器部署Python项目,包括打包、上传、安装和设置自启动服务的步骤,具有一定的参考价值,感兴趣的可以了解一下... 目录一、准备工作二、项目打包三、部署到服务器四、设置服务自启动一、准备工作开发环境:本文以PyChar

多模块的springboot项目发布指定模块的脚本方式

《多模块的springboot项目发布指定模块的脚本方式》该文章主要介绍了如何在多模块的SpringBoot项目中发布指定模块的脚本,作者原先的脚本会清理并编译所有模块,导致发布时间过长,通过简化脚本... 目录多模块的springboot项目发布指定模块的脚本1、不计成本地全部发布2、指定模块发布总结多模

SpringBoot项目删除Bean或者不加载Bean的问题解决

《SpringBoot项目删除Bean或者不加载Bean的问题解决》文章介绍了在SpringBoot项目中如何使用@ComponentScan注解和自定义过滤器实现不加载某些Bean的方法,本文通过实... 使用@ComponentScan注解中的@ComponentScan.Filter标记不加载。@C

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

javafx 如何将项目打包为 Windows 的可执行文件exe

《javafx如何将项目打包为Windows的可执行文件exe》文章介绍了三种将JavaFX项目打包为.exe文件的方法:方法1使用jpackage(适用于JDK14及以上版本),方法2使用La... 目录方法 1:使用 jpackage(适用于 JDK 14 及更高版本)方法 2:使用 Launch4j(