FPGA高端项目:FPGA基于GS2971+GS2972架构的SDI视频收发+OSD动态字符叠加,提供1套工程源码和技术支持

news2025/1/11 16:55:09

目录

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

FPGA高端项目:FPGA基于GS2971+GS2972架构的SDI视频收发+OSD动态字符叠加,提供1套工程源码和技术支持

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视频接收转HDMI输出,输入源为一个HD-SDI相机,也可以使用SD-SDI或者3G-SDI相机,因为本设计是三种SDI视频自适应的;同轴的SDI视频通过同轴线连接到GS2971转接板,GS2971解码芯片将同轴的串行的SDI视频解码为并行的BT1120格式视频,至此,SDI视频解码操作已经完成,可以进行常规的图像处理操作了;本设计的目的是做HLS动态字符叠加后再经过GS2972后输出,需要进行BT1120视频转RGB+OSD动态字符叠加+图像缓存+RGB转BT1120视频操作操作;本设计使用BT1120转RGB模块实现视频格式转换;动态字符叠加采用HLS方案,支持任意字符内容、任意位置显示、任意字符颜色大小等特点,通过SDK软件配置并实时控制;图像缓存使用Xilinx官方的VDMA架构实现图像3帧缓存,缓存介质为板载的DDR3,该架构是Xilinx官方力推的架构,输入接口为AXI4-Stream;图像从DDR3读出后,进入纯verilog代码实现RGB转BT1120视频模块实现视频格式转换;最后BT1120视频经过GS2972编码芯片被编码为同轴的串行的SDI视频输出,并经过SDI转HDMI盒子输出到显示器;本博客提供1套工程源码,具体如下,请点击图片放大查看:
在这里插入图片描述
现对上述1套工程源码做如下解释,方便读者理解:
工程源码19:
输入视频为HD-SDI相机,输入分辨率为1920x1080@30Hz,经过GS2971解码+BT1120转RGB+OSD动态字符叠加+VDMA图像缓存+GS2972编码后,以3G-SDI接口方式输出,输出分辨率为1920x1080@60Hz;此工程的VDMA图像缓存架构将视频缓存到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视频收发+OSD动态字符叠加,工程代码编译通过后上板调试验证,可直接项目移植,适用于在校学生做毕业设计、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字成像和图像传输领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

免责声明

本工程及其源码即有自己写的一部分,也有网络公开渠道获取的一部分(包括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接收+纯verilog图像缩放+纯verilog多路视频拼接应用

本方案采用GS2971接收SDI视频,然后进行图像缩放操作(图像缩放方案为纯verilog图像缩放),再进行多路视频拼接(包括2路、4路、8路、16路视频拼接,拼接方案为纯verilogFDMA方案,视频拼接和图像缓存为一个整体,缓存介质包括PL端DDR3、PS端DDR3),最后用GS2972编码器发送SDI视频,最终以3G-SDI输出;提供8套工程源码,8套工程源码详情请参考“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接收+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、详细设计方案

设计原理框图

工程源码19的设计原理框图如下,该设计采用OSD动态字符叠加+VDMA图像缓存方案:
在这里插入图片描述

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模块代码架构如下:
在这里插入图片描述

OSD动态字符叠加

OSD动态字符叠加设计框图如下如所示:
在这里插入图片描述
OSD动态字符叠加由视频流和字符流叠加而成,视频流来源于输入视频,经VDMA缓存DDR3后输入到动态字符叠加模块;字符流由SDK软件产生,来源是国标汉字字库,可通过软件控制字符内容产生、字符大小、字符颜色、字符显示位置等信息,并通过c语言系统函数写入DDR3,然后随视频流叠在显示;设计加采用HLS方案C++代码实现,并综合成RTL后封装为IP,可在vivado中调用该IP,关于这个方案详情,请参考我之前的博客,博客链接如下:
点击直接前往
该IP在vivado中的综合资源占用情况如下:
在这里插入图片描述
OSD动态字符叠加需要在SDK中运行驱动和用户程序才能正常工作,我在工程中给出了C语言程序,具体参考工程源码;

VDMA图像缓存

图像缓存使用Xilinx官方的VDMA架构实现图像3帧缓存,缓存介质为板载的PS端DDR3;VDMA图像缓存架构由Video In to AXI4-Stream、VDMA、Zynq软核、Video Timing Controller、AXI4-Stream To Video Out构成;详情请参考后面的“工程源码架构小节”,VDMAIP核UI配置界面如下:
在这里插入图片描述
VDMA加需要在SDK中运行驱动和用户程序才能正常工作,我在工程中给出了C语言程序,具体参考工程源码;

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块;我用的截图如下:
在这里插入图片描述

工程源码架构

工程Block Design和源码架构如下,Block Design设计为图像缓存架构的部分,缓存PS端DDR3:
在这里插入图片描述
在这里插入图片描述
工程源码PL端时钟由Zynq软核提供,所以需要运行运行SDK以启动Zynq,此外,OSD动态字符叠加、VDMA等IP核都需要运行软件驱动才能正常工作,SDK软件代码架构如下:
在这里插入图片描述
SDK代码中,设置了两个字符显示位置,用户可根据自己的需求任意修改;
在屏幕坐标(0,0)位置显示黑色字符“台湾一定要解放”;
在屏幕坐标(660,240)位置显示红色字符“台湾一定要解放”;
具体输出效果请参考后面第6章节的“HLS动态字符叠加输出视频演示”;

4、工程源码19详解–>SDI收发+OSD动态字符叠加

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

5、工程移植说明

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软核;

6、上板调试验证

准备工作

需要准备的器材如下:
FPGA开发板;
SDI摄像头;
SDI转HDMI盒子;
HDMI显示器;
我的开发板了连接如下:
在这里插入图片描述
图中居左者为GS2971接收芯片,对应的金色同轴线连接SDI相机;居右者为GS2972发送芯片,对应的黑色同轴线连接SDI转HDMI盒子;SDI转HDMI盒子再连接显示器;

OSD动态字符叠加输出视频演示

FPGA基于GS2971的SDI接收+HLS动态字符叠加+GS2972的SDI发送输出效果如下:

GS2971的SDI接收+HLS动态字符叠加

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1519943.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用连续自然数之和来表达整数 - 华为OD统一考试(C卷)

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C 题目描述 一个整数可以由连续的自然数之和来表示。给定一个整数,计算该整数有几种连续自然数之和的表达式,且打印出每种表达式。 输入描述 一个目…

1.Python数据分析—数据分析与挖掘详讲

1.Python数据分析—数据分析与挖掘详讲 一个人简介二数据分析与挖掘概述三什么是数据分析和挖掘四数据分析与挖掘在不同领域的应用4.1医疗领域:4.1.1 建立疾病数据库:4.1.2 临床决策支持:4.1.3 疾病预警和监控: 4.2 电子商务领域&…

还原wps纯粹的编辑功能

1.关闭稻壳模板: 1.1. 启动wps(注意不要乱击稻壳模板,点了就找不到右键菜单了) 1.2. 在稻壳模板选项卡右击:选不再默认展示 2.关闭托盘中wps云盘图标:右击云盘图标/同步与设置: 2.1.关闭云文档同步 2.2.窗口选桌面应用…

【Unity+Vuforia】AR 发布安卓的设置

Player Settings > Resolution and Presentation > Default Orientation portrait Player Settings > Other Settings > Auto Graphics API 取消勾选 Player Settings > Other Settings > Graphics APIs 选择OpenGLES3删除其他的 Player Settings…

【矩阵】54. 螺旋矩阵【中等】

螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 解题思路 1、模拟顺时针螺旋顺序遍历矩阵…

pytorch之诗词生成6--eval

先上代码: import tensorflow as tf from dataset import tokenizer import settings import utils# 加载训练好的模型 model tf.keras.models.load_model(r"E:\best_model.h5") # 随机生成一首诗 print(utils.generate_random_poetry(tokenizer, model)…

Vscode中关于Java的一些问题

前言 在使用Vscode的时候,总是会有这么一种感觉:有时得这样,有时得那样,这让我甚是困惑,于是写下来这篇解答文章 为什么java文件有时候会有class文件,有时候没有 在编写Java代码时,我会有一种…

自习室预订系统|基于springboot框架+ Mysql+Java+B/S架构的自习室预订系统设计与实现(可运行源码+数据库+设计文档+部署说明)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 学生功能模块 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen参…

R语言语法基础(说人话版)

在Rstudio中使用ctrl回车来执行某一行的代码 在R语言中,通常不需要像C语言一样在每条语句的结尾添加分号来表示语句结束。R语言是一种脚本语言,它使用换行符来分隔语句,因此分号通常是可选的,除非你想在同一行上写多个语句。在R中…

QMI8658芯片I2C驱动开发指南

这个芯片纯国产挺好用的,电路很好设计,我这垃圾焊功,纯手焊,,居然能用。 第一部分 硬件连接 画的很简陋,看看就可以了,这里I2C总线需要接10K上拉没有画出来,这个需要注意一下。 …

鸿蒙实战开发:【分布式软总线组件】

简介 现实中多设备间通信方式多种多样(WIFI、蓝牙等),不同的通信方式使用差异大,导致通信问题多;同时还面临设备间通信链路的融合共享和冲突无法处理等挑战。分布式软总线实现近场设备间统一的分布式通信管理能力,提供不区分链路…

邮件自动化:简化Workplace中的操作

电子邮件在职场中的使用对于企业和组织的日常活动起着重要的作用。电子邮件不再仅仅是一种通信方式,已经成为现代企业和组织实施日常运营的关键要素。 除了通信,电子邮件对于需求生成、流程工作流、交易审批以及各种其他与业务相关的活动至关重要。在当…

【C++设计模式】策略模式

文章目录 前言一、策略模式是什么?二、策略模式的实现原理三、UML图四、代码实现总结 前言 策略模式是一种行为设计模式,它允许在运行时选择算法的行为。通过将每个算法封装到具有共同接口的独立类中,客户端可以在不改变自身代码的情况下选择…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:RelativeContainer)

相对布局组件,用于复杂场景中元素对齐的布局。 说明: 该组件从API Version 9开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 规则说明 容器内子组件区分水平方向,垂直方向: 水平方向为left&…

ThingsBoard Edge 设备连接

文章目录 一、创建设备1.创建设备配置2.创建设备 二、上传遥测1.MQTTX 工具2.上传遥测 三、属性1.属性类型2.上传客户端属性3.下载共享属性4.订阅共享数据 四、设备告警1.配置告警规则2.清除报警规则3.测试3.1.设备告警3.1.清除告警 五、规则链1.规则管理2.Edge 查看规则链 Thi…

腾讯云对象存储的在Java使用步骤介绍

腾讯云对象存储的在Java使用步骤介绍 创建一个腾讯云的账户 这个自己去创建,然后开通对象存储服务,如下 有了账号就要创建一个对象存储的桶,也就是存储对象的一个容器 如果你想只有自己放存放的就设置 私有读写 ,如果想用网络直…

SpringCloud Stream 消息驱动

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅,从传统的模块之间调用,一步步的升级为 SpringCloud 模块之间的调用,此篇文章为第九篇,即介绍 Stream 消息驱动。 二、消息驱动概念 2.1 消息驱动是什么 官方定义 Spring …

提升用户体验,Xinstall智能判定拉起技术来袭

在移动互联网时代,App推广已经成为各大企业的必争之地。然而,随着市场竞争的加剧,如何提升App的转化效率和用户体验成为了推广者们亟待解决的问题。这时,Xinstall的智能判定拉起技术应运而生,为推广者们带来了新的解决…

Go-知识select

Go-知识select 1. select 的特性1.1 chan读写1.2 返回值1.3 default 2. select 经典使用2.1 永久阻塞2.2 快速检错2.3 限时等待 3. 实现原理3.1 数据结构3.2 实现逻辑3.3 原理总结 4. 总结4.1 大概原理4.2 参数4.3 返回值 一个小活动: https://developer.aliyun.com…

element el-table 表格限制多选个数

本次的功能的要求是: 原本的引入的elment 的表格,去除全选框,版本对比的按钮,需要在选择版本,并且版本个数为2的时候,可点击,进行版本对比操作每次选择版本的时候,目前已有两个选择…