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

目录

FPGA高端项目: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等视频编解码;目前市面上的SDI编解码方案一般都是视频的,而SDI音频的编解码方案却很少,要知道,SDI数据流中是可以包含音频的,而本设计就是解决这个问题,从输入的SDI数据流中分理处视频和音频;

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

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

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

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

免责声明

本工程及其源码即有自己写的一部分,也有网络公开渠道获取的一部分(包括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实现3G-SDI 视频+音频编解码;本设计分为3G-SDI 视频编码、3G-SDI 音频解码和3G-SDI 视频解码两部分,即3G-SDI 视频发送和视频+音频接收,三个部分功能做在一个工程里;3G-SDI 视频接收过程为:输入摄像头为标准的3G-SDI摄像头,开发板板载GV8601A芯片,SDI视频经过GV8601A起到均衡EQ的作用,也可以理解为单端转差分;然后调用Xilinx官方GTX的GTXE2_CHANNEL原语和GTXE2_COMMON原语进行SDI视频解串,将高速串行的SDI视频解为并行数据,GTX选择QPLL时钟;然后调用Xilinx官方的SMPTE SD/HD/3G-SDI IP核实现SDI视频解码,该IP在Kintex7器件上只支持SD-SDI、HD-SDI和3G-SDI视频编解码,本设计配置为3G-SDI模式;到这里,3G-SDI 视频解码工作就完成了,解码后的视频为并行的TTL电平的数据,此时的解码数据送入ILA中观察,也可以供用户做后续处理,比如缓存、颜色转换、缩放、图像识别等,本设计不做处理,只将数据留出来,给开发者更多利用空间;SDI接收到的数据流中是可以包含音频的,而本设计就是解决这个问题,从输入的SDI数据流中分理处视频和音频;调用Xilinx官方的 UHD-SDI Audio IP核解码SDI音频信号,该IP在Kintex7器件上只支持3G-SDI和6G-SDI音频编解码,本设计配置为3G-SDI模式;然后将解码后的音频送入i2s音频编码模块,输出标准的i2s音频时序;然后将音频数据送入板载的TLV320AIC3104音频编码芯片输出到外部扬声器即可播放SDI音频;3G-SDI 视频发送过程为:纯verilog实现的静态彩条作为视频源,然后调用Xilinx官方的SMPTE SD/HD/3G-SDI IP核实现SDI视频编码,该IP在Kintex7器件上只支持SD-SDI、HD-SDI和3G-SDI视频编解码,本设计配置为3G-SDI模式,这个过程是接收过程的逆过程;然后调用Xilinx官方GTX的GTXE2_CHANNEL原语进行SDI视频串化,将并行的SDI视频数据串化为高速串行数据,GTX选择CPLL时钟,这个过程是接收过程的逆过程;然后将视频信号送入板载的GV8500芯片,GV8500起到增强驱动的作用,也可以理解为差分转单端;我手里有一个SDI转HDMI的盒子,将输出的SDI视频接到盒子里,然后输出显示器即可输出显示了;本方案提供1套vivado2022.2版本的FPGA工程源码;

设计框图

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

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

GV8601A均衡EQ

3G-SDI 视频接收过程为:输入摄像头为标准的3G-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 SD/HD/3G-SDI

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

IP配置如下:

SMPTE SD/HD/3G-SDI 用法与SMPTE UHD-SDI IP类似,调用都很简单,但使用相对复杂,用户接口众多,详情请参考官方数据手册,接口关系请参考,这里只做简单解读,如下:

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

SMPTE SD/HD/3G-SDI 接收

SMPTE SD/HD/3G-SDI 用法与SMPTE UHD-SDI IP类似,参考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 SD/HD/3G-SDI 发送

SMPTE SD/HD/3G-SDI 用法与SMPTE UHD-SDI IP类似,参考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 端口上输出到对应的串行收发器。

SDI 视频接收数据处理

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

SDI 音频接收--UHD-SDI Audio解码

SDI接收到的数据流中是可以包含音频的,而本设计就是解决这个问题,从输入的SDI数据流中分理处视频和音频;调用Xilinx官方的 UHD-SDI Audio IP核解码SDI音频信号,该IP在Kintex7器件上只支持3G-SDI和6G-SDI音频编解码,本设计配置为3G-SDI模式;UHD-SDI Audio在代码中位置和IP配置如下:

SDI 音频接收--i2s输出播放

然后将解码后的音频送入i2s音频编码模块,输出标准的i2s音频时序;然后将音频数据送入板载的TLV320AIC3104音频编码芯片输出到外部扬声器即可播放SDI音频;该部分代码位置如下:

发送数据彩条

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

GV8500增强驱动

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

SDI 视频发送输出

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

4、vivado工程详解

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

开发环境:Vivado2022.2;

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

输出:静态彩条视频经3G-SDI编码后输出、输出SDI音频至扬声器;

应用:FPGA高端项目: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开发板;

3G-SDI相机;

BNC转SMA同轴线;

SDI转HDMI盒子;

HDMI显示器;

输出静态演示

音频输出没法演示,请见谅。。。

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

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

福利:工程代码的获取

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

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

网盘资料如下:

相关推荐
小虎卫远程打卡app9 分钟前
视频编解码学习十二之Android疑点
学习·视频编解码
霖001 小时前
PCIe数据采集系统
数据结构·经验分享·单片机·嵌入式硬件·fpga开发·信号处理
FakeOccupational3 小时前
fpga系列 HDL : Microchip FPGA开发软件 Libero Soc 安装 & license申请
fpga开发
千歌叹尽执夏5 小时前
FPGA: UltraScale+ bitslip实现(ISERDESE3)
fpga开发·training·ultrascale+·bitslip
zly88653726 小时前
MLX5 Linux 驱动代码分析
linux·运维·fpga开发
灰色人生qwer7 小时前
使用WebSocket实现跨多个服务器传输音频及实时语音识别
websocket·音视频·实时传输
ALINX技术博客9 小时前
【ALINX 实战笔记】FPGA 大神 Adam Taylor 使用 ChipScope 调试 AMD Versal 设计
笔记·fpga开发
小鱼仙官9 小时前
Ubuntu 编译SRS和ZLMediaKit用于视频推拉流
音视频
摆烂仙君11 小时前
视频分辨率增强与自动补帧
音视频
Yesheldon17 小时前
Cadence 高速系统设计流程及工具使用三
嵌入式硬件·fpga开发·硬件架构·硬件工程·智能硬件