FPGA硬件解码SDI视频任意尺寸缩放输出 串口指令控制输出分辨率 提供工程源码和技术支持

目录

  • 1、前言
  • 2、SDI理论练习
  • 3、设计思路和架构
    • SDI摄像头
    • Gv8601a单端转差
    • GTX解串
    • SDI解码
    • VGA时序恢复
    • YUV转RGB
    • 图像缩放
    • FDMA图像缓存
    • 串口解析
    • HDMI驱动
  • 4、vivado工程详解
  • 5、上板调试验证并演示
  • 6、福利:工程代码的获取

1、前言

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

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

本文详细描述了FPGA纯verilog编解码SDI视频,然后任意尺寸缩放输出的实现设计方案,输出分辨率由串口指令控制,工程代码编译通过后上板调试验证,文章末尾有演示视频,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字成像和图像传输领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

2、SDI理论练习

SDI视频协议比较复杂,我前面已经写过多篇文章,建议先回头看看前面的文章再往下看有利于理解。
1、FPGA使用GTX解码SDI参考链接:直接点击查看
2、FPGA使用GTH解码SDI参考链接:直接点击查看
3、FPGA使用GTX实现SDI接收和发送参考链接:直接点击查看
4、FPGA使用GTX实现SDI光口SFP收发参考链接:直接点击查看
5、FPGA使用GTX实现SDI UDP网络发送参考链接:直接点击查看

3、设计思路和架构

设计思路和架构如下:
FPGA硬件解码SDI视频任意尺寸缩放输出 串口指令控制输出分辨率 提供工程源码和技术支持_第1张图片
本设计的流程为:
FPGA解码3G-SDI输入视频,输入分辨率为1920x1080@30Hz,上电默认输出1920x1080@60Hz,通过笔记本电脑的串口调试助手发送不同指令,控制输出不同的分辨率视频,具体请看文章末尾的演示视频。。。

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视频时序,首先得看懂下面这张图:FPGA硬件解码SDI视频任意尺寸缩放输出 串口指令控制输出分辨率 提供工程源码和技术支持_第2张图片
根据这张表即可恢复出图像时序,具体看代码,这里一两句话实在讲不清楚,如果要完全讲明白,写5本书都搓搓有余;

YUV转RGB

这里就简单了,YUV4:4:4转RGB8:8:8,几条公式和几行代码的事儿,属于低端操作;
至此,SDI解码过程就完成了,接下来就是图像输出过程;

图像缩放

图像缩放模块采用纯verilog代码实现,没有任何IP,可在包括国产FPGA在内的各种FPGA平台间任意移植,支持任意比例、任意分辨率、任意尺寸图像缩放,将临近插值和双线性插值两种算法合二为一,通过输入信号高低电平选择其一,本设计选择的双线性插值算法。关于图像缩放,请参考我之前的文章直接点击查看
由于SDI摄像头输入是1920x1080,我的显示器最高只支持1080P显示,所以本设计只能做缩小,不能做放大,所以设计了如下几种输出分辨率:
1、上电默认输出1920x1080图像;
2、串口指令控制输出1280x720图像;
3、串口指令控制输出800x600图像;
4、串口指令控制输出640x480图像;
5、串口指令控制输出1280x1024图像;
6、串口指令控制输出1680x1050图像;
7、串口指令控制输出1920x1080图像;

FDMA图像缓存

我常用的FDMA数据缓存架构,详情请参考我之前的文章:直接点击查看

串口解析

我常用的串口解析架构,详情请参考我之前的文章:直接点击查看
本设计的串口指令切换逻辑如下:
上电默认输出1920x1080图像;
串口发送 aa bb 05 00 02 d0 d7 cc dd 输出1280x720图像;
串口发送 aa bb 03 20 02 58 7d cc dd 输出800x600图像;
串口发送 aa bb 02 80 01 e0 63 cc dd 输出640x480图像;
串口发送 aa bb 05 00 04 00 09 cc dd 输出1280x1024图像;
串口发送 aa bb 06 90 04 1a b4 cc dd 输出1680x1050图像;
串口发送 aa bb 07 80 04 38 c3 cc dd 输出1920x1080图像;
串口助手可以手动单个发送指令,也可以循环发送指令,为了测试需要,本设计的演示部分采用循环发送指令,所以演示效果就是各种分辨率循环输出。。。
串口调试助手如下:
FPGA硬件解码SDI视频任意尺寸缩放输出 串口指令控制输出分辨率 提供工程源码和技术支持_第3张图片
串口指令切换逻辑代码部分如下:

uart_rx_analysis_top #(
    .CLK_FREQ(200_000_000),  //系统时钟频率
    .UART_BPS(115200     )   //串口波特率
)
uart_rx(
	.clk       (ui_clk_200m  ),
	.rst_n     (rst_n),
	.i_uart_rx (i_uart_rx ),
	.o_uart_tx (o_uart_tx ),
	.o_rx_done (o_rx_done ),
	.o_rx_data (o_rx_data )
);

always @(posedge ui_clk_200m) begin
	if(~rst_n) r_rx_data<='d0;
	else if(o_rx_done) r_rx_data<=o_rx_data;
end

always @(*) begin
	if(~rst_n) begin
		disp_h='d1920;
		disp_v='d1080;	
	end
	else if(r_rx_data==32'h050002d0) begin	//1280x720
		disp_h='d1280;
		disp_v='d720;	
	end
	else if(r_rx_data==32'h03200258) begin	//800x600
		disp_h='d800;
		disp_v='d600;	
	end
	else if(r_rx_data==32'h028001e0) begin	//640x480
		disp_h='d640;
		disp_v='d480;	
	end
	else if(r_rx_data==32'h05000400) begin	//1280x1024
		disp_h='d1280;
		disp_v='d1024;	
	end
	else if(r_rx_data==32'h0690041a) begin	//1680x1050
		disp_h='d1680;
		disp_v='d1050;	
	end	
	else if(r_rx_data==32'h07800438) begin	//1920x1080
		disp_h='d1920;
		disp_v='d1080;	
	end
	else begin	//1280x720
		disp_h='d1920;
		disp_v='d1080;	
	end
end

HDMI驱动

我常用的串口解析架构,纯verilog代码实现HDMI发送,详情请参考我之前的文章:直接点击查看

4、vivado工程详解

开发板:Xilinx Kintex7开发板;
开发环境:vivado2019.1;
输入:3G-SDI摄像头,分辨率1920x1080@30Hz;
输出:HDMI,分辨率由串口指令控制;

工程Block Design部分如下:
FPGA硬件解码SDI视频任意尺寸缩放输出 串口指令控制输出分辨率 提供工程源码和技术支持_第4张图片
Block Design部分只做到了FDMA图像缓存部分,本设计的FDMA较之前的FDMA做了小幅改动,目的是为了实现动态分辨率的配置。。。
综合后的工程代码架构如下:
FPGA硬件解码SDI视频任意尺寸缩放输出 串口指令控制输出分辨率 提供工程源码和技术支持_第5张图片
资源消耗和功耗预估如下:
FPGA硬件解码SDI视频任意尺寸缩放输出 串口指令控制输出分辨率 提供工程源码和技术支持_第6张图片

5、上板调试验证并演示

直接看演示视频:
FPGA硬件解码SDI视频任意尺寸缩放输出 串口指令控制输出分辨率 提供工程源码和技术支持_第7张图片

SDI-缩放-uart

6、福利:工程代码的获取

福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式1:私,或者文章末尾的V名片。
资料获取方式2:文章末尾的XX号,回复 001004
网盘资料如下:
在这里插入图片描述
自定义IP和源码在这个文件夹里:
FPGA硬件解码SDI视频任意尺寸缩放输出 串口指令控制输出分辨率 提供工程源码和技术支持_第8张图片

你可能感兴趣的:(FPGA编解码SDI视频专题,菜鸟FPGA图像处理专题,FPGA图像缩放,fpga开发,SDI,图像处理,图像缩放,串口)