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

这篇具有很好参考价值的文章主要介绍了【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、横的三色彩条效果

fpga驱动,FPGA的学习之旅,fpga开发

  2、竖的三色彩条效果

fpga驱动,FPGA的学习之旅,fpga开发

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

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

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

1、VGA分辨率问题        

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

fpga驱动,FPGA的学习之旅,fpga开发

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

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

2、VGA驱动波形

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

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

fpga驱动,FPGA的学习之旅,fpga开发

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

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

fpga驱动,FPGA的学习之旅,fpga开发

fpga驱动,FPGA的学习之旅,fpga开发

         2.3、每个区域对应的时间

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

fpga驱动,FPGA的学习之旅,fpga开发

        2.4、不同分辨率的表格

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

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

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

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

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

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

fpga驱动,FPGA的学习之旅,fpga开发

3、VGA扫描范围问题

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

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

fpga驱动,FPGA的学习之旅,fpga开发

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

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

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

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

fpga驱动,FPGA的学习之旅,fpga开发

第四部分、VGA的驱动代码

1、top-down结构图:

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

fpga驱动,FPGA的学习之旅,fpga开发

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博客文章来源地址https://www.toymoban.com/news/detail-727357.html

到了这里,关于【FPGA入门】第七篇、FPGA实现VGA接口驱动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA入门系列14--VGA

    文章简介 本系列文章主要针对FPGA初学者编写,包括FPGA的模块书写、基础语法、状态机、RAM、UART、SPI、VGA、以及功能验证等。将每一个知识点作为一个章节进行讲解,旨在更快速的提升初学者在FPGA开发方面的能力,每一个章节中都有针对性的代码书写以及代码的讲解,可作

    2024年02月03日
    浏览(21)
  • FPGA学习——VGA显示

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

    2024年02月04日
    浏览(26)
  • FPGA--OV7725摄像头采集与VGA显示实验--1--OV7725使用与驱动协议

    目录        前言 OV7725引脚及功能框图 参数指标 引脚 功能框图 SCCB时序及读写操作  SCCB时序特点 读写实现 OV7725寄存器常用配置参数              摄像头采集是图像处理的第一步,本章节分为多部分,旨在让大家学会如何使用OV7725采集图像,并且使用VGA协议显示出来。

    2023年04月08日
    浏览(43)
  • FPGA学习笔记:verilog基础代码与modelsim仿真(六)——vga显示模块

    VGA显示 目标:实现屏幕红、橙、黄、绿、青、蓝、紫、黑、白、灰条形显示 1. 模块框图与波形图 vga_colorbar是实现目标功能的总体模块框图,为了实现对应的输出,我们使用三个具体功能模块实现功能。 (1) clk_gen——使用pll锁相环实现时钟分频 (2)vga_ctrl——图像控制与输出模

    2024年02月04日
    浏览(30)
  • fpga中Spartan6系列开发板和VGA显示实现贪吃蛇游戏设计

    鱼弦:CSDN内容合伙人、CSDN新星导师、全栈领域创作新星创作者 、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen) 需要用ise 14.7,板卡为spantan6系列,VGA显示实现贪吃蛇游戏的设计 ,需要一整套工程文件。 1.实现贪吃蛇游

    2024年02月03日
    浏览(45)
  • FPGA纯verilog实现UDP协议栈,GMII接口驱动88E1111,提供工程源码和技术支持

    目前网上的fpga实现udp基本生态如下: 1:verilog编写的udp收发器,但中间的FIFO或者RAM等调用了IP,或者不带ping功能,这样的代码功能正常也能用,但不带ping功能基本就是废物,在实际项目中不会用这样的代码,试想,多机互联,出现了问题,你的网卡都不带ping功能,连基本的

    2024年02月13日
    浏览(29)
  • FPGA纯verilog实现10G UDP协议栈,XGMII接口UltraScale GTY驱动,提供工程源码和技术支持

    目前网上的fpga实现udp基本生态如下: 1:verilog编写的udp收发器,但中间的FIFO或者RAM等调用了IP,或者不带ping功能,这样的代码功能正常也能用,但不带ping功能基本就是废物,在实际项目中不会用这样的代码,试想,多机互联,出现了问题,你的网卡都不带ping功能,连基本的

    2024年02月14日
    浏览(25)
  • FPGA实现Aurora 8B/10B接口(5)--官方例程学习(Framing接口)

    文章目录 1、IP核定制与官方例程的生成 1.1、第一页配置:物理层以及链路层信息选择

    2024年02月09日
    浏览(22)
  • 【FPGA开发】VGA彩条显示及VGA白块位移

    为了理解VGA的工作模式,并且进行vga一部分的模板开发,方便后续图像处理显示的需求。这里通过对vga时序进行分析,进行简单的vga图像控制。实验阶段进行的是640*480@60hz的分辨率和刷新率,后续因为需要适应显示器的规格。会在模块化的阶段进行参数的重新分配,变成可编

    2024年01月21日
    浏览(27)
  • FPGA入门学习笔记(十三)Vivado实现按键消抖

    四种状态 按键未按下:静止状态呈高电平; 按下过程中:抖动状态呈高低电平; 按键已按下:静止状态呈低电平; 释放过程中:抖动状态呈高低电平。 按键消抖思路 :区别于单片机使用20ms延时判断电平正负,FPGA中采用电平保持计时,若时间长度超过20ms则认为发生了一次

    2024年02月04日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包