FPGA纯verilog编解码SDI实现流程

时间:2025-09-15  作者:Diven  阅读:0

前言

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

FPGA纯verilog编解码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做了小幅改动,目的是为了实现动态分辨率的配置。。。

综合后的工程代码架构如下:资源消耗和功耗预估如下:

猜您喜欢

1、时间标尺:格式:`timescale 仿真时间单位/时间精度,举例:`timescale 1ns/100ps,仿真时间单位位1ns,但是仿真时间精度可以达到...
2019-07-31 17:52:00

独石电容器是电子设备中常见的元件。用来储存电能,起到滤波和耦合的作用。不同型号的独石电容器适用于不同的场合。了解的型号很重要。下面将详细介绍独石电容器的型号。独...
2025-03-26 12:01:07

2010-07-15 00:00:00

转换器和电平移位器是电子电路中不可少的组件,主要用于信号的转换和电平的适配。根据功能和应用场景的不同,这些设备可以分为几种主要类型。数字-模拟转换器(DAC)和...
2020-01-30 00:00:00

其产品在电压参数方面表现出色,深受市场青睐。SSM凭借很好的技术实力和丰富的产品线,为全球电子制造商提供了一系列高品质的铝壳电阻。本文将深入探讨SSM品牌铝壳电...
2017-05-23 08:49:30

电流检测电阻作为关键元件,承担着测量电流和保护电路的重要任务。选择合适的电流检测电阻不仅关系到系统的性能和稳定性,还影响整体的安全性和使用寿命。Uniohnm(...
2016-05-17 02:38:30

在硬件电路设计中,每一个IC芯片都有相应的电源端口对其供电,以驱动IC进行工作。对于普通的IC芯片,极大部分都是由单电源3.3V电压供电,且输出的高电平电压也是...
2018-07-05 08:33:00

FPGA是一种多电源需求的芯片,主要有3种电源需求:VCCINT:核心工作电压,PCI Express (PCIe) 硬核IP 模块和收发器物理编码子层(PC...
2019-02-27 14:09:00

现代电子设备中,连接器扮演着非常重要的角色。CONN-20P_38.04X12.8MM_TM作为一种高性能的连接器,因其独特的设计和优越的性能受到广泛关注。本文...
2025-03-07 10:13:47

随着智能家居的加速普及,用户对智能体验的期待值在不断提高,作为智能家居基础硬件之一的人体传感器扮演的角色也越来越重要。近日,有线智能控制领导品牌河东科技HDL...
2024-01-19 17:36:00