FPGA实现SDI视频解码PCIE传输 提供工程源码和QT上位机源码加技术支持

news2024/9/25 21:24:59

目录

  • 1、前言
  • 2、我已有的SDI编解码方案
  • 3、我已有的PCIE方案
  • 4、总体设计思路和方案
    • SDI摄像头
    • Gv8601a单端转差
    • GTX解串
    • SDI解码
    • VGA时序恢复
    • YUV转RGB
    • 图像缓存
    • PCIE发送通路
    • SDI同步输出通路
  • 5、vivado工程详解
  • 6、驱动安装
  • 7、QT上位机软件
  • 8、上板调试验证
    • SDI同步HDMI输出验证
    • PCIE输出验证
  • 9、福利:工程代码的获取

1、前言

FPGA实现SDI视频编解码目前有两种方案:
一是使用专用编解码芯片,比如典型的接收器GS2971,发送器GS2972,优点是简单,比如GS2971直接将SDI解码为并行的YCRCB,缺点是成本较高,可以百度一下GS2971的价格;
另一种方案是使用FPGA实现编解码,利用FPGA的GTP/GTX资源实现解串,优点是合理利用了FPGA资源,GTP/GTX资源不用白不用,缺点是操作难度大一些,对FPGA水平要求较高。

PCIE(PCI Express)采用了目前业内流行的点对点串行连接,比起 PCI 以及更早期的计算机总线的共享并行架构,每个设备都有自己的专用连接,不需要向整个总线请求带宽,而且可以把数据传输率提高到一个很高的频率,达到 PCI 所不能提供的高带宽,是目前各行业高速接口的优先选择方向,具有很高的实用价值和学习价值;

本设计使用Xilinx官方的XDMA方案搭建基于Xilinx系列FPGA的PCIE通信平台,该方案只适用于Xilinx系列FPGA,一并提供了XDMA的安装驱动和QT上位机源代码,省去了使用XDMA繁琐的驱动寻找和上位机软件开发的不知所措,并以搭建好vivado工程,省去了不知道如何使用XDMA的尴尬,使得PCIE的使用变得简单易上手,而不用关心其复杂的PCIE协议;由于我的开发板只支持PCIE X8,所以提供的代码是PCIE X8架构,若需要PCIE X1、 X2、 X8、 X16、 X32的朋友,可自行修改本工程,也可关注我,我会实时发布新的工程。

在这里插入图片描述
本文详细描述了FPGA纯verilog解码SDI视频并发送PCIE到上位机用QT现实采集视频的实现设计方案,利用开发板自带的SDI输入接口,实时采集HDMI输入视频,缓存DDR3后,一路经HDMI输出芯片输出显示器,另一路经XDMA,通过PCIE发送给QT上位机显示程序显示;达到SDI采集视频环出和PCIE输出到电脑端显示的同步操作,属于FPGA图像采集领域的高端项目。。。
工程代码编译通过后上板调试验证,文章末尾有演示视频,可直接项目移植,适用于在校学生做毕业设计、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字成像和图像传输领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

2、我已有的SDI编解码方案

我的主页有SDI视频专栏,既有FPGA纯逻辑资源的SDI编解码,其中有基于GTX的,也有基于GTH的编解码,又有基于例如GS2971/GS2972的SDI视频收发工程,既有普通的SDI接受发送,也有SDI视频的缩放、拼接、UDP传输、SFP光纤传输、PCIE传输等等;以下是专栏地址:
点击直接前往

3、我已有的PCIE方案

我的主页有PCIE通信专栏,既有基于RIFFA实现的PCIE方案,也有基于XDMA实现的PCIE方案;既有简单的数据交互、测速,也有应用级别的图像采集传输;既有纯FPGA的PCIE,也有zynq的PCIE;以下是专栏地址:
点击直接前往

4、总体设计思路和方案

总体设计思路和方案如下:
在这里插入图片描述

SDI摄像头

我用到的SDI摄像头输出视频分辨率1080P@30Hz;根据不同相机有所区别;

Gv8601a单端转差

Gv8601a起到均衡 EQ 功能,这里选用Gv8601a是因为抄袭了Xilinx官方的板子,当然也可以用其他型号器件。

GTX解串

GTX负责解串,将原始SDI视频解为20位的并行数据,我的板子是K7,所以用GTX,如果是A7的板子则用GTP,这里使用GTX并没有调用IP,而是直接调用GTXE2_CHANNEL和GTXE2_COMMON源语,这一点可谓将Xilinx的GTX资源用到了极致水平,值得好好品读,其实调用IP无非也就是把调用源语变得界面化而已,直接调用源语或许理解更为深刻,这一点,在市面上的所谓FPGA教程里都学不到。

SDI解码

调用SMPTE-SDI IP核实现,GTX只是将高速串行数据解为了并行,但并没有解析SDI协议,SMPTE-SDI IP核则完成了SDI协议的解码,去掉了SDI协议中的数据包信息和控制信息,解析出有效的视频数据,详细的SMPTE-SDI IP核接口定义请参考官方的使用手册;

VGA时序恢复

此模块的作用就是解码恢复出hs、vs以及de信号,即恢复正常的VGA视频时序;
要恢复正常的VGA视频时序,首先得看懂下面这张图:
在这里插入图片描述
根据这张表即可恢复出图像时序,具体看代码,这里一两句话实在讲不清楚,如果要完全讲明白,写5本书都搓搓有余;

YUV转RGB

这里就简单了,YUV4:4:4转RGB8:8:8,几条公式和几行代码的事儿,属于低端操作;
至此,SDI解码过程就完成了,接下来就是图像输出过程;

具体的SDI解码部分原理讲解,请参考我之前的文章:点击直接前往

图像缓存

其实就是一个AXI4主机,加上读写逻辑构成的DMA;具体看代码。。。

PCIE发送通路

调用Xilinx官方的XDMA作为PCIE发送引擎,不需要了解PCIE复杂的协议,XDMA集成AXI4接口,直接与DDR3交互,用户通过DDR3的指定地址做数据读写即可;
具体的PCIE发送通路部分原理讲解,请参考我之前的文章:点击直接前往

SDI同步输出通路

SDI视频采集缓存后,读出数据送HDMI输出现实,这一步可作为QT上位机的参考,同步输出可比较PCIE视频传输的正确性,有的项目也有PCIE和HDMI同步输出的需求,所以这里设计得高度贴近真实项目。。。
HDMI发送使用silicon9134芯片,silicon9134需要i2c配置才能使用,关于silicon9134得i2c配置和使用,请参考我之前的文章:点击直接前往

5、vivado工程详解

开发板FPGA型号:Xilinx–xc7k325tffg900-2;
开发环境:Vivado2019.1;
输入:3G-SDI;分辨率1920X1080@30Hz;
输出1:PCIE X8至电脑端QT上位机;
输出2:HDMI输出;分辨率1920X1080@60Hz;;
应用:SDI视频采集卡;
工程BD如下:
在这里插入图片描述
在这里插入图片描述
综合后的工程代码架构如下:
在这里插入图片描述
SDI解码部分源码位置如图:
在这里插入图片描述
综合编译完成后的FPGA资源消耗和功耗预估如下:
在这里插入图片描述

6、驱动安装

提供提供Win系统驱动,目录如下:
在这里插入图片描述
在这里插入图片描述
驱动安装参考前面的测速试验:点击直接前往

7、QT上位机软件

QT显示上位机:提供源代码和可执行程序,发开版本为QT5.6.2;位置如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8、上板调试验证

SDI同步HDMI输出验证

在这里插入图片描述

PCIE输出验证

开启上位机测程序进行 PCIe 显示测试,打开下图的显示软件 pcie2screen,软件在如下位置,实验结果如下:
在这里插入图片描述
打开上位机以后可以看到软件暂停播放:
在这里插入图片描述
点击中间的按钮,开始播放SDI输入视频源的视频:
在这里插入图片描述

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

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

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

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

相关文章

neo4j结合gds实现最短路径算法

背景:Neo4j自带的cypher语句中的 shortestpath allShortestPaths 返回值内容非常有限,不易处理, 在实际生产环境中可用性极低, 且若带where条件查询时,查询效率极低 因此,使用Neo4j自带的插件如apoc来进行最短路径查询…

使用@Autowired、@Qualifier、@Primary注解自动装配组件

1.Autowired、Qualifier、Primary注解 1.1.Autowired注解 Autowired注解可以对类成员变量、方法和构造函数进行标注,完成自动装配的工作。 package org.springframework.beans.factory.annotation;import java.lang.annotation.Documented; import java.lang.ann…

hexo stellar主题添加运行时间-利用不蒜子

在网站的页脚想添加博客运行的时间以及,查了一下资料,根据下面的这个博主的代码进行了修改。 打造一个舒服的写作环境(Hexo) 下面我们开始修改: stellar/layout/_partial/main/footer.ejs 找到//footer的 这一段 // …

基于logback 实现springboot的日志配置

目录 一、前言 二、使用详解 2.1、打印到文件中 2.2、打印级别控制 2.3、logback 详细配置 2.4、logback 配置文件的组成 2.4.1、<root>标签 2.4.2、<contextName>标签 2.4.3、<property>标签 2.4.4、<appender>标签 2.4.5、<logger&g…

Mysql索引(2):索引结构

1 概述 MySQL的索引是在存储引擎层实现的&#xff0c;不同的存储引擎有不同的索引结构&#xff0c;主要包含以下几种&#xff1a; 索引结构描述BTree索最常见的索引类型&#xff0c;大部分引擎都支持 B 树索引 Hash索引 底层数据结构是用哈希表实现的, 只有精确匹配索引列的…

ShardingProxy分库分表实战

目录 ShardingProxy简述 快速使用 ShardingProxy部署 ShardingProxy使用 ShardingProxy的服务治理 Shardingproxy的其他功能 ShardingProxy的SPI扩展 ShardingSphere总结 ShardingProxy简述 ShardingProxy的功能同样是分库分表&#xff0c;但是他是一个独立部署的服务…

林曦讲座 | 关于“无用之美”的11个闪光

林曦老师的新书《无用之美》即将和大家见面啦~    究竟什么是“无用之美”呢&#xff1f;早在2013年&#xff0c;林曦老师就曾在“一席”做过一场关于“无用之美”的分享。2019年又在微软做过一次《中国人的闲情逸致——无用之美》的演讲。这次将两次演讲的内容精华整理出来…

【LeetCode】14. 最长公共前缀

1. 问题 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 “”。 示例 1 输入&#xff1a;strs [“flower”,“flow”,“flight”] 输出&#xff1a;“fl” 示例 2 输入&#xff1a;strs [“dog”,“racecar”,“car”] 输出…

虹科动态 | 2023成都国际工业博览会精彩瞬间回顾

2023成都国际工业博览会&#xff08;CDIIF&#xff09;于中国国际西部博览城圆满落下帷幕。本届成都工博会紧紧围绕“工业引领&#xff0c;赋能产业新发展”主题&#xff0c;聚焦工业自动化、数控机床与金属加工、机器人、新一代信息技术与应用、工业互联网、新材料、节能与工业…

在VMware上对于CentOS虚拟机的克隆

一. 执行克隆操作 对已有的虚拟机右键&#xff0c;找到克隆操作&#xff0c;选择完整克隆&#xff0c;之后修改一下虚拟机名称和位置&#xff0c;点击完成即可。 克隆之后还需要修改一些东西&#xff0c;以防止运行期间的 ip 浮动之类的问题。 二. 修改配置 先关闭原来的虚拟…

三菱GOT2000人机界面设置用户报警和系统报警弹出报警显示的具体方法

三菱GOT2000人机界面设置用户报警和系统报警弹出报警显示的具体方法 弹出报警显示功能可以将用户报警、系统报警直接显示再各窗口上起到提示作用,在不切换窗口的情况下直观的提示客户当前设备报警信息。 该功能可以实现将当前发生的用户和系统报警,显示在各个窗口的指定位置(…

Springboot整合Jasypt实战

Springboot整合Jasypt实战 引入依赖 <dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.5</version> </dependency>配置jasypt # 配置jasypt相关信息…

PowerShell系列(一):PowerShell介绍和cmd命令行的区别

目录 1、cmd命令行窗口有哪些缺点呢&#xff1f; 2、PowerShell的产生 3、PowerShell优点 4、PowerShell使用场景 什么是Windows系统的命令行环境&#xff0c;之前我们在使用XP、Win7系统的时候&#xff0c;用的最多的就是微软官方自带的cmd命令窗口了&#xff0c;我们通过敲命…

面向万物智联的应用框架的思考和探索(下)

原文&#xff1a;面向万物智联的应用框架的思考和探索&#xff08;下&#xff09;&#xff0c;点击链接查看更多技术内容。 应用框架&#xff0c;是操作系统连接开发者生态&#xff0c;实现用户体验的关键基础设施。其中&#xff0c;开发效率和运行体验是永恒的诉求&#xff0c…

导轨式传感器差分信号转换模块隔离放大变送器0-±10mV/0-±20mV转0-10V/4-20mA

概述&#xff1a; DIN11 IPO 压力应变桥信号处理系列隔离放大器是一种将差分输入信号隔离放大、转换成按比例输出的直流信号导轨安装变送模块。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等行业。此系列模块内部嵌入了一个高效微功率的电源&#xff0c;向输…

Android+opencv实时人脸与人眼检测案例分享

软件版本&#xff1a; Android Studio Electric Eel 2022.1.1 Patch 2 https://sourceforge.net/projects/opencvlibrary/files/4.5.0/opencv-4.5.0-android-sdk.zip/download 创建工程并导入opencv sdk: 导入opencv sdk: File->New->Import Module 添加工程依赖&am…

如何利用超融合提升制造业开发测试效率 [附用户案例]

进入数字时代&#xff0c;越来越多的制造业企业正在通过自主研发的方式加速应用创新。由于研发效率在很大程度上取决于支持开发测试的服务器、存储等 IT 基础设施的性能&#xff0c;企业需要简单、灵活、高性能的 IT 基础架构&#xff0c;来为研发团队提供资源共享与快速交付支…

Windows微信可以上网但是浏览器却用不了网络如何解决

1、清除DNS缓存。这个主要用于某些网站打不开的情形。 首先同时按WINDOWSR键&#xff0c;在弹出窗口输入CMD&#xff0c;然后回车。 在弹出的命令提示符中输入ipconfig /flushdns&#xff0c;然后回车。 2、重置winsock目录&#xff0c;在命令提示符中输入netsh winsock reset&…

go读request.Body内容踩坑记

go读request.Body内容踩坑记 踩坑代码如下&#xff0c;当时是想获取body传过来的json func demo(c *httpserver.Context) {type ReqData struct {Id int json:"id" validate:"required" schema:"id"Title string json:"…

【LeetCode】-66. 加一

1. 题目 66. 加一 给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外&#xff0c;这个整数不会以零开头。 2. 示例 输入&#xff1a;dig…