FPGA实现HDMI输入转SDI视频输出,提供4套工程源码和技术支持

目录

  • 1、前言
    • 免责声明
  • 2、我目前已有的SDI编解码方案
  • 3、设计思路框架核模块解析
    • 设计框图
    • IT6802解码芯片配置及采集
    • ADV7611解码芯片配置及采集
    • silicon9011解码芯片配置及采集
    • 纯verilog的HDMI 解码模块
    • RGB888转YUV422
    • SPMTE编码
    • SDI模式
    • 图像缓存
    • SPMTE SDI
    • GTX
    • GV8500
  • 4、vivado工程1-->IT6802采集SDI输出
  • 5、vivado工程2-->ADV7611采集SDI输出
  • 6、vivado工程3-->silicon9011采集SDI输出
  • 7、vivado工程4-->HDMI RTL解码SDI输出
  • 8、工程移植说明
    • vivado版本不一致处理
    • FPGA型号不一致处理
    • 其他注意事项
  • 9、上板调试验证并演示
    • 准备工作
    • 输出演示
  • 10、福利:工程代码的获取

FPGA实现HDMI输入转SDI视频输出,提供4套工程源码和技术支持

1、前言

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

没玩过SDI都不好意思说自己玩儿过FPGA,这是CSDN某大佬说过的一句话,鄙人深信不疑。。。本文使用Xilinx的Kintex7 FPGA实现HDMI转SDI视频输出;提供3套vivado2019.1版本的工程源码,4套工程的不同点在于输入HDMI视频解码方式的不同,以适应不同的FPGA开发板。第一套工程使用IT6802解码输入的HDMI视频,适应板载IT6802解码芯片的FPGA开发板;第二套工程使用ADV7611解码输入的HDMI视频,适应板载ADV7611解码芯片的FPGA开发板;第三套工程使用silicon9011解码输入的HDMI视频,适应板载silicon9011解码芯片的FPGA开发板;第四套工程使用纯verilog实现的HDMI解码模块解码输入的HDMI视频,适应没有板载HDMI解码芯片只有HDMI输入接口的FPGA开发板;四套工程列表如下:

_______________________________________________________________
|vivado工程    | 第一套工程 | 第二套工程 | 第三套工程 | 第四套工程 |
|vivado版本    |  2019.1   |   2019.1  |   2019.1  |   2019.1  |
|HDMI解码芯片  |   IT6802  |  ADV7611  |silicon9011||
|HDMI解码方式  |  硬件解码  |  硬件解码 |  硬件解码  | RTL模块解码 |
|输入视频      |   HDMI    |    HDMI   |   HDMI    |    HDMI    |
|HDMI解码后视频|   RGB888  |    RGB888 |   RGB888  |    RGB888  |
|输出视频      |    SDI    |    SDI    |    SDI    |    SDI    |
_______________________________________________________________

使用笔记本电脑模拟HDMI输入视频,分辨率为1920X1080@60Hz,FPGA首先用纯verilog实现的i2c控制器配置HDMI解码芯片(第四套工程除外),FPGA采集HDMI输入解码后的RGB888数据,经过RGB888转YUV422模块输出YUV422视频,再经过SPMTE编码模块将YUV422视频数据加上SDI数据帧头、帧尾以及控制信息等组成数据包,此时,原有的视频时序已经被打乱,需要将视频缓存致DDR3中,所以先将视频写入DDR3,然后读出送入Xilinx官方的SPMTE SDI IP核做SDI数据编码,同时需要输入SDI模式,该模块也包含在代码中,从SPMTE SDI IP核输出的已是标准SDI并行视频,最后调用GTX原语将SDI并行视频进行高速串行编码发送,为了保证数据的可靠性,在FPGA开发板需配套一颗GV8500以增强驱动,当然换其他IC也可以做到,最后通过板载的BNC接口将SDI视频发送出去。

本文详细描述了FPGA实现HDMI转SDI视频输出的实现设计方案,工程代码编译通过后上板调试验证,文章末尾有演示视频,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字成像和图像传输领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;
关于SDI的理论知识部分,可自行搜索一下,很多大佬讲得很详细,也可以参考我之前写的文章点击查看:SDI理论

免责声明

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

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

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

3、设计思路框架核模块解析

提供3套vivado2019.1版本的工程源码,4套工程的不同点在于输入HDMI视频解码方式的不同,以适应不同的FPGA开发板。第一套工程使用IT6802解码输入的HDMI视频,适应板载IT6802解码芯片的FPGA开发板;第二套工程使用ADV7611解码输入的HDMI视频,适应板载ADV7611解码芯片的FPGA开发板;第三套工程使用silicon9011解码输入的HDMI视频,适应板载silicon9011解码芯片的FPGA开发板;第四套工程使用纯verilog实现的HDMI解码模块解码输入的HDMI视频,适应没有板载HDMI解码芯片只有HDMI输入接口的FPGA开发板;四套工程列表如下:

设计框图

第一套工程设计框架如下:
FPGA实现HDMI输入转SDI视频输出,提供4套工程源码和技术支持_第1张图片
第二套工程设计框架如下:
FPGA实现HDMI输入转SDI视频输出,提供4套工程源码和技术支持_第2张图片
第三套工程设计框架如下:
FPGA实现HDMI输入转SDI视频输出,提供4套工程源码和技术支持_第3张图片
第四套工程设计框架如下:
FPGA实现HDMI输入转SDI视频输出,提供4套工程源码和技术支持_第4张图片

IT6802解码芯片配置及采集

第一套工程使用IT6802解码输入的HDMI视频,适应板载IT6802解码芯片的FPGA开发板;IT6802解码芯片需要i2c配置才能使用,关于IT6802解码芯片的配置和使用,请参考我往期的博客,博客地址:点击直接前往
IT6802解码芯片配置及采集这两部分均用verilog代码模块实现,代码中配置为1920x1080分辨率;代码位置如下:
在这里插入图片描述

ADV7611解码芯片配置及采集

第二套工程使用ADV7611解码输入的HDMI视频,适应板载ADV7611解码芯片的FPGA开发板;ADV7611解码芯片需要i2c配置才能使用,ADV7611解码芯片配置及采集这两部分均用verilog代码模块实现,代码中配置为1920x1080分辨率;代码位置如下:
在这里插入图片描述

silicon9011解码芯片配置及采集

第三套工程使用silicon9011解码输入的HDMI视频,适应板载silicon9011解码芯片的FPGA开发板;silicon9011解码芯片需要i2c配置才能使用,关于silicon9011解码芯片的配置和使用,请参考我往期的博客,博客地址:点击直接前往
silicon9011解码芯片配置及采集这两部分均用verilog代码模块实现,代码位置如下:
FPGA实现HDMI输入转SDI视频输出,提供4套工程源码和技术支持_第5张图片

纯verilog的HDMI 解码模块

第四套工程使用纯verilog实现的HDMI解码模块解码输入的HDMI视频,适应没有板载HDMI解码芯片只有HDMI输入接口的FPGA开发板;模块输入为差分HDMI视频,输出为RGB888的VGA视频,并伴随解码的像素时钟、行同步信号、场同步信号以及数据有效信号;此外,该模块还有配套的EDID模块,负责和输入源协商视频分辨率等基本信息,通过i2c接口与外接通信,IDED信息是固定的十六进制文件,例化了ROM用来存储,上电自动加载;该模块最高只支持1920x1080@60Hz分辨率的输入视频解码,更高的2K、4K暂不支持;代码位置如下:
FPGA实现HDMI输入转SDI视频输出,提供4套工程源码和技术支持_第6张图片

RGB888转YUV422

这个模块很简单, RGB888进YUV422出,十几行代码的事儿,不必多讲,采用纯verilog代码实现,代码位置如下:
在这里插入图片描述

SPMTE编码

SPMTE编码模块将YUV422视频数据加上SDI数据帧头、帧尾以及控制信息等组成数据包,此时,原有的视频时序已经被打乱,代码位置和核心代码部分如下:
在这里插入图片描述
FPGA实现HDMI输入转SDI视频输出,提供4套工程源码和技术支持_第7张图片

SDI模式

这个模块根据输入的HDMI视频分辨率来选择不同的SDI模式,这个信号会给到后面的Xilinx官方的SPMTE SDI IP核使用,根据Xilinx官方手册,SDI发送模式如下:
FPGA实现HDMI输入转SDI视频输出,提供4套工程源码和技术支持_第8张图片
代码中体现如下:
FPGA实现HDMI输入转SDI视频输出,提供4套工程源码和技术支持_第9张图片
代码位置如下:
在这里插入图片描述

图像缓存

由于原有的输入视频时序已经被打乱,所以输入图像必须经DDR缓存,调用Xilinx官方的MIG 核FIFO IP核,将DDR的用户接口封装为FIFO读写模式,方便用户使用,将图像缓存进DDR3中做4帧缓存,如果你觉得延时太高了,可以改为缓存2帧,DDR3地址读写部分如下:
在这里插入图片描述
图像缓存代码位置如下:
FPGA实现HDMI输入转SDI视频输出,提供4套工程源码和技术支持_第10张图片

SPMTE SDI

调用Xilinx官方的SPMTE SDI IP核做SDI数据编码,同时需要输入SDI模式,该模块也包含在代码中,从SPMTE SDI IP核输出的已是标准SDI并行视频,SPMTE SDI IP是Xilinx提供的专门用于SDI视频编解码的IP,可以免费试用,这里调用该IP,并添加了一些用户代码,代码位置如下:
FPGA实现HDMI输入转SDI视频输出,提供4套工程源码和技术支持_第11张图片

GTX

调用GTX原语将SDI并行视频进行高速串行编码发送,为了达到GTX变速的目的,这里没有调用GTX IP,而是直接调用其原语实现,需要读者对GTX有较深的理解,代码位置如下:
FPGA实现HDMI输入转SDI视频输出,提供4套工程源码和技术支持_第12张图片
这里对GTX的时钟有严格要求,必须使用一对148.5 MHz和一对148.35 MHz的时钟作为参考时钟,否则运行不了SDI视频解码;原理图如下:
FPGA实现HDMI输入转SDI视频输出,提供4套工程源码和技术支持_第13张图片

GV8500

为了保证数据的可靠性,在FPGA开发板需配套一颗GV8500以增强驱动,当然换其他IC也可以做到,最后通过板载的BNC接口将SDI视频发送出去。原理图如下:
FPGA实现HDMI输入转SDI视频输出,提供4套工程源码和技术支持_第14张图片

4、vivado工程1–>IT6802采集SDI输出

开发板FPGA型号:Xilinx–Kintex7–xc7k325tffg676-2;
开发环境:Vivado2019.1;
输入:笔记本电脑输出模拟HDMI视频输入,分辨率1920x1080@60Hz,IT6802解码;
输出:SDI;
应用:FPGA实现HDMI转SDI视频输出
工程代码架构如下:
FPGA实现HDMI输入转SDI视频输出,提供4套工程源码和技术支持_第15张图片
综合编译完成后的FPGA资源消耗和功耗预估如下:
FPGA实现HDMI输入转SDI视频输出,提供4套工程源码和技术支持_第16张图片

5、vivado工程2–>ADV7611采集SDI输出

开发板FPGA型号:Xilinx–Kintex7–xc7k325tffg676-2;
开发环境:Vivado2019.1;
输入:笔记本电脑输出模拟HDMI视频输入,分辨率1920x1080@60Hz,ADV7611解码;
输出:SDI;
应用:FPGA实现HDMI转SDI视频输出
工程代码架构如下:
FPGA实现HDMI输入转SDI视频输出,提供4套工程源码和技术支持_第17张图片
综合编译完成后的FPGA资源消耗和功耗预估如下:
FPGA实现HDMI输入转SDI视频输出,提供4套工程源码和技术支持_第18张图片

6、vivado工程3–>silicon9011采集SDI输出

开发板FPGA型号:Xilinx–Kintex7–xc7k325tffg676-2;
开发环境:Vivado2019.1;
输入:笔记本电脑输出模拟HDMI视频输入,分辨率1920x1080@60Hz,silicon9011解码;
输出:SDI;
应用:FPGA实现HDMI转SDI视频输出
工程代码架构如下:
FPGA实现HDMI输入转SDI视频输出,提供4套工程源码和技术支持_第19张图片
综合编译完成后的FPGA资源消耗和功耗预估如下:
FPGA实现HDMI输入转SDI视频输出,提供4套工程源码和技术支持_第20张图片

7、vivado工程4–>HDMI RTL解码SDI输出

开发板FPGA型号:Xilinx–Kintex7–xc7k325tffg676-2;
开发环境:Vivado2019.1;
输入:笔记本电脑输出模拟HDMI视频输入,分辨率1920x1080@60Hz,HDMI RTL模块解码;
输出:SDI;
应用:FPGA实现HDMI转SDI视频输出
工程代码架构如下:
FPGA实现HDMI输入转SDI视频输出,提供4套工程源码和技术支持_第21张图片
综合编译完成后的FPGA资源消耗和功耗预估如下:
FPGA实现HDMI输入转SDI视频输出,提供4套工程源码和技术支持_第22张图片

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、上板调试验证并演示

准备工作

你需要有以下装备才能移植并测试该工程代码:
1:笔记本电脑
2:FPGA开发板;
3:板载的HDMI输入接口和SDI输出接口;
4:SDI转HDMI盒子;
5:HDMI显示,要求分辨率支持1920x1080;
测试平台框图如下:
在这里插入图片描述
我用的SDI转HDMI盒子如下,某宝有卖:
FPGA实现HDMI输入转SDI视频输出,提供4套工程源码和技术支持_第23张图片

输出演示

输出演示如下:
FPGA实现HDMI输入转SDI视频输出,提供4套工程源码和技术支持_第24张图片

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

福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
网盘资料如下:
FPGA实现HDMI输入转SDI视频输出,提供4套工程源码和技术支持_第25张图片

你可能感兴趣的:(FPGA编解码SDI视频专题,菜鸟FPGA图像处理专题,fpga开发,音视频,SDI,HDMI,GTX)