【FPGA入门】第七篇、FPGA实现VGA接口驱动

news2024/10/7 12:21:12

目录

第一部分、实验结果

 1、横的三色彩条效果

2、竖的三色彩条效果

第二部分、VGA驱动基本知识

1、VGA分辨率问题        

2、VGA驱动波形

2.1、工业标准的时序波形图

2.2、比上面那张图更容易理解的图

2.3、每个区域对应的时间

2.4、不同分辨率的表格

3、VGA扫描范围问题

第三部分、VGA的时序波形图

第四部分、VGA的驱动代码

1、top-down结构图:

2、vga_ctrl.v模块代码:

3、top层代码

第五部分、总结


第一部分、实验结果

 1、横的三色彩条效果

  2、竖的三色彩条效果

第二部分、VGA驱动基本知识

        首先,关于VGA的深层次工作原理可以百度自行了解。

        我的理解比较简单,我记得高中的物理课的时候物理老师有提过老式电视机的显示原理,一般老式电视机的都特别大,而且都有个大屁股,这是因为后面有个电子枪,疯狂的朝着电视的屏幕喷射电子,然后就出现的显示,而且喷射的顺序就是从屏幕的左上角到右下角。而VGA的原理和这个类似。

1、VGA分辨率问题        

        首先不同分辨率对应的驱动程序是稍有区别的,正常情况下显示器都支持很多种分辨率,例如我电脑屏幕现在用的显示器分辨率为1920 * 1080@60Hz。(查看方式:选择 “开始 > 设置 > 系统 > 显示 > 高级显示器 )

         而本次实验选用的分辨率为640*480@60Hz60Hz为刷新频率,也就是1s钟电脑显示60张图片,也就是从电子束从屏幕的左上角到右下角这个过程执行了60次。

        这里发射的过程可以理解为扫描的过程,这样后面理解驱动程序时会简单许多。

2、VGA驱动波形

        2.1、工业标准的时序波形图

                HSync称作行同步信号VSync称作场同步信号或者垂直同步信号

         2.2、比上面那张图更容易理解的图

        图片来源于该篇博客http://t.csdn.cn/Hqvtc,有问题联系我删除​​​​​。这张图翻译了上面每条英文的意思。

         2.3、每个区域对应的时间

        这张图来源于哪一篇博客我忘记了(有问题联系我删除​​​​​),反正是一篇很好的博客,解释的更加透彻,每段时间点都标出来的。

        2.4、不同分辨率的表格

        该图片还是来源于该篇博客http://t.csdn.cn/Hqvtc,有问题联系我删除​​​​​。这个表格解释不同分辨率,同步,后沿等时间的区别。

        当然这里也有一个网址可以参考:VGA Signal Timing (tinyvga.com)

        这里不同分辨率的驱动时钟计算方法如下:

                                 时钟 = 行扫描周期 * 场扫描周期 * 刷新频率

以640*480@60分辨率的计算方式:

                                800 * 525 * 60 = 25,200,000 约等于 25MHz

3、VGA扫描范围问题

         看了上面的表格,不知道大家有没有有个问题,为什么分辨率640*480@60的行扫描为800(像素)而不是640(像素),场扫描为525(行数)而不是480(行数)?

        因为640只是有效图像的像素点长度,除了这些还有其他的也要考虑进去,所有像素点的总和才为800。如下图所示,真正显示在屏幕上的只是灰色区域。

第三部分、VGA的时序波形图

        由上面,关于VGA的时序了解了差不多,这里需要注意的是:行扫描时序要求(单位:像素,即输出一个像素的时间间隔),场扫描时序要求(单位:行,即输出一行的时间间隔)。

        将上面的波形图转换为更容易理解的波形图:

        这里分别引入行扫描计数器和场扫描计数器用来计时
 

第四部分、VGA的驱动代码

1、top-down结构图:

                gen_clk模块为由PLL锁相环产生的25MHz时钟,vga_ctrl为vga的驱动模块。

2、vga_ctrl.v模块代码:

// -----------------------------------------------------------------------------
// Copyright (c) 2014-2023 All rights reserved
// -----------------------------------------------------------------------------
// Author : BigFartPeach
// CSDN   : 大屁桃
// E-mail : 2624507313@qq.com
// File   : vga_ctrl.v
// Create : 2023-06-06 14:23:19
// -----------------------------------------------------------------------------
module vga_ctrl(
	input wire clk_25M,
	input wire rst_n,
	output reg hsync,
	output reg vsync,
	output reg [7:0]rgb
	);
reg [9:0] hsync_cnt;
reg [9:0] vsync_cnt;

//行扫描计数器
always @(posedge clk_25M or negedge rst_n) begin
	if (rst_n == 0) begin
		hsync_cnt <= 'd0;
	end
	else if (hsync_cnt == 'd799) begin
		hsync_cnt <= 'd0;
	end
	else begin
		hsync_cnt <= hsync_cnt + 1'b1;
	end
end

//行同步信号
always @(posedge clk_25M or negedge rst_n) begin
	if (rst_n == 0) begin
		hsync <= 1'b1;
	end
	else if (hsync_cnt == 'd95) begin
		hsync <= 1'b0;
	end
	else if(hsync_cnt == 'd799)begin
		hsync <= 1'b1;
	end
end


//场扫描计数器
always @(posedge clk_25M or negedge rst_n) begin
	if (rst_n == 0) begin
		vsync_cnt <= 'd0;
	end
	else if (vsync_cnt == 'd524 && hsync_cnt == 'd799) begin
		vsync_cnt <= 'd0;
	end
	else if (hsync_cnt == 'd799) begin
		vsync_cnt <= vsync_cnt + 1'b1;
	end
end

//场扫描信号
always @(posedge clk_25M or negedge rst_n) begin
	if (rst_n == 0) begin
		vsync <= 1'b1;	
	end
	else if (hsync_cnt == 'd799 && vsync_cnt == 'd1) begin
		vsync <= 1'b0;
	end
	else if(hsync_cnt == 'd799 && vsync_cnt == 'd524) begin
		vsync <= 1'b1;
	end
end

//RGB信号输出 
always @(posedge clk_25M or negedge rst_n) begin
	if (rst_n == 0) begin
		rgb <= 'b000_000_00;	
	end
	//横彩条
	// else if (hsync_cnt>= 144 && hsync_cnt <= 783 && vsync_cnt>= 35 && vsync_cnt <= 194) begin
	// 	rgb <= 'b111_000_00;//红色
	// end
	// else if (hsync_cnt>= 144 && hsync_cnt <= 783 && vsync_cnt>= 195 && vsync_cnt <= 354)begin
	// 	rgb <= 'b000_111_00;//绿色
	// end
	// else if (hsync_cnt>= 144 && hsync_cnt <= 783 && vsync_cnt>= 355 && vsync_cnt <= 514)begin
	// 	rgb <= 'b000_000_11;//蓝色
	// end
	//竖彩条
	else if (hsync_cnt>= 144 && hsync_cnt <= 356 && vsync_cnt>= 35 && vsync_cnt <= 514) begin
		rgb <= 'b111_000_00;//红色
	end
	else if (hsync_cnt>= 357 && hsync_cnt <= 569 && vsync_cnt>= 35 && vsync_cnt <= 514) begin
		rgb <= 'b000_111_00;//绿色
	end
	else if (hsync_cnt>= 570 && hsync_cnt <= 783 && vsync_cnt>= 35 && vsync_cnt <= 514) begin
		rgb <= 'b000_000_11;//蓝色
	end
	else begin//其它区域
		rgb <= 'b000_000_00;//不显示
	end
end

endmodule

3、top层代码

// -----------------------------------------------------------------------------
// Copyright (c) 2014-2023 All rights reserved
// -----------------------------------------------------------------------------
// Author : BigFartPeach
// CSDN   : 大屁桃
// E-mail : 2624507313@qq.com
// File   : top_vga.v
// Create : 2023-06-06 15:35:13
// -----------------------------------------------------------------------------
module top_vga(
	input wire clk,
	input wire rst_n,
	output wire hsync,
	output wire vsync,
	output wire [7:0] rgb
	);

wire clk_25M;

//PLL产生25M的时钟
gen_clk25 inst_clk25(
	// Clock in ports
	.CLK_IN1(clk),      // IN
	// Clock out ports
	.CLK_OUT1(clk_25M));    // OUT

//例化640*480@60Hz驱动模块
vga_ctrl inst_vga_ctrl (
	.clk_25M(clk_25M),
	.rst_n(rst_n),
	.hsync(hsync),
	.vsync(vsync),
	.rgb(rgb));


endmodule

第五部分、总结

        这里只是实现简单的驱动,后面的这篇文中我将VGA的驱动程序重新修改了一下,使整个程序更容易移植,有需要的哥们可以接着往后看。

        关于这篇文章的工程的代码如下,工程基于ISE软件,没积分的哥们评论留下邮箱即可

        FPGA入门第七篇、FPGA实现VGA接口驱动资源-CSDN文库

        最后,希望我的博客对你有帮助😎😎😎😎,有需要的小伙伴可以查看本专栏更多的往期文章专栏链接如下:FPGA的学习之旅_大屁桃的博客-CSDN博客

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

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

相关文章

【NeRF大总结】基于NeRF的三维视觉年度进展报告

基于NeRF的三维视觉年度进展报告 清华大学&#xff1a;刘烨斌 原文链接&#xff1a;【NeRF大总结】基于NeRF的三维视觉年度进展报告–清华大学刘烨斌 (by 小样本视觉与智能) 目录 文章目录 基于NeRF的三维视觉年度进展报告01 背景介绍NeRFNeRF与三维视觉三维表征与可微渲染…

信号与系统与MATLAB应用(一)

文章目录 前言一、基本信号表示1、周期方波信号2、周期锯齿波信号3、指数函数信号4、抽样函数信号5、单位阶跃信号 二、信号的基本运算1、信号的相加和相乘2、信号的平移3、信号的反折4、信号的尺度变换&#xff08;缩展&#xff09;5、信号的微分和积分未完待续... 前言 说起…

WEBGIS系统整体设计

城市地下电力管线管理系统是一个基于B/S 架构的应用系统。系统的网络拓扑结构如 PostgreSQL 数据库以及文件系统作为数据服务器。另外&#xff0c;使用GeoServer 作为GIS 服务器&#xff0c;提供符合OpenGIS 规定的WFS 、WMS 等协议的GIS 服务。 遵循MVC 的分层设计思想&#x…

第三十四章 开发Productions - ObjectScript Productions - Defining Business Metrics

文章目录 第三十四章 开发Productions - ObjectScript Productions - Defining Business Metrics定义业务指标业务指标简介业务指标属性 单实例和多实例业务指标作为业务服务的业务指标 第三十四章 开发Productions - ObjectScript Productions - Defining Business Metrics 定…

Linux常用命令——ftpwho命令

在线Linux命令查询工具 ftpwho 显示当前每个ftp会话信息 补充说明 ftpwho命令ftp服务器套件proftpd的工作指令&#xff0c;用于显示当前每个ftp会话信息。 语法 ftpwho(选项)选项 -h&#xff1a;显示帮助信息&#xff1b; -v&#xff1a;详细模式&#xff0c;输出更多信…

SpringBoot使用Session防止表单重复提交(提供Gitee源码)

前言&#xff1a;在日常开发中&#xff0c;客户可能会存在反复点击提交按钮导致表单的重复提交&#xff0c;这个问题也是非常需要重视的&#xff0c;在本篇博客中&#xff0c;采用的是session、自定义注解和拦截器的方式来防止重复表单的重复提交&#xff0c;提高整体代码的优雅…

管理类联考——写作——素材篇——论说文——写作素材07——制篇:积累·习惯08——制篇:容让·宽厚

管理类专业学位联考 (写作能力) 论说文素材 07——制篇&#xff1a;积累习惯 论文说材料: 合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于 足下。 ——《老子》 一&#xff1a;道理论据 操千曲而后晓声&#…

HTTP代理出现503错误是什么原因,怎么处理

HTTP代理出现503错误表示代理服务器无法连接到目标服务器或无法获得对目标服务器的响应。这意味着您的请求无法被代理服务器处理&#xff0c;因此您无法访问所请求的网站或资源。 HTTP代理出现503错误的原因 HTTP代理出现503错误可能有以下原因&#xff1a; 1. 代理服务器与目…

基于Springboot+vue的网上商城购物系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

力控软件与S7-200SMART无线PPI通信

在实际系统中&#xff0c;人机界面与PLC通常不在一起&#xff0c;中心计算机一般放置在控制室&#xff0c;而PLC安装在现场车间&#xff0c;二者之间距离往往从几十米到几千米。如果布线的话&#xff0c;需要挖沟施工&#xff0c;比较麻烦&#xff0c;这种情况下比较适合采用无…

awk常用用法详解

作为运维工程师&#xff0c;使用awk来处理日常工作中的文本数据是很常见的。以下是一些常见的awk用法&#xff0c;可以帮助你更高效地处理文本数据&#xff1a; 目录 1. 查看文件的行数 2. 过滤数据 3. 统计数据 4. 格式化输出 1. 查看文件的行数 使用awk可以很快地查看文…

sed命令常用用法详解

sed 是一款流式文本编辑器&#xff0c;通常被用来编辑文本文件、数据流以及管道输入等。作为运维工程师&#xff0c;我们可以使用sed来快速处理文本数据。以下是sed的一些常见用法&#xff1a; 目录 1. 替换文本 2. 插入和删除行 3. 格式化输出 总 结&#xff1a; 1. 替换…

C++基础(6)——类和对象(运算符重载)

前言 本文主要介绍了C中运算符重载的基本知识。 4.5.1&#xff1a;加号运算符重载&#xff08;成员函数和全局函数都可实现&#xff09; 运算符重载&#xff1a;对已有的运算符重新进行定义&#xff0c;赋予其另一种功能&#xff0c;以适应不同的数据类型 1&#xff1a;成员…

如何使用 RestTemplate 调用 RESTful API

如何使用 RestTemplate 调用 RESTful API&#xff1f; 在开发 Web 应用程序时&#xff0c;调用 RESTful API 是一个常见的任务。为了调用 RESTful API&#xff0c;我们需要使用 HTTP 协议向 API 发送请求&#xff0c;并解析 API 返回的响应。为了简化这个过程&#xff0c;可以…

为生信写的Python简明教程 | 视频6

开源生信 Python教程 生信专用简明 Python 文字和视频教程 源码在&#xff1a;https://github.com/Tong-Chen/Bioinfo_course_python 目录 背景介绍 编程开篇为什么学习Python如何安装Python如何运行Python命令和脚本使用什么编辑器写Python脚本Python程序事例Python基本语法 数…

【前端特效篇】过渡与动画

变形和动画都是前端开发过程中&#xff0c;用来提高用户体验的一种方式。增加一些动效&#xff0c;可以使页面看起来不那么枯燥无味。 一、变形 transform transform 属性应用于元素的2D或3D转换。这个属性允许你将元素旋转&#xff0c;缩放&#xff0c;移动&#xff0c;倾斜…

opencloudos安装nginx新版本

opencloudos基本上完全兼容centos的操作&#xff0c;源管理方式也适用的yum。 ​ 装了一个opencloudos之后&#xff0c;想安装一下nginx。 默认的情况下安装使用&#xff1a; yum install nginx不过默认安装的是 1.14 版本&#xff0c;这个版本有几个 http 的漏洞&#xff…

【JUC进阶】03. Java对象头和内存布局

1、前言 为了后面更好的学习锁优化以及运作过程&#xff0c;需要我们对HotSpot虚拟机的Java对象内存布局有一定的了解&#xff0c;也作为技术储备。 2、对象的内存布局 在HotSpot虚拟机中&#xff0c;对象在堆内存中存储的布局可以划分为三个部分&#xff1a;对象头&#xf…

逍遥子All in阿里云,阿里“压舱石”与“秘密武器”接任

激荡中的阿里&#xff0c;又宣布了组织变革的最新进展&#xff1a;张勇将在2023年9月10日卸任阿里巴巴控股集团董事会主席兼CEO职务&#xff0c;此后将专职担任阿里云智能集团董事长兼CEO。蔡崇信将接任阿里集团董事长&#xff0c;吴泳铭出任阿里集团CEO并继续兼任淘天集团董事…

Linux 学习记录37(C高级篇)

Linux 学习记录37(C高级篇) 本文目录 Linux 学习记录37(C高级篇)一、常见的shell解析器二、变量1. shell脚本外部传参2. 输入输出(1. 输出(2. 输入 3. 命令置换符4. shell中的数组 三、shell中的算数运算1. (())运算2. $[ ]运算3. let运算4. expr指令(1.数据运算(3. 字符运算 四…