FPGA实现SDI视频接收转USB3.0传输,GS2971+FT601方案,提供4套工程源码和QT上位机源码

目录

FPGA实现SDI视频接收转USB3.0传输,GS2971+FT601方案,提供4套工程源码和QT上位机源码

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开发板、工程源码等等。本设计采用GS2971芯片方案实现SDI视频解码;

目前USB3.0的实现方案很多,但就简单好用的角度而言,FT601应该是最佳方案,因为它电路设计简单,操作时序简单,软件驱动简单,官方甚至提供了包括FPGA驱动在内的丰富的驱动源码和测试软件;本设计旨在普及传播FT601芯片在FPGA领域实现USB3.0通信应用,包括FT601芯片解读、FT601芯片读写时序分析、FT601芯片硬件电路参考设计、FT601与PC端的QT上位机通信,包括FT601测速试验、FT601视频采集传输试验、FT601视频采集+图像处理后传输试验等等;本设计采用FT601芯片方案实现USB3.0图传方案;

工程概述

本设计基于GS2971+FT601架构实现FPGA的SDI视频接收转USB3.0传输,输入源为一个3G-SDI相机,也可以使用SD-SDI或者DH-SDI相机,因为本设计是三种SDI视频自适应的;同轴的SDI视频通过同轴线连接到GS2971转接板,GS2971解码芯片将同轴的串行的SDI视频解码为并行的BT1120格式视频;然后使用纯Verilog代码实现的BT1120转RGB888模块实现BT1120视频到RGB888的转换;然后使用本博常用的FDMA图像缓存架构实现图像3帧缓存,缓存介质为板载的DDR3/4;然后由FT601读写逻辑控制视频从DDR3/4中读出;FT601使用同步FIFO-245模式,工作模式通过GPIO0/GPIO1引脚配置;根据FT601读写时序设计了读写状态机;在PC端QT上位机控制下,FT601读写逻辑产生从DDR3/4中读取视频的控制信号,并将读出的视频通过FT601写数据总线发送到板载的FT601芯片;FPGA开发板通过USB3.0数据线连接至PC端主机;PC端的QT上位机调用FT601驱动的API实现图像读取并显示视频;由此形成外接3G-SDI相机+FPGA+FT601+QT上位机的珠联璧合;针对市面上主流的FPGA,本博客提供4套工程源码,具体如下:

现对上述4套工程源码做如下解释,方便读者理解:

工程源码1

开发板FPGA型号为Xilinx-->Kintex7--35T--xc7k325tffg900-2;输入源为3G-SDI相机,分辨率为1920x1080@60Hz,也可以使用SD-SDI或者DH-SDI相机,因为本设计是三种SDI视频自适应的;同轴的SDI视频通过同轴线连接到GS2971转接板,GS2971解码芯片将同轴的串行的SDI视频解码为并行的BT1120格式视频;然后使用纯Verilog代码实现的BT1120转RGB888模块实现BT1120视频到RGB888的转换;然后使用本博常用的FDMA图像缓存架构实现图像3帧缓存,缓存介质为板载的DDR3;然后由FT601读写逻辑控制视频从DDR3中读出;FT601使用同步FIFO-245模式,工作模式通过GPIO0/GPIO1引脚配置;根据FT601读写时序设计了读写状态机;在PC端QT上位机控制下,FT601读写逻辑产生从DDR3中读取视频的控制信号,并将读出的视频通过FT601写数据总线发送到板载的FT601芯片;FPGA开发板通过USB3.0数据线连接至PC端主机;PC端的QT上位机调用FT601驱动的API实现图像读取并显示视频;由此形成外接3G-SDI相机+FPGA+FT601+QT上位机的珠联璧合;Vivado工程和QT工程均提供源码;本工程适用于FPGA实现SDI视频接收转USB3.0传输;

工程源码2

开发板FPGA型号为Xilinx-->Zynq7100--xc7z100ffg900-2;输入源为3G-SDI相机,分辨率为1920x1080@60Hz,也可以使用SD-SDI或者DH-SDI相机,因为本设计是三种SDI视频自适应的;同轴的SDI视频通过同轴线连接到GS2971转接板,GS2971解码芯片将同轴的串行的SDI视频解码为并行的BT1120格式视频;然后使用纯Verilog代码实现的BT1120转RGB888模块实现BT1120视频到RGB888的转换;然后使用本博常用的FDMA图像缓存架构实现图像3帧缓存,缓存介质为板载的DDR3;然后由FT601读写逻辑控制视频从DDR3中读出;FT601使用同步FIFO-245模式,工作模式通过GPIO0/GPIO1引脚配置;根据FT601读写时序设计了读写状态机;在PC端QT上位机控制下,FT601读写逻辑产生从DDR3中读取视频的控制信号,并将读出的视频通过FT601写数据总线发送到板载的FT601芯片;FPGA开发板通过USB3.0数据线连接至PC端主机;PC端的QT上位机调用FT601驱动的API实现图像读取并显示视频;由此形成外接3G-SDI相机+FPGA+FT601+QT上位机的珠联璧合;Vivado工程和QT工程均提供源码;本工程适用于FPGA实现SDI视频接收转USB3.0传输;

工程源码3

开发板FPGA型号为Xilinx-->Kintex UltraScale--xcku040-ffva1156-2-i;输入源为3G-SDI相机,分辨率为1920x1080@60Hz,也可以使用SD-SDI或者DH-SDI相机,因为本设计是三种SDI视频自适应的;同轴的SDI视频通过同轴线连接到GS2971转接板,GS2971解码芯片将同轴的串行的SDI视频解码为并行的BT1120格式视频;然后使用纯Verilog代码实现的BT1120转RGB888模块实现BT1120视频到RGB888的转换;然后使用本博常用的FDMA图像缓存架构实现图像3帧缓存,缓存介质为板载的DDR4;然后由FT601读写逻辑控制视频从DDR4中读出;FT601使用同步FIFO-245模式,工作模式通过GPIO0/GPIO1引脚配置;根据FT601读写时序设计了读写状态机;在PC端QT上位机控制下,FT601读写逻辑产生从DDR4中读取视频的控制信号,并将读出的视频通过FT601写数据总线发送到板载的FT601芯片;FPGA开发板通过USB3.0数据线连接至PC端主机;PC端的QT上位机调用FT601驱动的API实现图像读取并显示视频;由此形成外接3G-SDI相机+FPGA+FT601+QT上位机的珠联璧合;Vivado工程和QT工程均提供源码;本工程适用于FPGA实现SDI视频接收转USB3.0传输;

工程源码4

开发板FPGA型号为Xilinx-->Kintex UltraScale--xcku060-ffva1156-2-i;输入源为3G-SDI相机,分辨率为1920x1080@60Hz,也可以使用SD-SDI或者DH-SDI相机,因为本设计是三种SDI视频自适应的;同轴的SDI视频通过同轴线连接到GS2971转接板,GS2971解码芯片将同轴的串行的SDI视频解码为并行的BT1120格式视频;然后使用纯Verilog代码实现的BT1120转RGB888模块实现BT1120视频到RGB888的转换;然后使用本博常用的FDMA图像缓存架构实现图像3帧缓存,缓存介质为板载的DDR4;然后由FT601读写逻辑控制视频从DDR4中读出;FT601使用同步FIFO-245模式,工作模式通过GPIO0/GPIO1引脚配置;根据FT601读写时序设计了读写状态机;在PC端QT上位机控制下,FT601读写逻辑产生从DDR4中读取视频的控制信号,并将读出的视频通过FT601写数据总线发送到板载的FT601芯片;FPGA开发板通过USB3.0数据线连接至PC端主机;PC端的QT上位机调用FT601驱动的API实现图像读取并显示视频;由此形成外接3G-SDI相机+FPGA+FT601+QT上位机的珠联璧合;Vivado工程和QT工程均提供源码;本工程适用于FPGA实现SDI视频接收转USB3.0传输;

免责声明

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

2、相关方案推荐

本博已有的 SDI 编解码方案

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

本博已有的FPGA驱动USB通信方案

我的博客主页开设有FPGA驱动USB通信专栏,里面全是FPGA驱动USB通信的工程源码及博客介绍;既有基于USB2.0也有USB3.0方案;包括USB2.0/3.0测速试验、USB2.0/3.0视频采集传输试验、USB2.0/3.0视频采集+图像处理后传输试验等等;所有工方案均包括FPGA工程和QT上位机源码;专栏地址链接如下:
点击直接前往

FPGA基于GS2971的SDI视频解码方案

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

FPGA基于FT601的USB3.0视频传输方案

FPGA基于FT601的USB3.0视频传输,详细设计方案请参考我专门的博客,博客链接如下:
点击直接前往

3、详细设计方案

设计原理框图

设计原理框图如下:

SDI 相机

我用到的是SDI相机为HD-SDI相机,输出分辨率为1920x1080@30Hz,本工程对SDI相机的选择要求范围很宽,可以是SD-SDI、HD-SDI、3G-SDI,因为很设计对这三种SDI视频是自动识别并自适应的;SDI相机相对比较贵,预算有限的朋友可以考虑用HDMI转SDI盒子模拟SDI相机,这种盒子某宝一百块左右;当使用HDMI转SDI盒子时,输入源可以用笔记本电脑,即用笔记本电脑通过HDMI线连接到HDMI转SDI盒子的HDMI输入接口,再用SDI线连接HDMI转SDI盒子的SDI输出接口到FPGA开发板,如下:

GS2971-SDI解码芯片解读

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

BT1120转RGB888

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

图像缓存

图像缓存方案采用自研的FDMA图像缓存架构,缓存介质为DDR3/4;FDMA图像缓存架构由FDMA、FDMA控制器、缓存帧选择器构成;图像缓存使用Xilinx vivado的Block Design设计,如下图:

关于FDMA更详细的介绍,请参考我之前的博客,博文链接如下:
点击直接前往

FT601-USB3.0芯片解读

FT600/601Q 的技术参数如下:

FT600&601Q 芯片是 FT 最新推出的 USB3.0 to FIFO interface IC,实现 USB3.0 与 16/32bit 并行 IO 接口之间的数据传输;整个 USB 通信协议全部由芯片驱动自行完成,开发者无须考虑 USB 底层固件的编程。

-->兼容支持 USB3.0(5Gbps),向下兼容 USB2.0(480Mbps and 12Mbps)传输;

-->高达 8 个可配置 Endpoint. >>支持 2 种 FIFO 传输协议,最大传输可达 400MB/s;

-->芯片内部有 16K 字节的缓冲区,可以进行数据的大吞吐量操作;

-->支持远程唤醒功能;

-->芯片支持多种 IO 电压:1.8V,2.5V.3.3V;

-->通过 16bit D[O:15]或 32bit D[0:31]并行数据线和读写状态/控制线 RXF、TXE、RD、WR,加上时钟 CLK,使能 OE 信号线就可实现与 CPU/FPGA 的数据交换;

-->该芯片内部集成 1.0V LDO,可提供给芯片核心部分使用;

-->工业级芯片,工作温度范围-40 to 85℃;

FT601芯片框架如下:

FT601外围电路设计参考如下:

FT601支持的多种传输模式,其中 245 Synchronous FIFO 模式和 Multi-Channel FIFO 模式是最常用的模式,本工程配置为 245 Synchronous FIFO 模式;传输模式通过GPIO引脚高低电平配置,配置真值表如下:

FT601读时序解读:

FT601的245 Synchronous FIFO 模式读时序如下:

RXF_N为读数据状态信号,RXF_N为低电平期间FPGA可以读取FT601数据;

检测到RXF_N低电平后,拉低OE_N和RD_N,然后开始读数据;

检测到RXF_N高电平后,拉高OE_N和RD_N,然后退出读数据状态;

FT601写时序解读:

FT601的245 Synchronous FIFO 模式写时序如下:

TXF_N为读数据状态信号,RXF_N为低电平期间FPGA向FT601写入数据;

检测到TXF_N低电平后,拉低WR_N,然后开始向FT601写入数据;

检测到TXF_N高电平后,拉高WR_N,然后退出写数据状态;

FT601-USB3.0读写逻辑

根据FT601读写时序,设计了数据读写状态机,一共分为三个状态,分别为初始状态、读数据状态、写数据状态;状态机的触发由PC端的QT上位机开启;在PC端QT上位机控制下,FT601读写逻辑产生从DDR3中读取视频的控制信号,并将读出的视频通过FT601写数据总线发送到板载的FT601芯片;PC端的QT上位机调用FT601驱动的API实现图像读取并显示视频;顶层代码接口如下:

QT上位机

QT开发环境为QT上位机本方案使用 VS2015 + Qt 5.12.10;QT上位机实现发起FT601的读写操作,QT上位机调用FT601驱动的API实现图像读取并显示视频;QT上位机运行如下:

工程源码架构

本博客提供4套工程源码,以工程源码1为例,vivado Block Design设计如下,其他工程与之类似,Block Design设计为图像缓存架构的部分:

本博客提供4套Vivado工程源码,以工程源码1为例,综合后的代码架构如下,其他工程与之类似:

对于Zynq的工程,FDMA图像缓存架构虽然不需要SDK配置,但FDMA的AXI4接口时钟由Zynq提供,所以需要运行SDK程序才能启动Zynq,从而为PL端逻辑提供时钟;由于不需要SDK配置,所以SDK软件代码就变得极度简单,只需运行一个"Hello World"即可,如下:

QT代码如下:

4、工程源码1详解-->Kintex7--35T版本

开发板FPGA型号:Xilinx--Kintex7--35T--xc7k325tffg900-2;

FPGA开发环境:Vivado2019.1;

QT开发环境:VS2015 + Qt 5.12.10;

输入:3G-SDI相机或HDMI转SDI盒子,分辨率1920x1080@60Hz;

输出:USB3.0,分辨率1920x1080@60Hz;

SDI视频解码方案:GS2971芯片方案;

USB3.0图传方案:FT601芯片方案;

缓存方案:自研FDMA方案;

缓存介质:DDR3;

实现功能:FPGA实现SDI视频接收转USB3.0传输;

工程作用:此工程目的是让读者掌握FPGA实现SDI视频接收转USB3.0传输的设计能力,以便能够移植和设计自己的项目;

工程Block Design和工程代码架构请参考第3章节的《工程源码架构》小节内容;

工程的资源消耗和功耗如下:

5、工程源码2详解-->Zynq7100版本

开发板FPGA型号:Xilinx--Zynq7100--xc7z100ffg900-2;

FPGA开发环境:Vivado2019.1;

QT开发环境:VS2015 + Qt 5.12.10;

输入:3G-SDI相机或HDMI转SDI盒子,分辨率1920x1080@60Hz;

输出:USB3.0,分辨率1920x1080@60Hz;

SDI视频解码方案:GS2971芯片方案;

USB3.0图传方案:FT601芯片方案;

缓存方案:自研FDMA方案;

缓存介质:DDR3;

实现功能:FPGA实现SDI视频接收转USB3.0传输;

工程作用:此工程目的是让读者掌握FPGA实现SDI视频接收转USB3.0传输的设计能力,以便能够移植和设计自己的项目;

工程Block Design和工程代码架构请参考第3章节的《工程源码架构》小节内容;

工程的资源消耗和功耗如下:

6、工程源码3详解-->KU040版本

开发板FPGA型号:Xilinx--Kintex UltraScale--xcku040-ffva1156-2-i;

FPGA开发环境:Vivado2019.1;

QT开发环境:VS2015 + Qt 5.12.10;

输入:3G-SDI相机或HDMI转SDI盒子,分辨率1920x1080@60Hz;

输出:USB3.0,分辨率1920x1080@60Hz;

SDI视频解码方案:GS2971芯片方案;

USB3.0图传方案:FT601芯片方案;

缓存方案:自研FDMA方案;

缓存介质:DDR4;

实现功能:FPGA实现SDI视频接收转USB3.0传输;

工程作用:此工程目的是让读者掌握FPGA实现SDI视频接收转USB3.0传输的设计能力,以便能够移植和设计自己的项目;

工程Block Design和工程代码架构请参考第3章节的《工程源码架构》小节内容;

工程的资源消耗和功耗如下:

7、工程源码4详解-->KU060版本

开发板FPGA型号:Xilinx--Kintex UltraScale--xcku060-ffva1156-2-i;

FPGA开发环境:Vivado2019.1;

QT开发环境:VS2015 + Qt 5.12.10;

输入:3G-SDI相机或HDMI转SDI盒子,分辨率1920x1080@60Hz;

输出:USB3.0,分辨率1920x1080@60Hz;

SDI视频解码方案:GS2971芯片方案;

USB3.0图传方案:FT601芯片方案;

缓存方案:自研FDMA方案;

缓存介质:DDR4;

实现功能:FPGA实现SDI视频接收转USB3.0传输;

工程作用:此工程目的是让读者掌握FPGA实现SDI视频接收转USB3.0传输的设计能力,以便能够移植和设计自己的项目;

工程Block Design和工程代码架构请参考第3章节的《工程源码架构》小节内容;

工程的资源消耗和功耗如下:

8、工程移植说明

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

9、上板调试验证

准备工作

需要准备的器材如下:

FPGA开发板;

SDI相机或者HDMI转SDI盒子;

FT601转接板(FPGA开发板板载FT601除外);

笔记本电脑或者PC主机;

USB3.0数据线;

我的开发板连接如下:

FT601驱动安装

注意:驱动只需要安装一次即可;

首先下载bit到FPGA开发板,如下:

然后打开PC端-->我的电脑-->管理-->设备管理器,可以看到FT601设备已经识别,如下:

如果你已经下载了FT601驱动文件,但没有安装,则有的电脑会自动寻找驱动并自定安装,所以等待大约1分钟后,电脑自动帮我们装好了FT601驱动,如下:

如果你的电脑不能自动寻找驱动并安装,请手动安装驱动,如下:

输出视频演示

首先打开QT上位机,位置如下:

打开QT界面如下,需要将显示分辨率设置为1920x1080:

以工程源码2为例,动态输出如下:

SDI-USB3.0

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

福利:工程代码的获取

代码太大,无法邮箱发送,以某度网盘链接方式发送,

资料获取方式:私,或者文章末尾的V名片。

网盘资料如下:

此外,有很多朋友给本博主提了很多意见和建议,希望能丰富服务内容和选项,因为不同朋友的需求不一样,所以本博主还提供以下服务:

相关推荐
华清远见IT开放实验室4 小时前
【项目案例】物联网比较好的10+练手项目推荐,附项目文档/源码/视频
物联网·音视频
一口一口吃成大V4 小时前
FPGA随记——FPGA时序优化小经验
fpga开发
贾saisai5 小时前
Xilinx系FPGA学习笔记(九)DDR3学习
笔记·学习·fpga开发
锦亦之22339 小时前
QT+OSG+OSG-earth如何在窗口显示一个地球
开发语言·qt
redcocal9 小时前
地平线秋招
python·嵌入式硬件·算法·fpga开发·求职招聘
柳鲲鹏12 小时前
编译成功!QT/6.7.2/Creator编译Windows64 MySQL驱动(MinGW版)
开发语言·qt·mysql
三玖诶12 小时前
如何在 Qt 的 QListWidget 中逐行添加和显示数据
开发语言·qt
小东来16 小时前
电脑端视频剪辑软件哪个好用,十多款剪辑软件分享
音视频
阳光开朗_大男孩儿18 小时前
DBUS属性原理
linux·服务器·前端·数据库·qt
cuijiecheng201818 小时前
音视频入门基础:AAC专题(8)——FFmpeg源码中计算AAC裸流AVStream的time_base的实现
ffmpeg·音视频·aac