FPGA纯verilog解码SDI视频 纯逻辑资源实现 提供2套工程源码和技术支持
Posted 9527华安
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FPGA纯verilog解码SDI视频 纯逻辑资源实现 提供2套工程源码和技术支持相关的知识,希望对你有一定的参考价值。
目录
1、前言
FPGA实现SDI视频编解码目前有两种方案:
一是使用专用编解码芯片,比如典型的接收器GS2971,发送器GS2972,优点是简单,比如GS2971直接将SDI解码为并行的YCRCB,缺点是成本较高,可以百度一下GS2971的价格;
另一种方案是使用FPGA实现编解码,利用FPGA的GTP/GTX资源实现解串,优点是合理利用了FPGA资源,GTP/GTX资源不用白不用,缺点是操作难度大一些,对FPGA水平要求较高。
本文详细描述了FPGA纯verilog解码SDI视频的实现设计方案,工程代码编译通过后上板调试验证,文章末尾有演示视频,可直接项目移植,适用于在校学生做毕业设计、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字成像和图像传输领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;
本设计提供两套vivado工程;
一是SDI 1080P@30Hz帧视频输入解码后,无缓存直接HDMI 1080P@30Hz帧输出;
二是SDI 1080P@30Hz帧视频输入解码后,缓存3帧后HDMI 1080P@60Hz帧输出;
关于SDI的理论知识部分,可自行搜索一下,很多大佬讲得很详细,也可以参考我之前写的文章:点击查看:SDI解码详解
2、硬件电路解析
硬件电路连接如下:
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解码过程就完成了,接下来就是图像输出过程;
图像输出
图像输出有两种通路
一种是无缓存直接输出,这种方式的优点是没有延迟,适用于做图传的项目,缺点是不能对图像进行其他处理了;
另一种是缓存输出,这种方式的优点是可以平衡和同步后端的接收,比如后端接收不过来时就可以缓存几帧再输出;另外,如果还需要对图像进行其他处理时也需要缓存,适用于做图像处理的项目,缺点是输出有延迟,根据设置可以延迟多帧,本设计是延迟3帧;
既然需求是多样的,所以我们直接做两个工程。
FDMA图像缓存
我常用的FDMA数据缓存架构,详情请参考我之前的文章:点击查看:FDMA图像缓存
HDMI输出
纯verilog代码实现HDMI发送,输出时序1920x1080P,输出帧率由输入HDMI时钟决定;
HDMI输出顶层接口如下:
module helai_hdmi_out(
input clk_hdmi ,
input clk_hdmix5 ,
input reset_n ,
input i_vga_hs ,
input i_vga_vs ,
input i_vga_de ,
input [23:0] i_vga_rgb ,
output o_hdmi_clk_p ,
output o_hdmi_clk_n ,
output [2: 0] o_hdmi_data_p,
output [2: 0] o_hdmi_data_n
);
3、工程1详解:无缓存输出
开发板:Xilinx Kintex7开发板;
开发环境:Vivado2019.1;
输入:SDI摄像头,分辨率1080p@30帧;
输出:HDMI,分辨率1080p@30帧;
工程代码架构如下:
顶层源码如下:
module helai_sdi_decode_2023(
input I_SDI_2_N ,
input I_SDI_2_P ,
input SDI_GTX_CLK_148_5_N , // MGT REFCLKs 148.5 MHz clock
input SDI_GTX_CLK_148_5_P ,
input SDI_GTX_CLK_148_35_P, // MGT REFCLKs 148.35 MHz clock
input SDI_GTX_CLK_148_35_N,
output HDMI_CLK_P ,
output HDMI_CLK_N ,
output [2:0] HDMI_DATA_P ,
output [2:0] HDMI_DATA_N
);
wire o_vout_clk ;
wire o_vout_hs ;
wire o_vout_vs ;
wire o_vout_de ;
wire [23:0] o_vout_rgb ;
wire clk_hdmi ;
wire clk_hdmix5;
wire hdmi_rstn ;
helai_sdi_driver u_helai_sdi_driver(
.I_SDI_2_N (I_SDI_2_N ),
.I_SDI_2_P (I_SDI_2_P ),
.O_SDI_2_N (),
.O_SDI_2_P (),
.SDI_GTX_CLK_148_5_N (SDI_GTX_CLK_148_5_N ), // MGT REFCLKs 148.5 MHz clock
.SDI_GTX_CLK_148_5_P (SDI_GTX_CLK_148_5_P ),
.SDI_GTX_CLK_148_35_P(SDI_GTX_CLK_148_35_P), // MGT REFCLKs 148.35 MHz clock
.SDI_GTX_CLK_148_35_N(SDI_GTX_CLK_148_35_N),
.o_vout_clk (o_vout_clk ),
.o_vout_hs (o_vout_hs ),
.o_vout_vs (o_vout_vs ),
.o_vout_de (o_vout_de ),
.o_vout_rgb (o_vout_rgb )
);
clk_wiz_1 clk_hdmi (
.clk_hdmi(clk_hdmi), // output clk_hdmi
.clk_hdmi_clkx5(clk_hdmix5), // output clk_hdmi_clkx5
.locked(hdmi_rstn), // output locked
.clk_in1(o_vout_clk) // input clk_in1
);
helai_hdmi_out(
.clk_hdmi (clk_hdmi ),
.clk_hdmix5 (clk_hdmix5 ),
.reset_n (hdmi_rstn ),
.i_vga_hs (o_vout_hs ),
.i_vga_vs (o_vout_vs ),
.i_vga_de (o_vout_de ),
.i_vga_rgb (o_vout_rgb ),
.o_hdmi_clk_p (HDMI_CLK_P ),
.o_hdmi_clk_n (HDMI_CLK_N ),
.o_hdmi_data_p(HDMI_DATA_P),
.o_hdmi_data_n(HDMI_DATA_N)
);
endmodule
资源消耗和功耗预估如下:
4、工程2详解:缓存3帧输出
开发板:Xilinx Kintex7开发板;
开发环境:Vivado2019.1;
输入:SDI摄像头,分辨率1080p@30帧;
输出:HDMI,分辨率1080p@60帧;
工程BD如下:
工程代码架构如下:
顶层源码如下:
module helai_sdi_decode_2023(
input clk_27m ,
input I_SDI_2_N ,
input I_SDI_2_P ,
input SDI_GTX_CLK_148_5_N , // MGT REFCLKs 148.5 MHz clock
input SDI_GTX_CLK_148_5_P ,
input SDI_GTX_CLK_148_35_P, // MGT REFCLKs 148.35 MHz clock
input SDI_GTX_CLK_148_35_N,
input i_uart_rx ,
output o_uart_tx ,
// DDR3
output [12:0]DDR3_0_addr ,
output [2:0] DDR3_0_ba ,
output DDR3_0_cas_n ,
output [0:0] DDR3_0_ck_n ,
output [0:0] DDR3_0_ck_p ,
output [0:0] DDR3_0_cke ,
output [3:0] DDR3_0_dm ,
inout [31:0] DDR3_0_dq ,
inout [3:0] DDR3_0_dqs_n ,
inout [3:0] DDR3_0_dqs_p ,
output [0:0] DDR3_0_odt ,
output DDR3_0_ras_n ,
output DDR3_0_reset_n ,
output DDR3_0_we_n ,
output ddr3_ok ,
// HDMI_OUT
output HDMI_CLK_P ,
output HDMI_CLK_N ,
output [2:0] HDMI_DATA_P ,
output [2:0] HDMI_DATA_N
);
wire ui_clk_200m;
wire rst_n ;
wire ud_r_0_ud_rclk ;
wire [31:0] ud_r_0_ud_rdata ;
wire ud_r_0_ud_rde ;
wire ud_r_0_ud_rvs ;
wire ud_w_0_ud_wclk ;
wire [31:0] ud_w_0_ud_wdata ;
wire ud_w_0_ud_wde ;
wire ud_w_0_ud_wvs ;
wire o_vout_clk ;
wire o_vout_hs ;
wire o_vout_vs ;
wire o_vout_de ;
wire [23:0] o_vout_rgb ;
wire o_vga_hs ;
wire o_vga_vs ;
wire o_vga_de ;
wire [23:0] o_vga_rgb;
wire [23:0] i_vga_rgb;
wire clk_hdmi ;
wire clk_hdmix5;
wire hdmi_rstn ;
assign ud_r_0_ud_rclk =clk_hdmi ;
assign ud_r_0_ud_rde = o_vga_de ;
assign ud_r_0_ud_rvs = o_vga_vs ;
assign i_vga_rgb =ud_r_0_ud_rdata[23:0];
assign ud_w_0_ud_wclk =o_vout_clk;
assign ud_w_0_ud_wdata =o_vout_rgb;
assign ud_w_0_ud_wde =o_vout_de ;
assign ud_w_0_ud_wvs =o_vout_vs ;
design_1 u_design_1 (
.DDR3_0_addr (DDR3_0_addr ),
.DDR3_0_ba (DDR3_0_ba ),
.DDR3_0_cas_n (DDR3_0_cas_n ),
.DDR3_0_ck_n (DDR3_0_ck_n ),
.DDR3_0_ck_p (DDR3_0_ck_p ),
.DDR3_0_cke (DDR3_0_cke ),
.DDR3_0_dm (DDR3_0_dm ),
.DDR3_0_dq (DDR3_0_dq ),
.DDR3_0_dqs_n (DDR3_0_dqs_n ),
.DDR3_0_dqs_p (DDR3_0_dqs_p ),
.DDR3_0_odt (DDR3_0_odt ),
.DDR3_0_ras_n (DDR3_0_ras_n ),
.DDR3_0_reset_n (DDR3_0_reset_n ),
.DDR3_0_we_n (DDR3_0_we_n ),
.ddr3_ok (ddr3_ok ),
.clk_in1_0 (clk_27m ),
.ui_clk_0 (ui_clk_200m ),
.rst_n (rst_n ),
.ud_r_0_ud_rclk (ud_r_0_ud_rclk ),
.ud_r_0_ud_rdata(ud_r_0_ud_rdata),
.ud_r_0_ud_rde (ud_r_0_ud_rde ),
.ud_r_0_ud_rvs (ud_r_0_ud_rvs ),
.ud_w_0_ud_wclk (ud_w_0_ud_wclk ),
.ud_w_0_ud_wdata(ud_w_0_ud_wdata),
.ud_w_0_ud_wde (ud_w_0_ud_wde ),
.ud_w_0_ud_wvs (ud_w_0_ud_wvs )
);
helai_sdi_driver u_helai_sdi_driver(
.I_SDI_2_N (I_SDI_2_N ),
.I_SDI_2_P (I_SDI_2_P ),
.O_SDI_2_N (),
.O_SDI_2_P (),
.SDI_GTX_CLK_148_5_N (SDI_GTX_CLK_148_5_N ), // MGT REFCLKs 148.5 MHz clock
.SDI_GTX_CLK_148_5_P (SDI_GTX_CLK_148_5_P ),
.SDI_GTX_CLK_148_35_P(SDI_GTX_CLK_148_35_P), // MGT REFCLKs 148.35 MHz clock
.SDI_GTX_CLK_148_35_N(SDI_GTX_CLK_148_35_N),
.o_vout_clk (o_vout_clk ),
.o_vout_hs (o_vout_hs ),
.o_vout_vs (o_vout_vs ),
.o_vout_de (o_vout_de ),
.o_vout_rgb (o_vout_rgb )
);
clk_wiz_1 clk_hdmi (
.clk_hdmi(clk_hdmi), // output clk_hdmi
.clk_hdmi_clkx5(clk_hdmix5), // output clk_hdmi_clkx5
.locked(hdmi_rstn), // output locked
.clk_in1(o_vout_clk) // input clk_in1
);
video_timing_control vga(
.i_clk (clk_hdmi ),
.i_rst_n(hdmi_rstn),
.i_rgb (i_vga_rgb),
.o_hs (o_vga_hs ),
.o_vs (o_vga_vs ),
.o_de (o_vga_de ),
.o_rgb (o_vga_rgb)
);
helai_hdmi_out(
.clk_hdmi (clk_hdmi ),
.clk_hdmix5 (clk_hdmix5 ),
.reset_n (hdmi_rstn ),
.i_vga_hs (o_vga_hs ),
.i_vga_vs (o_vga_vs ),
.i_vga_de (o_vga_de ),
.i_vga_rgb (o_vga_rgb ),
.o_hdmi_clk_p (HDMI_CLK_P ),
.o_hdmi_clk_n (HDMI_CLK_N ),
.o_hdmi_data_p(HDMI_DATA_P),
.o_hdmi_data_n(HDMI_DATA_N)
);
endmodule
FPGA逻辑资源消耗和功耗如下:
5、上板调试验证并演示
输出演示视频如下:
FPGA纯verilog解码SDI视频
6、福利:工程代码的获取
福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
网盘资料如下:
FPGA纯verilog实现任意分辨率视频输出显示,高度贴近真实项目,提供工程源码和技术支持
目录
1、前言
本设计使用纯Verilog代码实现,重点在于基于AXI协议的DDR控制器的运用,理论上讲,只要有AXI协议的FPGA均可使用,比如Xilinx、国产紫光同创等;
本设计主要解决非VESA协议分辨率视频的显示问题,高度贴近真实项目,适用于医疗、竣工等图像相关项目。
2、视频显示的VESA协议
视频显示行业有一个国际标准,那就是VESA协议;
视频电子标准协会(Video Electronics Standards Association, VESA)是由代表来自世界各地的、享有投票权利的140多家成员公司的董事会领导的非盈利国际组织,总部设立于加利福尼亚州的Milpitas,自1989年创立以来,一直致力于制订并推广显示相关标准。
VESA标准详细规定了每一种输出分辨率的时钟和数据组成,FPGA设计输出视频时序时就是参考了VESA标准,比如1080P、720P等;
典型的VESA时序如下:
行显示时序:
HSYNC:行同步信号,当此信号有效的时候就表示开始显示新的一行数据;
册可以知道此信号是低电平有效还是高电平有效,图 为低电平有效。
HSPW:行同步信号宽度,也就是 HSYNC 信号持续时间。HSYNC 信号不是一个脉冲,而是需要持续一段时间才是有效的,单位为 CLK。
HBP:行显示后沿(或后肩),单位是 CLK。
HOZVAL:行有效显示区域,即显示一行数据所需的时间,假如屏幕分辨率为 1024*600,那么 HOZVAL 就是 1024,单位为 CLK。
HFP:行显示前沿(或前肩),单位是 CLK。
当 HSYNC 信号发出以后,需要等待 HSPW+HBP 个 CLK 时间才会接收到真正有效的像素数据。当显示完一行数据以后需要等待 HFP 个 CLK 时间才能发出下一个 HSYNC 信号,所以显示一行所需要的时间就是:HSPW + HBP + HOZVAL + HFP。
一帧图像就是由很多个行组成的,帧显示时序如图:
VSYNC:帧(场)同步信号,当此信号有效的时候就表示开始显示新的一帧数据;
VSPW:帧同步信号宽度,也就是 VSYNC 信号持续时间,单位为 1 行的时间。
VBP:帧显示后沿(或后肩),单位为 1 行的时间。
LINE:帧有效显示区域,即显示一帧数据所需的时间,假如屏幕分辨率为 1024*600,那么 LINE 就是600 行的时间。
VFP:帧显示前沿(或前肩),单位为 1 行的时间。
显示一帧所需要的时间就是:VSPW+VBP+LINE+VFP 个行时间,最终的计算公式:
T = (VSPW+VBP+LINE+VFP) * (HSPW + HBP + HOZVAL + HFP)
FPGA做图像输出显示必须遵守此协议;
3、VESA协议的bug
VESA协议定义了很多种分辨率,具体请查看手册;
但有个bug,加入我的视频分辨率是500x500这样的呢?在VESA协议找不到这样的分辨率,那我们怎么写输出分辨率的代码呢?
当然,这种问题怎么可能难道FPGA工程师呢,请往下面看。。。
4、FPGA实现任意分辨率视频输出显示
设计方案如下:
这里加入要输出的分辨率为500x500,VESA协议里没有;
我们设计输出分辨率为标准的1920x1080的VESA协议分辨率;
将分辨率为500x500的视频写入DDR3中做三帧缓存;
写数据是一行写1920个像素,但只有前500个是有效的数据;
一帧图像共写1080行这样的数据,但只有前500行是有效的;
读数据是直接读取1920x1080的图像;
但规定有效区域只有500x500,其他区域为黑色或者其他;
这样就达到了上图的输出效果;
即在1920x1080的黑色背景下输出500x500的视频;
由于ov5640摄像头500x500输出的效果不好,这是ov5640自身决定的,所以我们的工程采用ov5640摄像头缩放至800x800作为例子;
5、FDMA实现数据缓存
关于FDMA三帧缓存,请参考我之前写的文章点击查看:FDMA三帧缓存方案
这里,我们将FDMA做了修改,使得输入分辨率由原来的参数类型变为输入类型,这样的好处时方便配置;
6、vivado工程详解
开发板:Xilinx Artix7开发板;
开发环境:vivado2019.1;
输入:ov5640摄像头,分辨率800x800;
输出:HDMI,分辨率1920x1080;
工程BD如下:
这里,我们将FDMA做了修改,使得输入分辨率由原来的参数类型变为输入类型,这样的好处时方便配置;
工程代码架构如下:
顶层代码如下:
`timescale 1ns / 1ps
module top(
//ddr3
output [14:0]DDR3_0_addr,
output [2:0]DDR3_0_ba ,
output DDR3_0_cas_n ,
output [0:0]DDR3_0_ck_n ,
output [0:0]DDR3_0_ck_p ,
output [0:0]DDR3_0_cke ,
output [0:0]DDR3_0_cs_n ,
output [3:0]DDR3_0_dm ,
inout [31:0]DDR3_0_dq ,
inout [3:0]DDR3_0_dqs_n ,
inout [3:0]DDR3_0_dqs_p ,
output [0:0]DDR3_0_odt ,
output DDR3_0_ras_n ,
output DDR3_0_reset_n ,
output DDR3_0_we_n ,
input CLK_IN1_D_0_clk_n,
input CLK_IN1_D_0_clk_p,
output ddr3_ok ,
inout cmos_scl, //cmos i2c clock
inout cmos_sda, //cmos i2c data
input cmos_vsync, //cmos vsync
input cmos_href, //cmos hsync refrence,data valid
input cmos_pclk, //cmos pxiel clock
output cmos_xclk, //cmos externl clock
input [7:0]cmos_db, //cmos data
output cmos_rst_n, //cmos reset
output cmos_pwdn, //cmos power down
inout hdmi_scl , //HDMI I2C clock
inout hdmi_sda , //HDMI I2C data
//hdmi_out
output vout_hs , //horizontal synchronization for 9134
output vout_vs , //vertical synchronization for 9134
output vout_de , //data valid for 9134
output vout_clk , //clock for 9134
output[23:0] vout_data , //data for 9134
output hdmi_nreset
);
wire clk_25m ;
wire clk_200m ;
wire clk_hdmi ;
wire pll_resetn;
wire [0:0] resetn;
wire ud_r_0_ud_rclk;
wire [31:0] ud_r_0_ud_rdata;
wire ud_r_0_ud_rde;
wire ud_r_0_ud_rvs;
wire ud_w_0_ud_wclk;
wire [31:0] ud_w_0_ud_wdata;
wire ud_w_0_ud_wde;
wire ud_w_0_ud_wvs;
wire ui_clk_100m;
wire [9:0] lut_index;
wire [31:0] lut_data;
wire [9:0] lut_index_hdmi;
wire [31:0] lut_data_hdmi ;
wire [23:0] ov5640_rgb;
wire ov5640_de ;
wire ov5640_vs ;
wire o_data_req;
wire [23:0] i_rgb;
wire o_hs ;
wire o_vs ;
wire o_de ;
wire [23:0] o_rgb;
wire hdmi_clk_rstn;
assign hdmi_nreset =pll_resetn;
//assign hdmi_in_nreset=pll_resetn;
assign ud_w_0_ud_wclk =cmos_pclk ;
assign ud_w_0_ud_wvs =ov5640_vs ;
assign ud_w_0_ud_wde =ov5640_de ;
assign ud_w_0_ud_wdata=ov5640_rgb[7:0],ov5640_rgb[15:8],ov5640_rgb[23:16];
assign ud_r_0_ud_rclk=clk_hdmi;
assign ud_r_0_ud_rvs=o_vs;
assign ud_r_0_ud_rde=o_data_req;
assign i_rgb=ud_r_0_ud_rdata[23:0];
assign vout_clk=clk_hdmi;
assign vout_hs=o_hs;
assign vout_vs=o_vs;
assign vout_de=o_de;
assign vout_data=o_rgb;
assign cmos_rst_n = 1'b1;
assign cmos_pwdn = 1'b0;
i2c_config i2c_config_ov5640(
.rst (~pll_resetn ),
.clk (clk_200m ),
.clk_div_cnt (16'd500 ),
.i2c_addr_2byte (1'b1 ),
.lut_index (lut_index ),
.lut_dev_addr (lut_data[31:24]),
.lut_reg_addr (lut_data[23:8] ),
.lut_reg_data (lut_data[7:0] ),
.error ( ),
.done ( ),
.i2c_scl (cmos_scl ),
.i2c_sda (cmos_sda )
);
ov5640_reg_cfg #(
.DISPAY_H(800),
.DISPAY_V(800 )
)
u_ov5640_reg_cfg(
.lut_index(lut_index), //Look-up table address
.lut_data (lut_data ) //Device address (8bit I2C address), register address, register data
);
i2c_config i2c_config_hdmi(
.rst (~pll_resetn ),
.clk (clk_200m ),
.clk_div_cnt (16'd500 ),
.i2c_addr_2byte (1'b0 ),
.lut_index (lut_index_hdmi ),
.lut_dev_addr (lut_data_hdmi[31:24]),
.lut_reg_addr (lut_data_hdmi[23:8] ),
.lut_reg_data (lut_data_hdmi[7:0] ),
.error ( ),
.done ( ),
.i2c_scl (hdmi_scl ),
.i2c_sda (hdmi_sda )
);
lut_hdmi u_lut_hdmi(
.lut_index(lut_index_hdmi), //Look-up table address
.lut_data (lut_data_hdmi) //Device address (8bit I2C address), register address, register data
);
uiSensorRGB565 u_uiSensorRGB565(
.cmos_clk_i (clk_25m),//cmos senseor clock.
.rst_n_i (resetn ),//system reset.active low.
.cmos_pclk_i (cmos_pclk),//input pixel clock.
.cmos_href_i (cmos_href),//input pixel hs signal.
.cmos_vsync_i(cmos_vsync),//input pixel vs signal.
.cmos_data_i (cmos_db),//data.
.cmos_xclk_o (cmos_xclk),//output clock to cmos sensor.
.rgb_o (ov5640_rgb),
.de_o (ov5640_de ),
.vs_o (ov5640_vs ),
.hs_o ()
);
design_1_wrapper u_design_1_wrapper
(
.CLK_IN1_D_0_clk_n(CLK_IN1_D_0_clk_n),
.CLK_IN1_D_0_clk_p(CLK_IN1_D_0_clk_p),
.DDR3_0_addr (DDR3_0_addr ),
.DDR3_0_ba (DDR3_0_ba ),
.DDR3_0_cas_n (DDR3_0_cas_n ),
.DDR3_0_ck_n (DDR3_0_ck_n ),
.DDR3_0_ck_p (DDR3_0_ck_p ),
.DDR3_0_cke (DDR3_0_cke ),
.DDR3_0_cs_n (DDR3_0_cs_n ),
.DDR3_0_dm (DDR3_0_dm ),
.DDR3_0_dq (DDR3_0_dq ),
.DDR3_0_dqs_n (DDR3_0_dqs_n ),
.DDR3_0_dqs_p (DDR3_0_dqs_p ),
.DDR3_0_odt (DDR3_0_odt ),
.DDR3_0_ras_n (DDR3_0_ras_n ),
.DDR3_0_reset_n (DDR3_0_reset_n ),
.DDR3_0_we_n (DDR3_0_we_n ),
.clk_200m (clk_200m ),
.clk_hdmi (clk_hdmi ),
.ddr3_ok (ddr3_ok ),
.pll_resetn (pll_resetn ),
.resetn (resetn ),
.ud_r_0_ud_rclk (ud_r_0_ud_rclk ),
.ud_r_0_ud_rdata (ud_r_0_ud_rdata ),
.ud_r_0_ud_rde (ud_r_0_ud_rde ),
.ud_r_0_ud_rempty (ud_r_0_ud_rempty ),
.ud_r_0_ud_rvs (ud_r_0_ud_rvs ),
.ud_w_0_ud_wclk (ud_w_0_ud_wclk ),
.ud_w_0_ud_wdata (ud_w_0_ud_wdata ),
.ud_w_0_ud_wde (ud_w_0_ud_wde ),
.ud_w_0_ud_wfull (ud_w_0_ud_wfull ),
.ud_w_0_ud_wvs (ud_w_0_ud_wvs ),
.ui_clk_100m (ui_clk_100m ),
.clk_25m (clk_25m ),
.FDMA_XSIZE_0 (800 ),
.FDMA_YSIZE_0 (800 )
);
video_timing_control vga(
.i_clk (clk_hdmi ),
.i_rst_n (pll_resetn ),
.i_start_x (0),
.i_start_y (0),
.i_disp_h (800),
.i_disp_v (800),
.i_rgb (i_rgb ),
.o_hs (o_hs ),
.o_vs (o_vs ),
.o_de (o_de ),
.o_rgb (o_rgb ),
.o_data_req(o_data_req )
);
endmodule
7、上板调试验证并演示
输出静态展示和动态展示如下:
FPGA纯verilog实现任意分辨率视频输出显示,提供工程
8、福利:工程代码的获取
福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
网盘资料如下:
以上是关于FPGA纯verilog解码SDI视频 纯逻辑资源实现 提供2套工程源码和技术支持的主要内容,如果未能解决你的问题,请参考以下文章
FPGA纯verilog代码解码CameraLink视频,附带工程源码和技术支持
FPGA纯verilog代码实现jpg解码rgb并输出显示,私我提供工程源码
FPGA纯verilog代码实现4路视频缩放拼接 提供工程源码和技术支持
FPGA纯verilog实现任意分辨率视频输出显示,高度贴近真实项目,提供工程源码和技术支持