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

目录

第一部分、实验结果

 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博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Vue全家桶高仿小米商城】——(四)项目基础架构

第四章&#xff1a;项目基础架构 此章节全力讲解前端基本项目架构&#xff0c;通过此章节可搭建一个通用性的前端架构&#xff0c;内容涵盖跨域方案、路由封装、错误拦截等。 文章目录 第四章&#xff1a;项目基础架构一、前端跨域解决什么是前端跨域&#xff1f;怎么解决前端…

项目调研丨多区块并行处理公链 Transformers 研究报告

目录 一、项目简介 二、项目愿景 三、特色和优势 &#xff08;1&#xff09;速度 &#xff08;2&#xff09;安全 &#xff08;3&#xff09;可扩展性 &#xff08;4&#xff09;高度定制 &#xff08;5&#xff09;不可篡改 &#xff08;6&#xff09;所有数据公开透…

自然语言处理从入门到应用——动态词向量预训练:双向语言模型

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 对于给定的一段输入文本 w 1 w 2 ⋯ w n w_1w_2\cdots w_n w1​w2​⋯wn​&#xff0c;双向语言模型从前向&#xff08;从左到右&#xff09;和后向&#xff08;从右到左&#xff09;两个方向同时建立语言模型。这样做…

论文阅读 - SegFormer

文章目录 1 概述2 模型说明2.1 总体结构2.2 Hierarchical Transformer Encoder2.3 Lightweight All-MLP Decoder 3 SegFormer和SETR的比较参考资料 1 概述 图像分割任务和图像分类任务是非常相关的&#xff0c;前者是像素级别的分类&#xff0c;后者是图像级别的分类。基于分类…

ARM、ARM架构、ARM架构芯片

ARM是一种基于精简指令集&#xff08;RISC&#xff09;的处理器架构&#xff0c;它由英国的ARM公司设计和授权。 ARM芯片具有低功耗、高性能、高集成度等特点&#xff0c;广泛应用于嵌入式系统、移动设备、物联网、服务器等领域。本文将介绍ARM的各类芯片&#xff0c;包括其特…

卷积神经网络中池化层的详细介绍

卷积神经网络自2012年&#xff0c;到2023年经历了翻天覆地的变化。最早的卷积神经网络由卷积层、池化层和全连接层所构成。其中卷积层用于提取图像的特征&#xff0c;池化层削减特征数量&#xff0c;全连接层用于对特征进行非线性组合并预测类别。然而在transformer横行的年代&…

基于卡尔曼滤波进行四旋翼动力学建模(SimulinkMatlab)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

笔记本电脑介绍:记录生活,激发灵感

笔记本电脑是一种轻便、便携的电脑&#xff0c;它的出现改变了人们的工作和生活方式&#xff0c;它的优势在于它的小巧、轻便、便携性&#xff0c;可以满足用户的不同需求。本文将从笔记本电脑的结构、功能、优势和应用四个方面进行详细阐述。 一、笔记本电脑的结构 笔记本电…

十八、网络基础(一)

文章目录 一、协议&#xff08;一&#xff09;前置&#xff08;二&#xff09;协议分层1.软件分层2.协议分层3.OSI七层模型4.TCP/IP五层(或四层)模型&#xff08;1&#xff09;物理层:&#xff08;2&#xff09;数据链路层:&#xff08;3&#xff09;数据链路层:&#xff08;4&…

Golang每日一练(leetDay0104) 最小高度树、戳气球

目录 310. 最小高度树 Minimum Height Trees &#x1f31f;&#x1f31f; 312. 戳气球 Burst Balloons &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一…

普通单目相机标定

前言 这里我们还是以普通相机为例(非鱼眼相机)来进行后续的相关标定操作,再回顾下相机的成像模型如下所示。 已知相机内参(fx,fy,u0,v0),畸变系数[k1,k2,k3,p1,p2],相机外参[R|T]。世界坐标系中点Pw(Xw,Yw,Zw),投影至像素坐标系点p(u,v)的计算过程如下。 1)由世…

Qt下使用QPainter实现界面上饼状图、圆环图的绘制

文章目录 前言一、示例讲解二、圆环图绘制步骤三、设置圆环图数据四、示例完整代码五、下载链接总结 前言 前面的文章有讲述使用Qt下的Charts 模块来进行饼图的绘制&#xff1a;QChart实现ui界面上指定位置饼状图、圆环图的绘制&#xff0c;但是使用过程中并不能很好的实现自己…

【LeetCode】动态规划 刷题训练(二)

文章目录 62. 不同路径题目解析状态转移方程完整代码 63. 不同路径 II题目解析状态转移方程完整代码 剑指 Offer 47. 礼物的最大价值题目解析状态转移方程完整代码 62. 不同路径 点击查看&#xff1a;不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图…

数据库架构是否该随着公司估值一起变化?

原文&#xff5c;The growing pains of database architecture 作者&#xff5c;Tim Liang, Software Engineer at Figma 2020 年&#xff0c;因为 Figma 不断加入新功能&#xff0c;筹备第二条产品线和用户不断增长导致数据库流量每年以 3x 速度增长&#xff0c;我们的基础设…

云原生之深入解析Kubernetes中Kubectl Top如何进行资源监控

一、Kubectl top 的使用 kubectl top 是基础命令&#xff0c;但是需要部署配套的组件才能获取到监控值&#xff1a; 1.8 以下&#xff1a;部署 heapter&#xff1b; 1.8 以上&#xff1a;部署 metric-server&#xff1b; kubectl top node&#xff1a;查看 node 的使用情况&a…

【C++】构造函数调用规则

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01;时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 1、缘起 &#xff08;1&#xff09;默认情况下&#xff0c;C 编译器至少给一个类添加 3 个函数 ① 默认构造函数&#xff08;无参&#…

开源软件介绍——国内和国际主要开源社区

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来看一看国内和国际上有哪些主要开源社区。 开源社区的定义 开源社区又称为开放源代码社区&#xff0c;一般由拥有共同兴趣爱好的人组成。根据相应的开源软件许可证协议公布软件源代码的网络平台&a…

ChatGPT从入门到精通,深入认识ChatGPT

ChatGPT从入门到精通&#xff0c;一站式掌握办公自动化/爬虫/数据分析和可视化图表制作 全面AI时代就在转角 道路已经铺好了 “局外人”or“先行者” 就在此刻 等你决定1、ChatGPT从入门到精通&#xff0c;一站式掌握办公自动化/爬虫/数据分析和可视( 点击观看完整版本 )https…

Clickhouse之物化视图分享

前言 ClickHouse广泛用于用户和系统日志查询场景中&#xff0c;主要针对于OLAP场景&#xff0c;为业务方提供稳定高效的查询服务。在业务场景下&#xff0c;数据以不同的格式、途径写入到clickhouse。用传统JOIN方式查询海量数据&#xff0c;通常有如下痛点: 每个查询的代码冗…

CTFshow-pwn入门-前置基础pwn23-pwn25

pwn23-25的题目会涉及到ret2shellcode、ret2libc等内容&#xff0c;本篇文章只会侧重研究这几道题目的wp&#xff0c;不会过多涉及到ret2shellcode、ret2libc的基本原理&#xff0c;等有时间再来写关于ret2libc、ret2shellcode…的相关内容。大家可以参考CTFwiki的文章去慢慢学…