VGA显示器驱动设计与验证

这篇具有很好参考价值的文章主要介绍了VGA显示器驱动设计与验证。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、介绍

        VGA全称是Video Graphics Array,即视频图形阵列,是模拟信号的一种视频传输标准。VGA就是如今很多显示器上连接主机的信号传输接口,有三排15个引脚,其中比较重要的是3根RGB彩色分量信号和2根扫描同步信号HSYNC和VSYNC针,其引脚编号图如下所示:

VGA显示器驱动设计与验证

引脚

定义 引脚 定义
1 红基色(RED) 9 保留(各厂家定义不同)
2 绿基色(GREEN) 10 数字地(GND)
3 蓝基色(BLUE) 11 地址码0(ID BIT0)
4 地址码2(ID BIT2) 12 地址码1(ID BIT1)
5 自测试(各厂家定义不同) 13 行同步(HSYNC)
6 红色地(RGND) 14 场同步(VSYNC)
7 绿色地(GGND) 15 地址码3(ID BIT3)
8 蓝色地(BGND)

显示器的扫描方式:逐行扫描是扫描从屏幕左上角一点开始,从左像右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT对电子束进行消隐,每行结束时,用行同步信号进行同步;当扫描完所有的行,形成一帧,用场同步信号进行场同步,并使扫描回到屏幕左上方,同时进行场消隐,开始下一帧。

VGA显示器驱动设计与验证

        VGA 的行时序是以像素为单位的,场时序是以行为单位的。VGA时序对同步时间、显示后沿时间、视频有效时间和显示前沿时间有特定要求,常用VGA 分辨率时序参数如下表所示。(a行同步脉冲,b行显示后沿,c行显示时序段,d行显示后沿,e行总时序,场时序类同)

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

        我们一般使用的屏幕分辨率大小是640*480,也包括我们数逻实验室的板子。分辨率可以理解为像素点的个数,640*480的规格就是显示屏幕上每行有640个像素点,总共有480行。注意,一件很重要的事情是,虽然你看到的屏幕大小是640*480的,但是它的实际大小并不只有那么点,形象一点就是说,VGA扫描的范围是包含了你能够看到的640*480这一块区域的更大区域,他会在周围一圈你看不到的区域部分进行扫描,因此,我们在处理扫描信号的时候一定要注意只有扫描到有效区域的时候才能把像素点数据传给VGA显示。

VGA时序标准图

VGA显示器驱动设计与验证

VGA显示器驱动设计与验证

        图中的红色区域表示在一个完整的行扫描周期中,Video图像信息只在此区域有效,黄色区域表示在一个完整的场扫描周期中,Video图像信息只在此区域有效,两者相交的橙色区域,就是VGA图像的最终显示区域。

2、VGA显示器驱动设计与验证

        因为vga的每个显示模式下的时钟频率都不一样,在使用的时候我们需要生成相应的时钟频率,这里我们以640x480@60为例,它的时钟频率为25.175MHZ,这边可以使用两种方式来生成时钟频率,一是调用ip核,二是编写分频的rtl代码。这里选择第一种,我的系统时钟频率为50MHZ,调用ip核产生25MHZ。

        系统RTL视图如下:

VGA显示器驱动设计与验证

 ① 顶层代码

module  vga_colorbar
(
    input   wire            sys_clk     ,   //输入工作时钟,频率50MHz
    input   wire            sys_rst_n   ,   //输入复位信号,低电平有效
    output  wire            hsync       ,   //输出行同步信号
    output  wire            vsync       ,   //输出场同步信号
    output  wire    [15:0]  rgb_rgb             //输出像素信息
);
 
//********************************************************************//
//****************** Parameter and Internal Signal *******************//
//********************************************************************//
//wire define
wire            vga_clk ;   //VGA工作时钟,频率25MHz
wire            locked  ;   //PLL locked信号
wire            rst_n   ;   //VGA模块复位信号
wire    [9:0]   pix_x   ;   //VGA有效显示区域X轴坐标
wire    [9:0]   pix_y   ;   //VGA有效显示区域Y轴坐标
wire    [15:0]  pix_data;   //VGA像素点色彩信息
 
//rst_n:VGA模块复位信号
assign  rst_n = (sys_rst_n & locked);
 
//********************************************************************//
//*************************** Instantiation **************************//
//********************************************************************//
 
//------------- clk_gen_inst -------------
clk_gen clk_gen_inst
(
    .areset    (~sys_rst_n),  //输入复位信号,高电平有效,1bit
    .inclk0    (sys_clk),  //输入50MHz晶振时钟,1bit
    .c0   (vga_clk),  //输出VGA工作时钟,频率25Mhz,1bit
    .locked     (locked)   //输出pll locked信号,1bit
);
 
//------------- vga_ctrl_inst -------------
vga_ctrl  vga_ctrl_inst
(
    .vga_clk    (vga_clk ),  //输入工作时钟,频率25MHz,1bit
    .sys_rst_n  (rst_n ),  //输入复位信号,低电平有效,1bit
    .pix_data   (pix_data),  //输入像素点色彩信息,16bit
    .pix_x      (pix_x),  //输出VGA有效显示区域像素点X轴坐标,10bit
    .pix_y      (pix_y),  //输出VGA有效显示区域像素点Y轴坐标,10bit
    .hsync      (hsync),  //输出行同步信号,1bit
    .vsync      (vsync),  //输出场同步信号,1bit
    .vga_rgb    (vga_rgb)   //输出像素点色彩信息,16bit
);
 
//------------- vga_pic_inst -------------
vga_pic vga_pic_inst
(
    .vga_clk    (vga_clk),  //输入工作时钟,频率25MHz,1bit
    .sys_rst_n  (rst_n),  //输入复位信号,低电平有效,1bit
    .pix_x      (pix_x),  //输入VGA有效显示区域像素点X轴坐标,10bit
    .pix_y      (pix_y),  //输入VGA有效显示区域像素点Y轴坐标,10bit
    .pix_data   (pix_data)   //输出像素点色彩信息,16bit
);
 
endmodule

VGA显示器驱动设计与验证

 ② VGA控制器

module vga_ctrl
(
	input 	wire	vga_clk, //输入工作时钟,频率25MHz
	input	wire	sys_rst_n,
	input	wire	[15:0]pix_data,
	
	output	wire	[9:0]pix_x,
	output	wire	[9:0]pix_y,
	output	wire	hsync,
	output	wire	vsync,
	output	wire	[15:0]vga_rgb	
);

parameter H_SYNC = 10'd96,
		  H_BACK = 10'd40,
		  H_LEFT = 10'd8,
		  H_VALLD = 10'd640,
		  H_RIGHT = 10'd8,
		  H_FRONT = 10'd8,
		  H_TOTAL = 10'd800;
parameter V_SYNC = 10'd2,
		  V_BACK =10'd25,
		  V_TOP =10'd8,
		  V_VALLD = 10'd480,
		  V_BOTTOM = 10'd8,
		  V_FRONT = 10'd2,
		  V_TOTAL = 10'd525;
		  		  
reg	[9:0] cnt_h;//行同步信号计数器
reg [9:0] cnt_v;//场同步信号计数器
wire	  pix_data_req;//像素点色彩信息请求信号
wire 	  rgb_valid;//VGA有效显示区域

//cnt_h:行同步信号计数器
always @(posedge vga_clk or negedge sys_rst_n)
	if(!sys_rst_n)
		cnt_h <= 10'd0;
	else if(cnt_h == H_TOTAL - 1'b1)
		cnt_h <= 10'd0;
	else
		cnt_h <= cnt_h + 1'b1;

//cnt_v:场同步信号计数器
always @(posedge vga_clk or negedge sys_rst_n)
	if(!sys_rst_n)
		cnt_v <= 10'd0;
	else if((cnt_v == V_TOTAL - 1'b1)&&(cnt_h == H_TOTAL - 1'b1))
		cnt_v <= 10'd0;
	else if (cnt_h == H_TOTAL - 1'b1)
		cnt_v <= cnt_v + 1'b1;
	else
		cnt_v <= cnt_v;

//rgb_valid:VGA有效显示区域
assign rgb_valid = ((cnt_h >= H_SYNC + H_BACK + H_LEFT)
					&& (cnt_h < H_SYNC + H_BACK + H_LEFT + H_VALLD)
					&& (cnt_v >= V_SYNC + V_BACK + V_TOP)
					&& (cnt_v < V_SYNC + V_BACK + V_TOP + V_TOTAL))
					? 1'b1 : 1'b0;

//pix_data_req:像素点色彩信息请求信号,超前rgb_valid信号一个时钟周期
assign pix_data_req = ((cnt_h >= H_SYNC + H_BACK + H_LEFT - 1'b1)
					&& (cnt_h < H_SYNC + H_BACK + H_LEFT + H_VALLD - 1'b1)
					&& (cnt_v >= V_SYNC + V_BACK + V_TOP)
					&& (cnt_v < V_SYNC + V_BACK + V_TOP + V_TOTAL))
					? 1'b1 : 1'b0;

//pix_x,pix_y:VGA有效显示区域像素点坐标
assign pix_x = (rgb_valid == 1'b1) ? (cnt_h - (H_SYNC + H_BACK + H_LEFT)) : 10'd0;
assign pix_y = (rgb_valid == 1'b1) ? (cnt_v - (V_SYNC + V_BACK + V_TOP)) : 10'd0;
assign hsync = (cnt_h <= H_SYNC - 1'b1) ? 1'b1 : 1'b0;
assign vsync = (cnt_v <= V_SYNC - 1'b1) ? 1'b1 : 1'b0;	
assign vga_rgb = (rgb_valid == 1'b1) ? pix_data : 16'h0000;
		
endmodule

注:.为什么要将(pix_x,pix_y)=(0,0)提前一个时钟周期?

        显示数据产生,会滞后坐标(0,0)一个vga_clk,所以要把坐标(0,0)的出现提前一个vga_clk,修改后,vga_pic模块中产生显示数据,pix_data则可直接使用时序逻辑always语句,并且实际输出至vga显示器的同步信号h/vsync的产生只与cnt_h/v有关,所以使pix_x,y=(0,0)对模块输出的场同步没有影响,而rgb因pix的修改变正确

        pix_data_req:像素点色彩信息请求信号,超前 rgb_valid 信号一个时钟周期,从而使(pix_x,pix_y)=(0,0)提前一个时钟周期。减1使(pix_x,pix_y)=(0,0)提前一个时钟周期场坐标无需减一,若场减一则相当于提前 H_TOTAL 个时钟周期文章来源地址https://www.toymoban.com/news/detail-501720.html

 ③ VGA图像生成模块

module vga_pic
(
	input	wire	vga_clk,
	input	wire	sys_rst_n,
	input	wire	[9:0]pix_x,
	input	wire	[9:0]pix_y,
	output	reg	[15:0]pix_data
	
);

parameter	H_VALID = 10'd640,
			V_VALID = 10'd480;

parameter	RED		= 16'hF800,
			ORANGE  = 16'hFC00,
			YELLOW  = 16'hFFE0,
			GREEN   = 16'h07E0,
			CYAN    = 16'h07FF,
			BLUE    = 16'h001F,
			PURPPLE = 16'hF81F,
			BLACK   = 16'h0000,
			WHITE   = 16'hFFFF,
			GRAY    = 16'hD69A;

always @(posedge vga_clk or negedge sys_rst_n)
	if(!sys_rst_n)
		pix_data <= BLACK;
	else    if((pix_x >= 0) && (pix_x < (H_VALID/10)*1))
        pix_data    <=  RED;
    else    if((pix_x >= (H_VALID/10)*1) && (pix_x < (H_VALID/10)*2))
        pix_data    <=  ORANGE;
    else    if((pix_x >= (H_VALID/10)*2) && (pix_x < (H_VALID/10)*3))
        pix_data    <=  YELLOW;
    else    if((pix_x >= (H_VALID/10)*3) && (pix_x < (H_VALID/10)*4))
        pix_data    <=  GREEN;
    else    if((pix_x >= (H_VALID/10)*4) && (pix_x < (H_VALID/10)*5))
        pix_data    <=  CYAN;
    else    if((pix_x >= (H_VALID/10)*5) && (pix_x < (H_VALID/10)*6))
        pix_data    <=  BLUE;
    else    if((pix_x >= (H_VALID/10)*6) && (pix_x < (H_VALID/10)*7))
        pix_data    <=  PURPPLE;
    else    if((pix_x >= (H_VALID/10)*7) && (pix_x < (H_VALID/10)*8))
        pix_data    <=  BLACK;
    else    if((pix_x >= (H_VALID/10)*8) && (pix_x < (H_VALID/10)*9))
        pix_data    <=  WHITE;
    else    if((pix_x >= (H_VALID/10)*9) && (pix_x < H_VALID))
        pix_data    <=  GRAY;
    else
        pix_data    <=  BLACK;

endmodule

④ testbench文件

`timescale 1ns/1ns
module tb_vga_colorbar();

reg sys_clk;
reg sys_rst_n;

wire hsync;    
wire vsync;
wire [15:0]vga_rgb;  

initial 
	begin
		sys_clk = 1'b1;
		sys_rst_n <= 1'b0;
		#20
		sys_rst_n <= 1'b1;
	end

always #10 sys_clk = ~sys_clk;


vga_colorbar vga_colorbar_inst
(
    .sys_clk(sys_clk)    ,   //输入工作时钟,频率50MHz
    .sys_rst_n(sys_rst_n)   ,   //输入复位信号,低电平有效
    .hsync(hsync)       ,   //输出行同步信号
    .vsync(vsync)       ,   //输出场同步信号
    .rgb_rgb(rgb_rgb)             //输出像素信息
);


endmodule

到了这里,关于VGA显示器驱动设计与验证的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • [桌面运维]PC常用的视频接口,显示器VGA、DVI、HDMI、DP、USB-C接口的认识和应用

    ⬜⬜⬜ 🐰🟧🟨🟩🟦🟪(*^▽^*)欢迎光临 🟧🟨🟩🟦🟪🐰⬜⬜⬜ ✏️write in front✏️ 📝个人主页:陈丹宇jmu 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 🙉联系作者🙈by QQ:813942269🐧 🌈致亲爱的读者:很高兴你能看到我的文章,希望我的文章可以帮助到你,祝万事

    2024年02月07日
    浏览(48)
  • 迅为龙芯3A5000主板,支持PCIE 3.0、USB 3.0和 SATA 3.0显示接口2 路、HDMI 和1路 VGA,可直连显示器

    性能强 采用全国产龙芯3A5000处理器,基于龙芯自主指令系统 (LoongArch@)的LA464微结构,并进一步提升频率,降低功耗,优化性能。 桥片 桥片采用龙芯 7A2000,支持PCIE 3.0、USB 3.0和 SATA 3.0显示接口2 路、HDMI 和1路 VGA,可直连显示器;另外内置一个网络 PHY,片内集成了自研GPU,搭配

    2024年02月04日
    浏览(42)
  • 【FPGA显示驱动(Display)】- 使用Verilog实现8位数字显示器

    【FPGA显示驱动(Display)】- 使用Verilog实现8位数字显示器 FPGA是一种可编程的逻辑器件,它可以通过不同的配置来实现多种应用。在本文中,我们将探讨如何使用Verilog语言在FPGA上实现8位数字显示器。 硬件环境 Xilinx ISE Design Suite 14.7 FPGA开发板 八段数码管 设计实现 在Verilog代

    2024年02月04日
    浏览(47)
  • 使用STM32微控制器驱动LCD1602显示器

    驱动LCD1602显示器是嵌入式系统常见的任务之一,而STM32微控制器因其灵活性和丰富的外设而成为了广泛采用的解决方案。 在这篇文章中,我们将探讨如何使用STM32微控制器来驱动LCD1602显示器。我们将从STM32的GPIO配置、延时函数以及LCD1602的初始化和写入数据等方面展开讨论,

    2024年04月17日
    浏览(43)
  • Windows 10驱动开发入门(五):创建虚拟显示器 Indirect Display驱动开发

    在开发或者办公中,越大的屏幕看起来就显示越舒服了,通常我们的做法是有两块屏幕,这样显示的内容就变多了,可以很容易提高办公的效率。 在设置中 显示 中,如果我们有两块屏幕,在显示器中自然的会出现两个,在其中可以对两块屏幕进行相应的设置。 在这个驱动中

    2023年04月16日
    浏览(41)
  • Type-C接口在显示器上有什么作用?Type-C 显示器方案介绍

    1·只可以用来充电,也是Type-C的第一特性。 如果你的显示器或手机电脑pad或扩展坞或充电器或数据线的Type-C,没有特别说明支持传输数据,那么往往仅仅能用来充电,里面起作用的说Type-C口里带了PD快充充电协议,至于能提供多少瓦,是100瓦还是80哇45瓦,就看各个厂商在PD

    2024年02月08日
    浏览(61)
  • Ubuntu系统安装nvidia(英伟达)驱动后,开机显示器黑屏无法进入桌面

    因为之前服务器经常卡死,跑实验很痛苦,于是这几天决定重装系统。 重装后的系统是Ubuntu20.04 LTS版本,我使用的是Ubuntu图形界面的“Software Updates”来安装nvidia(英伟达)驱动,如下图所示: 安装后重启电脑,发现一直卡在黑屏页面,屏幕的左上角一直有个横线在闪动。如

    2024年03月15日
    浏览(71)
  • LCD—STM32液晶显示(1.显示器简介及LCD显示原理)(6000字详细介绍)

    目录 显示器简介 液晶显示器 液晶 像素 液晶屏缺点 LED显示器 OLED显示器 显示器的基本参数 STM32板载液晶控制原理(不带微控制器) 液晶控制原理 控制信号线(不带液晶控制器) 液晶数据传输时序 显存 总结 3.2寸液晶屏介绍(搭载液晶控制器) 3.2寸电阻触摸屏实物 ILI9341液晶

    2024年02月17日
    浏览(52)
  • 笔记本外接显示器无法检测 或 Nvidia显卡驱动安装失败解决办法

    由于C盘空间过少且不满意win11,就重装了一下系统。但是重装完系统之后我的外接显示器不工作了,设置当中检测不到 打开设备管理器,找到显示适配器一栏 查看是否显示Microsoft基础显示适配器,如果是,那么就是因为显卡驱动没安装 安装显卡驱动的过程中检测环境显示失

    2024年02月11日
    浏览(135)
  • 显示器校准软件BetterDisplay Pro mac中文版介绍

    BetterDisplay Pro mac是一款显示器校准软件,可以帮助用户调整显示器的颜色和亮度,以获得更加真实、清晰和舒适的视觉体验。 BetterDisplay Pro mac软件特点 - 显示器校准:可以根据不同的需求和环境条件调整显示器的颜色、亮度和对比度等参数,以获得更好的视觉效果。 - 自动校

    2024年04月24日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包