FPGA纯verilog编解码SDI实现流程

前言fpga实现sdi视频编解码目前有两种方案:
一是使用专用编解码芯片,比如典型的接收器gs2971,发送器gs2972,优点是简单,比如gs2971接收器直接将sdi解码为并行的ycrcb,gs2972发送器直接将并行的ycrcb编码为sdi视频,缺点是成本较高,可以百度一下gs2971和gs2972的价格;
另一种方案是使用fpga实现编解码,利用fpga的gtp/gtx资源实现解串,优点是合理利用了fpga资源,gtp/gtx资源不用白不用,缺点是操作难度大一些,对fpga水平要求较高。
本文详细描述了fpga纯verilog编解码sdi视频,然后任意尺寸缩放拼接输出的实现设计方案,工程代码编译通过后上板调试验证,文章末尾有演示视频,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字成像和图像传输领域;
设计思路和架构设计思路和架构如下:
本设计的流程为:
fpga解码3g-sdi输入视频,输入分辨率为1920x1080@30hz,经硬件解码后,将图像缩小到960x540,并复制为4路视频,模拟4路输入,送到ddr3缓存做视频拼接,最后4路视频拼接显示到1920x1080的显示屏上,具体请看文章末尾的演示视频。。。
sdi摄像头我用到的sdi摄像头输出视频分辨率1080p@30hz;根据不同相机有所区别;
gv8601a单端转差gv8601a起到均衡 eq 功能,这里选用gv8601a是因为抄袭了xilinx官方的板子,当然也可以用其他型号器件。
gtx解串gtx负责解串,将原始sdi视频解为20位的并行数据,我的板子是k7,所以用gtx,如果是a7的板子则用gtp,这里使用gtx并没有调用ip,而是直接调用gtxe2_channel和gtxe2_common源语,这一点可谓将xilinx的gtx资源用到了极致水平,值得好好品读,其实调用ip无非也就是把调用源语变得界面化而已,直接调用源语或许理解更为深刻,这一点,在市面上的所谓fpga教程里都学不到。
sdi解码调用smpte-sdi ip核实现,gtx只是将高速串行数据解为了并行,但并没有解析sdi协议,smpte-sdi ip核则完成了sdi协议的解码,去掉了sdi协议中的数据包信息和控制信息,解析出有效的视频数据,详细的smpte-sdi ip核接口定义请参考官方的使用手册;
vga时序恢复此模块的作用就是解码恢复出hs、vs以及de信号,即恢复正常的vga视频时序;
要恢复正常的vga视频时序,首先得看懂下面这张图:
根据这张表即可恢复出图像时序,具体看代码,这里一两句话实在讲不清楚,如果要完全讲明白,写5本书都搓搓有余;
yuv转rgb这里就简单了,yuv4:4:4转rgb8:8:8,几条公式和几行代码的事儿,属于低端操作;
至此,sdi解码过程就完成了,接下来就是图像输出过程;
图像缩放图像缩放模块采用纯verilog代码实现,没有任何ip,可在包括国产fpga在内的各种fpga平台间任意移植,支持任意比例、任意分辨率、任意尺寸图像缩放,将临近插值和双线性插值两种算法合二为一,通过输入信号高低电平选择其一,本设计选择的双线性插值算法。
由于sdi摄像头输入是1920x1080,我的显示器最高只支持1080p显示,所以本设计只能做缩小,不能做放大,为了适应1080p屏幕的视频拼接效果,所以将sdi图像缩小到960x540分辨率。
fdma图像缓存实现拼接多路视频的拼接显示原理如下:
以把 2 个摄像头 cam0 和 cam1 输出到同一个显示器上为列,为了把 2 个图像显示到 1 个显示器,首先得搞清楚以下关系:
hsize:每 1 行图像实际在内存中占用的有效空间,以 32bit 表示一个像素的时候占用内存大小为 hsize*4;
hstride:用于设置每行图像第一个像素的地址,以 32bit 表示一个像素的时候 v_cnt* hstride*4;
vsize:有效的行;
因此很容易得出 cam0 的每行第一个像素的地址也是 v_cnt* hstride*4;
同理如果我们需要把 cam1 在 hsize 和 vsize 空间的任何位置显示,我们只要关心 cam1 每一行图像第一个像素的地址,可以用以下公式 v_cnt* hstride*4+offset;
uifdma_dbuf 支持 stride 参数设置,stride 参数可以设置输入数据 x(hsize)方向每一行数据的第一个像素到下一个起始像素的间隔地址,利用 stride 参数可以非常方便地摆放输入视频到内存中的排列方式。
根据以上铺垫,每路摄像头缓存的基地址如下:
cam0:addr_base=0x80000000;
cam1:addr_base=0x80000000+(1920-960)x4;
cam2:addr_base=0x80000000+(1080-540)x1920x4;
cam3:addr_base=0x80000000+(1080-540)x1920x4+(1920-960)x4;
地址设置完毕后基本就完事儿了;
hdmi驱动4、vivado工程详解开发板:xilinx kintex7开发板;
开发环境:vivado2019.1;
输入:3g-sdi摄像头,分辨率1920x1080@30hz;
输出:hdmi,分辨率1920x1080@60hz,4路960x540视频拼接显示;
工程block design部分如下:
block design部分只做到了fdma图像缓存部分,本设计的fdma较之前的fdma做了小幅改动,目的是为了实现动态分辨率的配置。。。
综合后的工程代码架构如下:
资源消耗和功耗预估如下:

Keysight N5244B网络分析仪参数说明
STM32定时器更新事件可以暂停否?
OYO Hotels获滴滴出行1亿美元投资,软银孙正义1月曾造访
强认知引领AI技术变革 ,融通百业助推产业升级
国际电信联盟《无线电规则》摘录
FPGA纯verilog编解码SDI实现流程
特斯拉自研车用MCU控制器设计
Intel14nm产能缺货不仅没有对业绩产生影响 甚至营收还比年初预计的高了62亿美元
物联网将高速发展,助力智能生活变革
SPI驱动源文件目录在哪
模拟电子技术中几种类型放大器的基本判断方法
如何建立一个潜在的特斯拉竞争对手?
长沙在人工智能产业中的布局与应用情况介绍
工业物联网解决方案:无人值守水库监测系统
LM48100Q Boomer 音频功率放大器,适用于汽车警
aigo国民好物移动固态硬盘 打工人的高效办公搭档
关于并发编程与线程安全的思考与实践
高性能信号处理技术将取代标准IC
大电流弹片微针模组能够满足FPC连接器的测试需求
ADI公司和LifeQ携手提升健康管理应用中人体监测设备的效能