前言:SDI视频编解码目前有两种方案,一是使用专用编解码芯片,比如典型的接收器GS2971,发送器GS2972,优点是简单,比如GS2971直接将SDI解码为并行的YCRCB,缺点是成本较高,可以百度一下GS2971的价格;另一种方案是使用FPGA实现编解码,利用FPGA的GTP/GTX资源实现解串,优点是合理利用了FPGA资源,GTP/GTX资源不用白不用,缺点是操作难度大一些,对FPGA水平要求较高。
开发板:Kintex7板子;
开发环境:vivado2019.1;
输入:sdi摄像头;
输出:hdmi;
一、总体方案
SDI摄像头输入视频为1080P@30Hz,经过Gv8601a单端转差分后进入FPGA的GTX,GTX负责解串,将原始SDI视频解为20位的并行数据,再送入Xilinx的SDI IP核进行解码,解出行场和控制信号以及像素数据,此时的数据是YCrCb格式,还需要转为RGB格式,然后用FDMA架构进行三帧缓存输出,FDMA三帧架构是一种经典的图像缓存架构,不懂的可以看我前面关于FDMA图像缓存的文章。
二、GTX的使用
我用的开发板是K7,所以使用GTX,不用调用IP,直接使用GTX的源语,我们知道,一个GTX的 Quad由四个GTXE2_CHANNEL源语和一个GTXE2_COMMON源语组成,所以在调用GTX时可直接使用源语,如下:
根据Xilinx的参考设计文档,解码SDI时,GTX需要两个差分时钟,148.5M和148.35M,如下:
其他的建议参考我的代码,这里写不完;
三、SDI IP的使用
直接调用Xilinx的官方IP,如下图:
SDI IP解码出SDI的控制信号和视频信号,然后根据这些信号还原出视频的vs、hs、de和ycrcb。
然后是ycrcb转rgb,很简单,这里不多阐述;
最后是送ddr三帧缓存,由于前面的文章讲了很多,这里也不再阐述;
四、工程架构
BD工程如下:主要是FDMA的三帧缓存
工程代码架构如下:
五、板级调试
硬件连接如下:
输出结果如下:
福利:代码太大,不方便在这里给出,需要的朋友可以“关注并私信”我得到工程源码