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



    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    |
    _______________________________________________________________
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    使用笔记本电脑模拟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开发板;四套工程列表如下:

    设计框图

    第一套工程设计框架如下:
    在这里插入图片描述
    第二套工程设计框架如下:
    在这里插入图片描述
    第三套工程设计框架如下:
    在这里插入图片描述
    第四套工程设计框架如下:
    在这里插入图片描述

    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代码模块实现,代码位置如下:
    在这里插入图片描述

    纯verilog的HDMI 解码模块

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

    RGB888转YUV422

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

    SPMTE编码

    SPMTE编码模块将YUV422视频数据加上SDI数据帧头、帧尾以及控制信息等组成数据包,此时,原有的视频时序已经被打乱,代码位置和核心代码部分如下:
    在这里插入图片描述
    在这里插入图片描述

    SDI模式

    这个模块根据输入的HDMI视频分辨率来选择不同的SDI模式,这个信号会给到后面的Xilinx官方的SPMTE SDI IP核使用,根据Xilinx官方手册,SDI发送模式如下:
    在这里插入图片描述
    代码中体现如下:
    在这里插入图片描述
    代码位置如下:
    在这里插入图片描述

    图像缓存

    由于原有的输入视频时序已经被打乱,所以输入图像必须经DDR缓存,调用Xilinx官方的MIG 核FIFO IP核,将DDR的用户接口封装为FIFO读写模式,方便用户使用,将图像缓存进DDR3中做4帧缓存,如果你觉得延时太高了,可以改为缓存2帧,DDR3地址读写部分如下:
    在这里插入图片描述
    图像缓存代码位置如下:
    在这里插入图片描述

    SPMTE SDI

    调用Xilinx官方的SPMTE SDI IP核做SDI数据编码,同时需要输入SDI模式,该模块也包含在代码中,从SPMTE SDI IP核输出的已是标准SDI并行视频,SPMTE SDI IP是Xilinx提供的专门用于SDI视频编解码的IP,可以免费试用,这里调用该IP,并添加了一些用户代码,代码位置如下:
    在这里插入图片描述

    GTX

    调用GTX原语将SDI并行视频进行高速串行编码发送,为了达到GTX变速的目的,这里没有调用GTX IP,而是直接调用其原语实现,需要读者对GTX有较深的理解,代码位置如下:
    在这里插入图片描述
    这里对GTX的时钟有严格要求,必须使用一对148.5 MHz和一对148.35 MHz的时钟作为参考时钟,否则运行不了SDI视频解码;原理图如下:
    在这里插入图片描述

    GV8500

    为了保证数据的可靠性,在FPGA开发板需配套一颗GV8500以增强驱动,当然换其他IC也可以做到,最后通过板载的BNC接口将SDI视频发送出去。原理图如下:
    在这里插入图片描述

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

    开发板FPGA型号:Xilinx–Kintex7–xc7k325tffg676-2;
    开发环境:Vivado2019.1;
    输入:笔记本电脑输出模拟HDMI视频输入,分辨率1920x1080@60Hz,IT6802解码;
    输出:SDI;
    应用:FPGA实现HDMI转SDI视频输出
    工程代码架构如下:
    在这里插入图片描述
    综合编译完成后的FPGA资源消耗和功耗预估如下:
    在这里插入图片描述

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

    开发板FPGA型号:Xilinx–Kintex7–xc7k325tffg676-2;
    开发环境:Vivado2019.1;
    输入:笔记本电脑输出模拟HDMI视频输入,分辨率1920x1080@60Hz,ADV7611解码;
    输出:SDI;
    应用:FPGA实现HDMI转SDI视频输出
    工程代码架构如下:
    在这里插入图片描述
    综合编译完成后的FPGA资源消耗和功耗预估如下:
    在这里插入图片描述

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

    开发板FPGA型号:Xilinx–Kintex7–xc7k325tffg676-2;
    开发环境:Vivado2019.1;
    输入:笔记本电脑输出模拟HDMI视频输入,分辨率1920x1080@60Hz,silicon9011解码;
    输出:SDI;
    应用:FPGA实现HDMI转SDI视频输出
    工程代码架构如下:
    在这里插入图片描述
    综合编译完成后的FPGA资源消耗和功耗预估如下:
    在这里插入图片描述

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

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

    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盒子如下,某宝有卖:
    在这里插入图片描述

    输出演示

    输出演示如下:
    在这里插入图片描述

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

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

  • 相关阅读:
    DDoS攻击频发,科普防御DDoS攻击的几大有效方法
    Fluent计算出现“Floating point exception”时的解决办法
    【Try to Hack】Windows用户管理
    nodejs微信小程序-利康药房管理系统的设计与实现- 安卓-python-PHP-计算机毕业设计
    JVM 配置GC日志
    常用的在线工具网站
    原生JavaScript实现本地存储(localStorage)和会话存储(sessionStorage)
    零售经营“新赛道” ——基于手机银行APP专区调研的客群精细化运营分析报告
    1+x(Java)中级题库易混淆理论题(三)
    目标资产信息收集
  • 原文地址:https://blog.csdn.net/qq_41667729/article/details/133635726