FPGA实现SDI视频编解码的方案

可编程逻辑

1348人已加入

描述

1、前言

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

一是使用专用编解码芯片,比如典型的接收器GS2971,发送器GS2972,优点是简单,比如GS2971接收器直接将SDI解码为并行的YCRCB,GS2972发送器直接将并行的YCRCB编码为SDI视频,缺点是成本较高,可以百度一下GS2971和GS2972的价格;

另一种方案是使用FPGA实现编解码,利用FPGA的GTP/GTX资源实现解串,优点是合理利用了FPGA资源,GTP/GTX资源不用白不用,缺点是操作难度大一些,对FPGA水平要求较高。

本文详细描述了FPGA纯verilog编解码SDI视频的实现设计方案,工程代码编译通过后上板调试验证,文章末尾有演示视频,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字成像和图像传输领域;

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

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

本设计提供两套vivado工程;

工程1:

SDI 1080P@30Hz帧视频输入解码后,经DDR3缓存,SDI发送1080P@30Hz帧输出;

工程2:

FPGA内部生成测试彩条视频,SDI发送出去,SDI接收后无缓存HDMI输出;

2、设计思路和框架

设计思路和框架如下:

SDI经DDR3环出工程设计思路如下:

编解码芯片

SDI接收

这里重点将SDI图像缓存和发送部分:

SDI缓存写方式处理

SDI 接收解串后,把 20 位数据,异步 FIFO 方式,8 个数据一起打包成并行数据,送入 DDR3。通过 rx_usrclk 时钟送入 20 位到 FIFO,然后再用 DDR 的 ui_clk 时钟,把 8 个数据并行送入DDR3。每帧数据满了后,我们就把帧号加 1,即 ddr3_addr_bank_wr 变量加 1,这样使得我们在 DDR3 内存颗粒放置了3帧数据。

SDI缓存读方式处理

通过ui_clk,一个时钟读出 8 个 SDI 数据,送入 FIFO,通过异步方式,也就是通过 tx_usrclk时钟,读出 1 个 sdi 数据,也就是 20bit 的 sdi 数据。每读满一帧,我们就通过ddr3_addr_bank_rd <= ddr3_addr_bank_wr ‐2'b1;方式,让读帧号跟随着写帧号。

SDI缓存的目的

rx_usrclk 时钟是来自信号源,但是 SDI 发送必须要使用本地晶振,也就是硬件上连接到GTX 的参考时钟晶振。由于时钟的不同源,所以我们不能把接收的信号源直接送到 SDI 发送引擎上去,必须要经过 DDR 方式做帧处理才能做 SDI 环出。

SDI发送

SDI发送是SDI接收的逆过程,即使用SDI IP编码将视频数据编码为SDI格式,再使用GTX将并行SDI数据串化为高速串行数据通过GTX发送出去,经过GV8500增强驱动后给到SDI发送的BNC座子。

SDI发送接收彩条视频工程设计思路如下:

编解码芯片

FPGA内部生成3G-SDI彩条视频,不缓存,直接经前文介绍的SDI发送通路发送出去,再经前文介绍的SDI接收通路后送HDMI输出显示。

3、工程1详解

开发板:Xilinx Kintex7开发板;

开发环境:Vivado2019.1;

输入:SDI摄像头,分辨率1080p@30帧;

输出:SDI,分辨率1080p@30帧;

工程代码架构如下:

编解码芯片

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

编解码芯片

4、工程2详解

开发板:Xilinx Kintex7开发板;

开发环境:Vivado2019.1;

输入:FPGA内部生成彩条,分辨率1080p@30帧;

输出:HDMI,分辨率1080p@30帧;

工程代码架构如下:

编解码芯片

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

编解码芯片

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分