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官网等等),若大佬们觉得有所冒犯,请私信批评教育;基于此,本工程及其源码仅限于读者或粉丝个人学习和研究,禁止用于商业用途,若由于读者或粉丝自身原因用于商业用途所导致的法律问题,与本博客及博主无关,请谨慎使用。。。
我的主页有FPGA GT 高速接口专栏,该专栏有 GTP 、 GTX 、 GTH 、 GTY 等GT 资源的视频传输例程和PCIE传输例程,其中 GTP基于A7系列FPGA开发板搭建,GTX基于K7或者ZYNQ系列FPGA开发板搭建,GTH基于KU或者V7系列FPGA开发板搭建,GTY基于KU+系列FPGA开发板搭建;以下是专栏地址:
点击直接前往
我的博客主页开设有SDI视频专栏,里面全是FPGA编解码SDI的工程源码及博客介绍;既有基于GS2971/GS2972的SDI编解码,也有基于GTP/GTX资源的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官方设计文档,官方的参考设计框图如下:
具体到本工程详细设计方案框图如下:
3G-SDI 视频接收过程为:输入摄像头为标准的3G-SDI摄像头,开发板板载GV8601A芯片,SDI视频经过GV8601A起到均衡EQ的作用,也可以理解为单端转差分;原理图部分截图如下:
根据Xilinx推荐的硬件设计要求,GTX需要两路差分时钟,一路148.5M和一路148.351M,后者可以通过148.5M差分晶振匹配电阻得到;
然后调用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进行动态配置;
然后调用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 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 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 端口上输出到对应的串行收发器。
到这里,3G-SDI 视频解码工作就完成了,解码后的视频为并行的TTL电平的数据,此时的解码数据送入ILA中观察,也可以供用户做后续处理,比如缓存、颜色转换、缩放、图像识别等,本设计不做处理,只将数据留出来,给开发者更多利用空间;开发者可以通过ILA观察SDI接收数据的正确性,在此基础上可以做后续处理;
SDI接收到的数据流中是可以包含音频的,而本设计就是解决这个问题,从输入的SDI数据流中分理处视频和音频;调用Xilinx官方的 UHD-SDI Audio IP核解码SDI音频信号,该IP在Kintex7器件上只支持3G-SDI和6G-SDI音频编解码,本设计配置为3G-SDI模式;UHD-SDI Audio在代码中位置和IP配置如下:
然后将解码后的音频送入i2s音频编码模块,输出标准的i2s音频时序;然后将音频数据送入板载的TLV320AIC3104音频编码芯片输出到外部扬声器即可播放SDI音频;该部分代码位置如下:
发送数据彩条由纯verilog实现,为静态彩条,作为 3G-SDI视频发送的数据源,代码位置截图如下:
发送过程经过静态彩条生成、SMPTE UHD-SDI编码、GTX串化后,将视频信号送入板载的GV8500芯片,GV8500起到增强驱动的作用,也可以理解为差分转单端;原理图部分截图如下:
3G-SDI 视频发送通路,经GV8500增强驱动后,通过板载的BNC接头连接SDI转HDMI的盒子,将输出的SDI视频接到盒子里,然后输出显示器即可输出显示了;
开发板FPGA型号:Xilinx的7系列Kintex7–xc7k325tffg676-2;
开发环境:Vivado2022.2;
输入:3G-SDI摄像头,解码后不做处理;
输出:静态彩条视频经3G-SDI编码后输出、输出SDI音频至扬声器;
应用:FPGA高端项目:SDI 视频+音频编解码;
工程代码架构如下:
资源消耗和功耗预估如下:
1:如果你的vivado版本与本工程vivado版本一致,则直接打开工程;
2:如果你的vivado版本低于本工程vivado版本,则需要打开工程后,点击文件–>另存为;但此方法并不保险,最保险的方法是将你的vivado版本升级到本工程vivado的版本或者更高版本;
3:如果你的vivado版本高于本工程vivado版本,解决如下:
打开工程后会发现IP都被锁住了,如下:
此时需要升级IP,操作如下:
如果你的FPGA型号与我的不一致,则需要更改FPGA型号,操作如下:
更改FPGA型号后还需要升级IP,升级IP的方法前面已经讲述了;
1:由于每个板子的DDR不一定完全一样,所以MIG IP需要根据你自己的原理图进行配置,甚至可以直接删掉我这里原工程的MIG并重新添加IP,重新配置;
2:根据你自己的原理图修改引脚约束,在xdc文件中修改即可;
3:纯FPGA移植到Zynq需要在工程中添加zynq软核;
FPGA开发板;
3G-SDI相机;
BNC转SMA同轴线;
SDI转HDMI盒子;
HDMI显示器;
音频输出没法演示,请见谅。。。
发送端,3G-SDI 静态彩条视频输出如下:
福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
网盘资料如下: