基于FPGA的实时图像处理系统(2)——VGA显示彩条和图片

VGA显示彩条和图片

文章目录

  • VGA显示彩条和图片
    • 一、VGA简介
    • 二、功能设计
      • 1、彩条设计
      • 2、图片设计
    • 三、结果展示
    • 四、代码

一、VGA简介

VGA(Video Graphics Array)是IBM在1987年随PS/2机⼀起推出的⼀种视频,具有分辨率⾼、显⽰速率快、颜⾊丰富等优点,在彩 ⾊显⽰器领域得到了⼴泛的应⽤。不⽀持热插拔,不⽀持⾳频传输。对于⼀些嵌⼊式VGA显⽰系统,可以在不使⽤VGA显⽰卡和计算机的 情况下,实现VGA图像的显⽰和控制。VGA显⽰器具有成本低、结构简单、应⽤灵活的优点。

VGA的显示原理是:CRT (阴极射线管)以“Z”型扫描的方式将阴极射线枪发出的电子束打在涂有荧光粉的灾光屏上,广土RUD 4日方换行的过程中,电下L一行,电子枪都要回到屏幕的下一行左边的起始位置,并且在换行的过程中,电子枪需要消隐,避免破坏已经成像的像素。

在这里插入图片描述
标准的VGA接口是15针的D型接口,分成3排,每排5个孔,是显卡上应用最为广泛的接口类型,绝大多数显卡都带有此种接口。它传输红、绿、蓝模拟信号以及同步信号(水平同步信号和垂直同步信号)。

在这里插入图片描述
VGA的时序包括同步信号、消隐区,还有颜色数据的输出。行场时序均可分为4部分:同步脉冲、显示后沿、显示时序、显示前沿。

行扫描时序:

在这里插入图片描述
同步脉冲a:代表新一行像素扫描的开始,同时也是上一行扫描的结束。
显示时序c:是真正图像的显示区域,在此阶段,像素逐个显示出来,即在这一阶段控制红、绿、蓝三基色信号输出对应像素的 RGB值。
显示后沿b和显示前沿d:这两个阶段是消隐时刻,消隐区红、绿、蓝三基色信号都为0(黑色)或根据实际情况处理。

**场扫描时序:**时序与行扫描相同。

在这里插入图片描述
有效区域

在这里插入图片描述

常见VGA分辨率参数表

分辨率像素时钟 (MHz)Active行有效区 (Pixels)Front Porch行显示前沿 (Pixels)Sync Pulse行有效 (Pixels)Back Porch行显示后沿 (Pixels)Total 行总像素(Pixels)Active 场有效区(Lines)Front Porch 场显示前沿(Lines)Sync Pulse 场有效区(Lines)Back Porch 场显示后沿(Lines)Total 场总像素(Lines)
640×480@6025.17564016964880048010233525
800×600@6040.000800401288810566001423628
1280×720@6074.25012801104022016507205520750
1024×768@6065.00010242413616013447683629806
1920×1080@60148.50192088441482200108045361125

本次运用的开发板通过权电阻网络进行数模转换

在这里插入图片描述
可知采用的为RGB565格式。

二、功能设计

在了解了VGA时序之后,即可设计出完整的流程。
通过sw开关控制显示彩条还是显示图片,VGA通过转接线连至PC进行显示。

在这里插入图片描述

1、彩条设计

//colorbar(8个横条纹)
always @(posedge clk or negedge rst_n)begin if(!rst_n)colorbar <= 16'h0000;else beginif((cnt_vsync >= `V_SP + `V_BP) && (cnt_vsync < `V_SP + `V_BP + (`V_AV>>3)))colorbar <= 16'hf8_00;else if((cnt_vsync >= `V_SP + `V_BP + (`V_AV>>3)) && (cnt_vsync < `V_SP + `V_BP + (`V_AV>>2)))colorbar <= 16'hff_e0;else if((cnt_vsync >= `V_SP + `V_BP + (`V_AV>>2)) && (cnt_vsync < `V_SP + `V_BP + ((`V_AV>>2) + (`V_AV>>3))))colorbar <= 16'h04_00;else if((cnt_vsync >= `V_SP + `V_BP + ((`V_AV>>2) + (`V_AV>>3))) && (cnt_vsync < `V_SP + `V_BP + (`V_AV>>1)))colorbar <= 16'h80_10;else if((cnt_vsync >= `V_SP + `V_BP + (`V_AV>>1)) && (cnt_vsync < `V_SP + `V_BP + (`V_AV>>1) + (`V_AV>>3)))colorbar <= 16'h00_1f;else if((cnt_vsync >= `V_SP + `V_BP + (`V_AV>>1) + (`V_AV>>3)) && (cnt_vsync < `V_SP + `V_BP + (`V_AV>>1) + (`V_AV>>2)))colorbar <= 16'hfd_20;else if((cnt_vsync >= `V_SP + `V_BP + (`V_AV>>1) + (`V_AV>>2)) && (cnt_vsync < `V_SP + `V_BP + ((`V_AV>>1) + (`V_AV>>2) + (`V_AV>>3))))colorbar <= 16'hf7_be;else if((cnt_vsync >= `V_SP + `V_BP + (`V_AV>>1) + (`V_AV>>2) + (`V_AV>>3)) && (cnt_vsync < `V_SP + `V_BP + `V_AV))colorbar <= 16'h80_10;else colorbar <= 16'h00_00;end
end

按照vga显示时序,在有效区分成8个等分的区域,显示八个彩条。

2、图片设计

采用一个ROM,将图片数据存入ROM,由于开发板资源有限,图片只能采用一个极小的格式进行存储。

ken_rom	ken_rom_inst (.address ( address ),.clock ( clk ),.q ( data ));always @( posedge clk or negedge rst_n ) beginif ( !rst_n ) beginaddress <= 0;// 复位时清零ROM地址endelse if ( flag_clear_rom_address ) begin //计数满清零address <= 0;endelse if (( (cnt_hsync >= 144) && (cnt_hsync < 233) ) && ((cnt_vsync >= 35) && (cnt_vsync < 161)))begin  //在有效区域内+1address <= address + 1;endelse begin  //无效区域保持address <= address;end
end
assign flag_clear_rom_address = ((address == 11214 - 1) );

(ps:本次主要为验证VGA功能,ROM的地址选择和图片的位图有些缺点)

三、结果展示

开关为01,显示图片(地址有误导致图片错位)

在这里插入图片描述

开关拨到其他位置显示彩条

在这里插入图片描述

四、代码

1、top

module top (input           clk      ,input           rst_n    ,input    [1:0]  sw       ,output          hsync    ,output          vsync    ,output   [15:0] vga_data
);wire  [15:0]  colorbar;
wire  [10:0]  cnt_hsync;
wire  [10:0]  cnt_vsync;
wire  [15:0]  ken_data;color_bar       inst_color_bar(.clk        (clk      ),.rst_n      (rst_n    ),.cnt_hsync  (cnt_hsync),.cnt_vsync  (cnt_vsync),.colorbar   (colorbar )
);vga_driver      inst_vga_driver(.clk        (clk      ),.rst_n      (rst_n    ),.sw         (sw       ),.ken_data   (ken_data ),.colorbar   (colorbar ),.hsync      (hsync    ),.vsync      (vsync    ),.cnt_hsync  (cnt_hsync),.cnt_vsync  (cnt_vsync),.h_vld      (h_vld    ),.v_vld      (v_vld    ),.vga_data   (vga_data )
);picture inst_picture(.clk        (clk),.rst_n      (rst_n),.sw         (sw),.cnt_hsync  (cnt_hsync),.cnt_vsync  (cnt_vsync),.data       (ken_data)
);endmodule

2、color_bar

`include "param.v"   module color_bar( input               clk      ,input               rst_n    ,input       [10:0]	cnt_hsync,input       [10:0]	cnt_vsync,output reg  [15:0]  colorbar      
);//colorbar(8个横条纹)
always @(posedge clk or negedge rst_n)begin if(!rst_n)colorbar <= 16'h0000;else beginif((cnt_vsync >= `V_SP + `V_BP) && (cnt_vsync < `V_SP + `V_BP + (`V_AV>>3)))colorbar <= 16'hf8_00;else if((cnt_vsync >= `V_SP + `V_BP + (`V_AV>>3)) && (cnt_vsync < `V_SP + `V_BP + (`V_AV>>2)))colorbar <= 16'hff_e0;else if((cnt_vsync >= `V_SP + `V_BP + (`V_AV>>2)) && (cnt_vsync < `V_SP + `V_BP + ((`V_AV>>2) + (`V_AV>>3))))colorbar <= 16'h04_00;else if((cnt_vsync >= `V_SP + `V_BP + ((`V_AV>>2) + (`V_AV>>3))) && (cnt_vsync < `V_SP + `V_BP + (`V_AV>>1)))colorbar <= 16'h80_10;else if((cnt_vsync >= `V_SP + `V_BP + (`V_AV>>1)) && (cnt_vsync < `V_SP + `V_BP + (`V_AV>>1) + (`V_AV>>3)))colorbar <= 16'h00_1f;else if((cnt_vsync >= `V_SP + `V_BP + (`V_AV>>1) + (`V_AV>>3)) && (cnt_vsync < `V_SP + `V_BP + (`V_AV>>1) + (`V_AV>>2)))colorbar <= 16'hfd_20;else if((cnt_vsync >= `V_SP + `V_BP + (`V_AV>>1) + (`V_AV>>2)) && (cnt_vsync < `V_SP + `V_BP + ((`V_AV>>1) + (`V_AV>>2) + (`V_AV>>3))))colorbar <= 16'hf7_be;else if((cnt_vsync >= `V_SP + `V_BP + (`V_AV>>1) + (`V_AV>>2) + (`V_AV>>3)) && (cnt_vsync < `V_SP + `V_BP + `V_AV))colorbar <= 16'h80_10;else colorbar <= 16'h00_00;end
endendmodule

3、picture

`include "param.v"module picture(input           clk,input           rst_n,input   [1:0]   sw,input   [10:0]  cnt_hsync,input   [10:0]  cnt_vsync,output  [15:0]  data
);wire    flag_clear_rom_address;reg   [14:0]  address;ken_rom	ken_rom_inst (.address ( address ),.clock ( clk ),.q ( data ));always @( posedge clk or negedge rst_n ) beginif ( !rst_n ) beginaddress <= 0;// 复位时清零ROM地址endelse if ( flag_clear_rom_address ) begin //计数满清零address <= 0;endelse if (( (cnt_hsync >= 144) && (cnt_hsync < 233) ) && ((cnt_vsync >= 35) && (cnt_vsync < 161)))begin  //在有效区域内+1address <= address + 1;endelse begin  //无效区域保持address <= address;end
end
assign flag_clear_rom_address = ((address == 11214 - 1) );
endmodule

4、vga_driver

`include "param.v"   module vga_driver( input               clk      ,input               rst_n    ,input        [1:0]  sw       ,input       [15:0]  colorbar ,   //RGB565   input       [15:0]  ken_data , output              hsync    ,output              vsync    ,output  reg [10:0]	cnt_hsync,output  reg	[10:0]	cnt_vsync,output              h_vld    ,output              v_vld    ,output  reg [15:0]  vga_data
);wire			add_cnt_vsync;
wire			end_cnt_vsync;wire			add_cnt_hsync;
wire			end_cnt_hsync;//行同步always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt_hsync <= 'd0;end else if(add_cnt_hsync)begin if(end_cnt_hsync)begin cnt_hsync <= 'd0;endelse begin cnt_hsync <= cnt_hsync + 1'b1;end end
end assign add_cnt_hsync = 1;
assign end_cnt_hsync = add_cnt_hsync && cnt_hsync == `H_TOTAL -1;//场同步always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt_vsync <= 'd0;end else if(add_cnt_vsync)begin if(end_cnt_vsync)begin cnt_vsync <= 'd0;endelse begin cnt_vsync <= cnt_vsync + 1'b1;end end
end assign add_cnt_vsync = end_cnt_hsync;
assign end_cnt_vsync = add_cnt_vsync && cnt_vsync == `V_TOTAL - 1;//hsync
assign  hsync   =   (cnt_hsync < `H_SP  )? 1'b0 : 1'b1;
//vsync
assign  vsync   =   (cnt_vsync < `V_SP  )? 1'b0 : 1'b1;//h_vld
assign  h_vld   =   (cnt_hsync >= `H_SP + `H_BP) && (cnt_hsync < `H_TOTAL - `H_FP);
//v_vld
assign  v_vld   =   (cnt_vsync >= `V_SP + `V_BP) && (cnt_vsync < `V_TOTAL - `V_FP);//vga_dataalways @(*)begincase(sw)2'b01 : vga_data = (( (cnt_hsync >= 144) && (cnt_hsync < 233) ) && ((cnt_vsync >= 35) && (cnt_vsync < 161))) ? ken_data : 16'h0000;default:vga_data = (h_vld && v_vld) ? colorbar : 16'd0;endcase
endendmodule

5、param

`define PIXEL_640_480
// `define PIXEL_800_600
// `define PIXEL_1920_1080`ifdef PIXEL_640_480
//行同步信号`define H_SP    96`define H_BP    48  //显示后沿`define H_AV    640 //有效区域`define H_FP    16  //显示前沿`define H_TOTAL 800 //总像素//场同步信号`define V_SP    2`define V_BP    33  //显示后沿`define V_AV    480 //有效区域`define V_FP    10  //显示前沿`define V_TOTAL 525 //总像素`elsif PIXEL_800_600
//行同步信号`define H_SP    128`define H_BP    88  //显示后沿`define H_AV    800 //有效区域`define H_FP    40  //显示前沿`define H_TOTAL 1056 //总像素//场同步信号`define V_SP    4`define V_BP    23  //显示后沿`define V_AV    600 //有效区域`define V_FP    1  //显示前沿`define V_TOTAL 628 //总像素`elsif PIXEL_1920_1080
//行同步信号`define H_SP    44`define H_BP    148  //显示后沿`define H_AV    1920 //有效区域`define H_FP    88  //显示前沿`define H_TOTAL 2200 //总像素//场同步信号`define V_SP    5`define V_BP    36  //显示后沿`define V_AV    1080 //有效区域`define V_FP    4  //显示前沿`define V_TOTAL 1125 //总像素
`endif

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

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

相关文章

【网络运维】Linux 文本处理利器:sed 命令

Linux 文本处理利器&#xff1a;sed 命令 sed 简介 sed&#xff08;Stream Editor&#xff09;是一款非交互式的流编辑器&#xff0c;诞生于 1973–1974 年间的贝尔实验室&#xff0c;由 McMahon 开发。它专为文本处理而生&#xff0c;功能强大&#xff0c;是 Linux 文本处理常…

week2-[一维数组]出现次数

week2-[一维数组]出现次数 题目描述 给定 NNN 个整数A1,A2,…,ANA_1,A_2,\ldots,A_NA1​,A2​,…,AN​。请求出这 NNN 个数中出现次数最多的数的出现次数&#xff0c;以及出现次数最少的数的出现次数。 输入格式 读入包括 222 行。第一行只有 111 个整数 NNN&#xff0c;表示数…

力扣 hot100 Day79

215. 数组中的第K个最大元素 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 class…

C++围绕音视频相关的资料都有哪些?如何进行学习

音视频技术涉及的内容广泛而深入。我会根据自己的知识给你提供一个系统性的音视频相关资料梳理&#xff0c;主要分为学习路径与核心知识、开源项目与实战、开发者资源以及热点与趋势几个方面&#xff0c;希望能帮助你高效地学习和探索。 先用一个表格来概览主要的学习方向和资…

AI自动化测试,解决传统自动化测试中​​脚本维护成本高、用例覆盖不全、缺陷发现滞后​​等痛点

AI自动化测试&#xff0c;解决传统自动化测试中​​脚本维护成本高、用例覆盖不全、缺陷发现滞后​​等痛点AI自动化测试通过机器学习&#xff08;ML&#xff09;、自然语言处理&#xff08;NLP&#xff09;、计算机视觉&#xff08;CV&#xff09;等技术&#xff0c;解决了传统…

Laravel 事件与监听器

下面是一个完整的用户注册事件和监听器的实现示例&#xff0c;包含事件、监听器、注册、触发等完整流程。一、软件版本 php: 8.2.20laravel: 11mysql: 8.0.29 二、完整实现过程 1.创建事件 1.1 首先创建用户注册事件 php artisan make:event UserRegistered1.2 编辑app/Events/…

前端 React 实现数据懒加载-滚动触底加载数据

在 React 中使用 Intersection Observer API 实现触底加载分页&#xff08;无限滚动&#xff09;1.基本实现思路 在列表底部放置一个 哨兵元素&#xff08;Sentinel&#xff09;&#xff08;如 <div>&#xff09;。使用 IntersectionObserver 监听该元素是否进入视口&…

MySQL 50 道经典练习题及答案

目录 一、数据表设计与初始化 1. 数据表结构说明 2. 建表语句 3. 插入测试数据 二、练习题及答案 1. 查询 "01" 课程比 "02" 课程成绩高的学生的信息及课程分数 2. 查询同时存在 "01" 课程和 "02" 课程的情况 3. 查询存在 &qu…

电竞护航小程序搭建三角洲俱乐部护航派单小程序开发游戏派单系统定制开发

成品系统&#xff0c;可以快速搭建。功能概述&#xff1a;商家入驻、老板点单、快捷发单、自定义发单、发单列表、管事入驻、订单审核裁决、打手入驻、打手排行榜、邀请排行榜、账户充值、余额提现、成为客服等

MYSQL-增删查改CRUD

目录 &#x1f33f;前言&#xff1a; &#x1f33f;增-C-Create-新增 &#x1f9ca;单行数据全列插入 &#x1f34b;‍&#x1f7e9;语法&#xff1a; &#x1f34b;‍&#x1f7e9;演示&#xff1a; &#x1f9ca;指定列插入 &#x1f34b;‍&#x1f7e9;语法&#xf…

【Loss学习笔记】Focal loss、QFL、DFL、VFL——目标检测定位损失函数详解

文章目录Focal loss&#xff08;2018 ICCV &#xff0c;RetinaNet&#xff09;1、Focal Loss 提出背景问题一&#xff1a;正负样本数量不均衡问题问题二&#xff1a;难分类/易分类样本数量不均衡问题对两个问题的解决2、正负样本数量不均衡问题的解决&#xff1a;Focal loss 的…

nertctl使用了解

测试了几个容器&#xff0c;似乎未对k8s的containerd产生影响&#xff0c;都能访问 再次测试&#xff0c;containerd发生了重启&#xff0c;nrtdctl启动的容器都没了 #### sealos 创建containerd集群 sealos run registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.29…

三、k8s 1.29 之 资源清单

一、什么是资源 资源(Resources) 是指集群中可被分配、管理和调度的各种实体,既包括计算、存储、网络等基础设施资源,也包括 K8s 自身定义的 API 对象(如 Pod、Deployment 等)。这些资源是 K8s 调度和管理工作负载的核心基础。 Kubernetes 中的资源本质上是 “可被操作的…

React中常用的Hook(useEffect、useRef、useMemo、useNavigate、useParams)

React hook1&#xff1a;useEffect 在编程中&#xff0c;副作用是指函数或表达式在执行过程中对外部环境产生影响的行为。例如&#xff1a; 修改外部变量&#xff08;如全局变量、DOM、API 请求、设置定时器等&#xff09; 什么是纯函数&#xff1f; // 纯函数&#xff1a;输入…

关联规则挖掘1:Apriori算法

目录 一、Apriori算法核心原理 1. 基本概念 2. Apriori性质 二、完整案例计算&#xff08;超市购物数据&#xff09; ​步骤1&#xff1a;按字母序重排每笔交易​ ​步骤2&#xff1a;统计频繁1-项集&#xff08;min_support40%&#xff09;​​ ​步骤3&#xff1a;生成…

基于 C++ 线程池的多线程目标检测后处理系统设计与实现

在实际的智能视频分析系统中,目标检测(如 YOLOv5)只是第一步。检测结果往往需要进行后续处理:画框、报警、推流、日志记录等。这些操作如果在检测主线程中同步执行,会严重拖慢整体推理速度。 本文将带你从零实现一个基于 C++ 模板线程池的异步后处理系统,实现“检测与后…

Java并发容器详解

1. JUC并发容器概述 Java集合容器框架主要有四大类别&#xff1a;List、Set、Queue、Map。常见的ArrayList、LinkedList、HashMap等容器都是非线程安全的。 Java提供了同步容器&#xff08;如Vector、Hashtable、SynchronizedList&#xff09;通过synchronized实现同步&#xf…

SpringAI系列---【SpringA集成OllamaI如何先调用向量库,再把查到的结果一起传给大模型?】

SpringAI如何先调用向量库&#xff0c;再把查到的结果一起传给大模型&#xff1f; 1.引入pom <dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-ollama</artifactId></depend…

告别“测试滞后”:AI实时测试工具在敏捷开发中的落地经验

告别“测试滞后”&#xff1a;AI实时测试工具在敏捷开发中的落地经验 在敏捷开发的“快速迭代”节奏中&#xff0c;测试环节常常成为“拖后腿”的短板。某互联网公司的敏捷团队曾陷入这样的循环&#xff1a;2周迭代周期中&#xff0c;开发用10天完成功能&#xff0c;留给测试的…

K8S-Pod资源对象

一、K8S架构与组件1、K8S架构k8s 总体架构采用了经典的 maste/slave 架构模式&#xff0c;分 master 节点和 worker 节点&#xff0c;节点可以是虚拟机也可以是物理机。K8S组件 master 节点组件Kube-apiserver 用于暴露 Kubernetes API&#xff0c;任何资源请求或调用操作都是通…