FPGA高端项目:6G-SDI 视频编解码,提供工程源码和技术支持

目录

FPGA高端项目:6G-SDI 视频编解码,提供工程源码和技术支持

1、前言

Xilinx系列FPGA实现SDI视频编解码目前有两种方案:

一是使用专用编解码芯片,比如典型的接收器GS2971,发送器GS2972,优点是简单,比如GS2971接收器直接将SDI解码为并行的YCRCB,GS2972发送器直接将并行的YCRCB编码为SDI视频,缺点是成本较高,可以百度一下GS2971和GS2972的价格;另一种方案是使用FPGA实现编解码,利用FPGA的GTP/GTX/GTH/UltraScale GTH等资源实现解串,优点是合理利用了FPGA资源,缺点是操作难度大一些,对FPGA水平要求较高;UltraScale GTH 适用于Xilinx UltraScale系列的FPGA上,包括Virtex UltraScale、Kintex UltraScale、Zynq® UltraScale等器件,在UltraScale系列之下只有GTH,而UltraScale GTH相比于GTH,线速率更高,支持协议类型更多,功耗更低,带宽更高;同样的,Xilinx也提供了SDI视频编解码的专用IP,比如SMPTE UHD-SDI,该IP支持3G-SDI、6G-SDI、12G-SDI等视频编解码;

本文使用Xilinx的7系列Kintex7--xc7k325tffg676-2型号的FPGA实现6G-SDI 视频编解码;本设计分为6G-SDI 视频编码和6G-SDI 视频解码两部分,即6G-SDI 视频发送和接收,两个部分功能做在一个工程里;6G-SDI 视频接收过程为:输入摄像头为标准的6G-SDI摄像头,开发板板载GV8601A芯片,SDI视频经过GV8601A起到均衡EQ的作用,也可以理解为单端转差分;然后调用Xilinx官方GTX的GTXE2_CHANNEL原语和GTXE2_COMMON原语进行SDI视频解串,将高速串行的SDI视频解为并行数据,GTX选择QPLL时钟;然后调用Xilinx官方的SMPTE UHD-SDI IP核实现SDI视频解码,该IP在Kintex7器件上只支持3G-SDI和6G-SDI编解码,本设计配置为6G-SDI模式;到这里,6G-SDI 视频解码工作就完成了,解码后的视频为并行的TTL电平的数据,此时的解码数据送入ILA中观察,也可以供用户做后续处理,比如缓存、颜色转换、缩放、图像识别等,本设计不做处理,只将数据留出来,给开发者更多利用空间;6G-SDI 视频发送过程为:纯verilog实现的静态彩条作为视频源,然后调用Xilinx官方的SMPTE UHD-SDI IP核实现SDI视频编码,该IP在Kintex7器件上只支持3G-SDI和6G-SDI编解码,本设计配置为6G-SDI模式,这个过程是接收过程的逆过程;然后调用Xilinx官方GTX的GTXE2_CHANNEL原语进行SDI视频串化,将并行的SDI视频数据串化为高速串行数据,GTX选择CPLL时钟,这个过程是接收过程的逆过程;然后将视频信号送入板载的GV8500芯片,GV8500起到增强驱动的作用,也可以理解为差分转单端;我手里有一个SDI转HDMI的盒子,将输出的SDI视频接到盒子里,然后输出显示器即可输出显示了;本方案提供1套vivado2022.2版本的FPGA工程源码;

本博客详细描述了Xilinx的7系列Kintex7--xc7k325tffg676-2型号的FPGA实现6G-SDI 视频编解码的设计方案,工程代码可综合编译上板调试,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做学习提升,可应用于医疗、军工等行业的高速接口或图像处理领域;

提供完整的、跑通的工程源码和技术支持;

工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

免责声明

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

2、相关方案推荐

我这里已有的 GT 高速接口解决方案

我的主页有FPGA GT 高速接口专栏,该专栏有 GTP 、 GTX 、 GTH 、 GTY 等GT 资源的视频传输例程和PCIE传输例程,其中 GTP基于A7系列FPGA开发板搭建,GTX基于K7或者ZYNQ系列FPGA开发板搭建,GTH基于KU或者V7系列FPGA开发板搭建,GTY基于KU+系列FPGA开发板搭建;以下是专栏地址:
点击直接前往

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

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

3、设计思路和框架

本文使用Xilinx的7系列Kintex7--xc7k325tffg676-2型号的FPGA实现6G-SDI 视频编解码;本设计分为6G-SDI 视频编码和6G-SDI 视频解码两部分,即6G-SDI 视频发送和接收,两个部分功能做在一个工程里;6G-SDI 视频接收过程为:输入摄像头为标准的6G-SDI摄像头,开发板板载GV8601A芯片,SDI视频经过GV8601A起到均衡EQ的作用,也可以理解为单端转差分;然后调用Xilinx官方GTX的GTXE2_CHANNEL原语和GTXE2_COMMON原语进行SDI视频解串,将高速串行的SDI视频解为并行数据,GTX选择QPLL时钟;然后调用Xilinx官方的SMPTE UHD-SDI IP核实现SDI视频解码,该IP在Kintex7器件上只支持3G-SDI和6G-SDI编解码,本设计配置为6G-SDI模式;到这里,6G-SDI 视频解码工作就完成了,解码后的视频为并行的TTL电平的数据,此时的解码数据送入ILA中观察,也可以供用户做后续处理,比如缓存、颜色转换、缩放、图像识别等,本设计不做处理,只将数据留出来,给开发者更多利用空间;6G-SDI 视频发送过程为:纯verilog实现的静态彩条作为视频源,然后调用Xilinx官方的SMPTE UHD-SDI IP核实现SDI视频编码,该IP在Kintex7器件上只支持3G-SDI和6G-SDI编解码,本设计配置为6G-SDI模式,这个过程是接收过程的逆过程;然后调用Xilinx官方GTX的GTXE2_CHANNEL原语进行SDI视频串化,将并行的SDI视频数据串化为高速串行数据,GTX选择CPLL时钟,这个过程是接收过程的逆过程;然后将视频信号送入板载的GV8500芯片,GV8500起到增强驱动的作用,也可以理解为差分转单端;我手里有一个SDI转HDMI的盒子,将输出的SDI视频接到盒子里,然后输出显示器即可输出显示了;本方案提供1套vivado2022.2版本的FPGA工程源码;

设计框图

本设计参考了Xilinx官方设计文档,官方的参考设计框图如下:

具体到本工程详细设计方案框图如下:

GV8601A均衡EQ

6G-SDI 视频接收过程为:输入摄像头为标准的6G-SDI摄像头,开发板板载GV8601A芯片,SDI视频经过GV8601A起到均衡EQ的作用,也可以理解为单端转差分;原理图部分截图如下:

GTX 时钟要求

根据Xilinx推荐的硬件设计要求,GTX需要两路差分时钟,一路148.5M和一路148.351M,后者可以通过148.5M差分晶振匹配电阻得到;

GTX 调用与控制

然后调用Xilinx官方GTX的GTXE2_CHANNEL原语和GTXE2_COMMON原语进行SDI视频解串与串化,接收时为解串,发送时为串化,将高速串行的SDI视频解为并行数据,GTX选择QPLL时钟;代码位置截图如下:

需要注意的是,这里并没有直接例化GTX IP核,而是直接调用其GTXE2_CHANNEL和GTXE2_COMMON原语,需要开发者对GTX有着极高的熟练度,这里直接调用原语的目的是方便配置与复位,因为我们设计的GTX支持HD-SDI、3G-SDI和6G-SDI的解串与串化,每种输入的线速率不一样,所以需要控制GTX在不同输入状态下的线速率切换,线速率切换后,需要改变GTX内部状态机逻辑和复位才能使GTX在变速后工作稳定,GTX的变速和配置需严格按照官方数据手册时序进行,所以代码中有专门的GTX变速配置模块;代码中包含了GTXE2_CHANNEL和GTXE2_COMMON原语,分别对应GTX官方文档中的对应结构,GTXE2_CHANNEL负责具体的解串与串化,GTXE2_COMMON原语负责QPLL时钟配置,两者可通过GTX变速配置模块中的DRP进行动态配置;

SMPTE UHD-SDI

然后调用Xilinx官方的SMPTE UHD-SDI IP核实现SDI视频编解码,对于接收来说是解码,对于发送来说是编码;该IP在Kintex7器件上只支持3G-SDI和6G-SDI编解码,本设计配置为6G-SDI模式;代码位置截图如下:

IP配置如下:

SMPTE UHD-SDI IP调用简单,但使用相对复杂,用户接口众多,详情请参考官方数据手册,接口关系请参考,这里只做简单解读,如下:

根据官方手册,SMPTE UHD-SDI数据收发架构如下:

SMPTE UHD-SDI 接收

SMPTE UHD-SDI 接收端的框图如下:

来自串行收发器 RX 的数据通过 rx_data_in 端口进入 SMPTE UHD-SDI接收器,对于 SD、HD 和 3G 模式,每个时钟周期 20 位;对于 6G 和 12G 模式,每个时钟周期 40 位。在 SD 模式下,rx_data_in 上的 20 位数据转到 DRU (data recovery unit), DRU 从 11 倍过采样数据中恢复 10 位数据。数据由 SDI解扰器解扰,然后由 SDI 成帧器进行字对齐。之后就是同步位恢复功能。 此功能可还原由变送器修改的 3FF 和 000值,以减少 6G 和 12G-SDI 模式下的运行长度。这三个模块以全 rx_clk 速度运行,并根据 SDI 模式在每个时钟周期处理 40、20 或 10 位数据。 数据进入 stream demux,该 demux 确定有多少数据流交织在一起,然后在单独的数据路径上分离每个数据流,最多支持 16 个数据流。每路数据流进入一个处理单元,该单元进行 CRC 错误检查、行号捕获和 ST 352 包捕获。还可以从 stream demux 中

提取视频时序并产生 rx_eav,rx_sav 和 rx_trs 时序信号。这些时序信号由 SDI 模式检测并给传输检测模块使用。

SMPTE UHD-SDI 发送

SMPTE UHD-SDI 发射端的框图如下:

SMPTE UHD-SDI最多可以支持 16 路 SDI 数据流,数据流首先通过 ST 352 插入模块,可以有选择地插入 ST 352 有效负载 ID 数据包,从 ST 352 插入模块输出的数据流称为 tx_ds1_st352_out 至tx_ds16_st352_out。输出这些流可以方便用户在 ST 352 数据包后插入辅助数据。 发送器的其余部分可以直接使用ST 352 数据包插入模块输出的流,也可以使用 16 个 tx_ds1_anc_in 到 tx_ds16_anc_in 数据流。请注意,如果使用tx_dsn_anc_in 数据流,则它们必须是完整的 SDI 数据流,而不仅仅是辅助数据。通常情况下,每个 Y/C 数据流对的 Y 数据流中只插入 ST 352 包。而在 3G-SDI level A mode-only 模式下,数据流 1 和数据流 2 都必须插入 ST 352 报文。然后每对 Y / C 数据流经过一个数据流处理模块,该模块可以进行进行行号插入和 CRC 生成及插入。在流处理之后,数据流被 MUX 交织,形成 40、20 或 10 位宽的多路复用 SDI 数据流。然后,由 SDI 加扰器对多路复用的数据流进行加扰。最后,数据在 tx_txdata 端口上输出到对应的串行收发器。

6G-SDI 接收数据处理

到这里,6G-SDI 视频解码工作就完成了,解码后的视频为并行的TTL电平的数据,此时的解码数据送入ILA中观察,也可以供用户做后续处理,比如缓存、颜色转换、缩放、图像识别等,本设计不做处理,只将数据留出来,给开发者更多利用空间;开发者可以通过ILA观察SDI接收数据的正确性,在此基础上可以做后续处理;

发送数据彩条

发送数据彩条由纯verilog实现,为静态彩条,作为 6G-SDI视频发送的数据源,代码位置截图如下:

GV8500增强驱动

发送过程经过静态彩条生成、SMPTE UHD-SDI编码、GTX串化后,将视频信号送入板载的GV8500芯片,GV8500起到增强驱动的作用,也可以理解为差分转单端;原理图部分截图如下:

6G-SDI 视频发送输出

6G-SDI 视频发送通路,经GV8500增强驱动后,通过板载的BNC接头连接SDI转HDMI的盒子,将输出的SDI视频接到盒子里,然后输出显示器即可输出显示了;

4、vivado工程详解

开发板FPGA型号:Xilinx的7系列Kintex7--xc7k325tffg676-2;

开发环境:Vivado2022.2;

输入:6G-SDI摄像头,解码后不做处理;

输出:静态彩条视频经6G-SDI编码后输出;

应用:FPGA高端项目:6G-SDI 视频编解码

工程代码架构如下:

资源消耗和功耗预估如下:

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开发板;

6G-SDI相机;

BNC转SMA同轴线;

SDI转HDMI盒子;

HDMI显示器;

输出静态演示

接收端,6G-SDI 视频输入解码后 ILA 波形如下:

发送端,6G-SDI 静态彩条视频输出如下:

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

福利:工程代码的获取

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

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

网盘资料如下:

相关推荐
apple_ttt10 小时前
SystemVerilog学习——虚拟接口(Virtual Interface)
fpga开发·fpga·systemverilog·uvm
学习路上_write19 小时前
FPGA/Verilog,Quartus环境下if-else语句和case语句RT视图对比/学习记录
单片机·嵌入式硬件·qt·学习·fpga开发·github·硬件工程
安步当歌20 小时前
【WebRTC】视频发送链路中类的简单分析(下)
网络·音视频·webrtc·视频编解码·video-codec
jjjxxxhhh12321 小时前
FPGA,使用场景,相比于单片机的优势
单片机·嵌入式硬件·fpga开发
诚实可靠小郎君95271 天前
FPGA高速设计之Aurora64B/66B的应用与不足的修正
fpga开发·aurora·高速通信
百锦再1 天前
基于Zynq FPGA对雷龙SD NAND的测试
fpga开发
∑狸猫不是猫2 天前
HDLBIts习题(4):边沿检测、分频计数器、多位BCD计数器
fpga开发
黑旋风大李逵2 天前
FPGA使用Verilog实现CAN通信
fpga开发·can通信·sja1000t·fpga实现can通信
hi942 天前
PYNQ 框架 - 中断(INTR)驱动
嵌入式硬件·fpga开发·zynq·pynq
transfer_ICer3 天前
Vscode搭建verilog开发环境
vscode·fpga开发·编辑器