FPGA纯verilog实现任意分辨率视频输出显示,高度贴近真实项目,提供工程源码和技术支持

news2024/12/24 20:10:25

目录

  • 1、前言
  • 2、视频显示的VESA协议
  • 3、VESA协议的bug
  • 4、FPGA实现任意分辨率视频输出显示
  • 5、FDMA实现数据缓存
  • 6、vivado工程详解
  • 7、上板调试验证并演示
  • 8、福利:工程代码的获取

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名片。
网盘资料如下:
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/344181.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot 整合EasyExcel详解

一、概述 Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内…

内网渗透-src挖掘-互联网打点到内网渗透-2023年2月

1、通过信息搜集&#xff0c;发现目标有一个互联网访问的骑士cms 2、发现该系统骑士cms版本为6.0.20&#xff0c;通过搜索&#xff0c;发现骑士cms < 6.0.48存在任意文件包含漏洞 /Application/Common/Controller/BaseController.class.php 该文件的assign_resume_tpl函数…

字节面试惨败,闭关修炼再战美团(Android 面经~)

作者&#xff1a;王旭 前言 本人从事Android 开发已经有5年了&#xff0c;受末日寒气影响&#xff0c;被迫在家休整&#xff0c;事后第一家选择字节跳动面试&#xff0c;无奈的被面试官虐得“体无完肤”&#xff0c;好在自己并未气馁&#xff0c;于是回家开始回家进行闭关修炼…

使用红黑树模拟实现map和set

在STL的源代码中&#xff0c;map和set的底层原理都是红黑树。但这颗红黑树跟我们单独写的红黑树不一样&#xff0c;它需要改造一下&#xff1a; 改造红黑树 节点的定义 因为map和set的底层都是红黑树。而且map是拥有键值对pair<K,V>的&#xff0c;而set是没有键值对&a…

教育行业需要什么样的数字产品?

数字化转型的浪潮已经席卷了各行各业&#xff0c;不仅出现在互联网、电商、建筑等行业&#xff0c;还应用在了教育行业。数字化的教育ERP软件能够在满足学校需求的基础上&#xff0c;帮助学校完善各类工作流程&#xff0c;提高工作效率。 对于一个拥有多个校区&#xff0c;上万…

ChatGPT 也太火了吧 ...

最近 ChatGPT 太火了&#xff0c;微信指数 ChatGPT 关键词飙升。GitHub 上也不例外&#xff0c;最近热门项目都是 ChatGPT 项目。后续会陆续更新 ChatGPT 好玩的开源项目&#xff0c;本期是本周登上热榜的 Repo&#xff0c;请查收。本期推荐开源项目目录&#xff1a;1. 对 Chat…

ms17-010(永恒之蓝漏洞复现)

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;HW-2023-漏洞复现 &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#xff…

Inception-Resnet-v1、Inception-Resnet-v2学习笔记

Inception-Resnet-v1、Inception-Resnet-v2来自2016年谷歌发表的这篇论文&#xff1a;Inception-v4 Inception-ResNet and the Impact of Residual Connections on Learning&#xff0c;附论文链接&#xff1a; [1602.07261] Inception-v4, Inception-ResNet and the Impact o…

【思维模型】概率思维的价值:找到你的人生算法!打开你的人生格局!实现认知跃迁!

把同样公平的机会放在放在很多人面前,不同的人生算法,会得到迥然不同的结果。 概率思维是什么? 【ChatGPT】概率思维是一种通过使用数学模型来思考和评估不确定性事件的方法。它通过计算不同可能性的概率来预测事件的结果,并评估风险和机会。 概率思维的价值在于它可以帮…

CSS样式表继承和优先级

CSS样式表继承 要想了解css样式表的继承&#xff0c;我们先从文档树&#xff08;HTML DOM&#xff09;开始。文档树由HTML元素组成。 文档树和家族树类似&#xff0c;也有祖先、后代、父亲、孩子和兄弟_。 那么CSS样式表继承指的是&#xff0c;特定的CSS属性向下传递到子孙元…

智能三子棋(人机大战)—— 你会是最终赢家吗?万字讲解让你实现与自己对弈

魔王的介绍&#xff1a;&#x1f636;‍&#x1f32b;️一名双非本科大一小白。魔王的目标&#xff1a;&#x1f92f;努力赶上周围卷王的脚步。魔王的主页&#xff1a;&#x1f525;&#x1f525;&#x1f525;大魔王.&#x1f525;&#x1f525;&#x1f525; ❤️‍&#x1…

2023年湖北建设厅七大员八大员报名怎么收费呢?

建设厅七大员八大员全国统一报名网站&#xff0c;证书全国通用&#xff0c;无需调转&#xff0c;这点还是很方便的&#xff0c;所有在湖北考的证书全国都能用呢。 八大员报考机构很多&#xff0c;收费也是层次不齐&#xff0c;这里需要提醒大家注意的是&#xff0c;咨询八大员的…

如何持续架构治理?我们和 ChatGPT 聊了一会?

在上周的 QCon 北京 2022 大会上&#xff0c;我和我的同事黄雨青一起分享了《组织级架构治理的正确方式》&#xff0c;以帮助开发人员对组织级架构治理体系全貌一瞥&#xff0c;并厘清治理工具的设计思路和核心功能内容。结合我们在 ArchGuard 的探索经验&#xff0c;我们&…

自有APP上如何运行小游戏?

近年来小程序游戏迎来了爆发式增长。微信、支付宝、抖音等各大平台小程序游戏愈加丰富&#xff0c;你是否也让自己的App也拥有运行丰富的小游戏的能力&#xff1f;今天就来带大家看看如何实现。 我们先来看看各互联网巨头关于小游戏生态的特征&#xff1a; 「微信」 率先推出…

open3d点云配准函数registration_icp

文章目录基本原理open3d调用绘图基本原理 ICP, 即Iterative Closest Point, 迭代点算法。 ICP算法有多种形式&#xff0c;其中最简单的思路就是比较点与点之间的距离&#xff0c;对于点云P{pi},Q{qi}P\{p_i\}, Q\{q_i\}P{pi​},Q{qi​}而言&#xff0c;如果二者是同一目标&am…

如何将一张纹理图贴在模型上

前言 小伙伴们是否有过这样的场景:看到一个精美的3D模型&#xff0c;很想知道它是如何被创作出来的&#xff1f;于是开始了一番搜索引擎查找之后&#xff0c;得知需要建模工具来完成&#xff0c;例如3D Max、Maya、Blender、Photoshop。那么本篇就使用这些工具来完成一个精美的…

Redis【包括Redis 的安装+本地远程连接】

Redis 一、为什么要用缓存&#xff1f; 缓存定义 缓存是一个高速数据交换的存储器&#xff0c;使用它可以快速的访问和操作数据。 程序中的缓存 在我们程序中&#xff0c;如果没有使用缓存&#xff0c;程序的调用流程是直接访问数据库的&#xff1b; 如果多个程序调用一个数…

如何在原始的认知上找回自己

认知、欲望加恐惧&#xff0c;这三种要素在我们对一个事物的判断中都在起作用&#xff0c;只不过配比不一样&#xff0c;导致你的判断不一样。我们通常以为有了认知能力&#xff0c;就产生了认知&#xff0c;就如同面前有一个东西&#xff0c;你用照相机拍下来就成了一张照片—…

【算法基础】高精度除法

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前是C语言 算法学习者 ✈️专栏&#xff1a;【C/C】算法 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac…

PN外加电场后电场变化

没有外加电场时&#xff08;下面都是以外加反向电场分析&#xff09; 中间两条实线假设是PN节在没有外加电场的情况下形成的一个内部电场边界。 形成原因 实用的半导体一般是混合物 P型半导体&#xff0c;实际上是一种4价和3价元素的混合物。化学中都知道达到4或8的外层电子…