基于FPGA的VGA协议实现

VGA概述

简述

VGA协议,即视频图形阵列(Video Graphics Array)协议,是一种由IBM在1987年推出用于计算机显示的标准。它广泛应用于个人电脑和显示器之间的连接,尽管随着技术的发展出现了更高分辨率和更先进的接口技术,但VGA仍然在许多设备上得到广泛使用。

VGA协议主要包含以下几方面的内容:

色彩原理:基于三基色原理,即通过红(R)、绿(G)、蓝(B)三种基本色来表达色彩空间。这三种颜色信号是相互独立的,任何一种基色都不能由其他两种颜色合成。

信号传输:VGA接口传输红、绿、蓝模拟信号以及同步信号(水平和垂直信号)。这些信号通过D型15针接口传输,其中包括RGB彩色分量信号和扫描同步信号HSYNC与VSYNC。

分辨率和刷新率:VGA支持多种分辨率和刷新率,例如800x600@60Hz等。在800x600@60Hz分辨率下,所需的时钟频率大约为40MHz。

扫描方式:VGA显示器通常采用逐行扫描方式,从屏幕左上角开始,逐行从左向右扫描,每扫描完一行后返回下一行的起始位置,直到形成一帧。

行场信号:VGA协议定义了行同步信号(HSYNC)和场同步信号(VSYNC),这些信号用于同步图像的显示,确保图像的稳定性。

接口设计:VGA接口是一种D型接口,上面共有15针孔,分成三排,每排五个。其中,包括RGB彩色分量信号、显示数据总线和同步信号等。

驱动电路:VGA驱动电路有多种设计方案,包括使用R-2R电阻模拟电路或专用视频转换DAC芯片实现VGA电路方案。

时序:VGA时序包括行时序和场时序,它们定义了同步脉冲、显示后沿、显示时序段和显示前沿等部分,以确保图像的正确显示。

VGA协议因其成本低廉、结构简单和应用灵活等优点,在彩色显示器领域得到了广泛应用。尽管现代显示技术不断进步,VGA作为一种成熟的显示接口,仍然在特定场合和应用中保持着其价值和地位。

管脚定义

下面,我们结合 VGA 接口引脚图和各引脚定义表格,对 VGA 接口各引脚做一下简单介绍。

VGA接口
引脚1:红基色;引脚2:绿基色;引脚3:蓝基色;
引脚6:红色地;引脚7:绿色地;引脚8:蓝色地;引脚10:数字地
引脚11:地址码0;引脚12:地址码1;引脚4:地址码2;引脚15:地址码3
引脚13:行同步;引脚14:场同步
引脚5:自测试(各厂家定义不同);引脚9:保留(各厂家定义不同)
由图4可知,VGA 接口共有 15 个引脚,分为 3 排,每排各 5 个, 按照自上而下、从左向右的顺序排列。其中第一排的引脚 1 、 2 、 3 和第三排的引脚 13 、 14 最为重要。
VGA 使用工业界通用的 RGB 色彩模式作为色彩显示标准,这种色彩显示标准是根据三原色中红色、绿色、蓝色所占比例多少及三原色之间的相互叠加得到各式各样的颜色。引脚 1 红基色 (RED) 、引脚 2 绿基色 (GREEN) 、引脚 3 蓝基色 (BLUE) 就是 VGA 接口中负责传输三原色的传输通道。要注意的是,这 3 个引脚传输的是模拟信号。
引脚 13 行同步信号 (HSYNC) 、引脚 14 场同步信号 (VSYNC) ,这两个信号,是在 VGA显示图像时,负责同步图像色彩信息的同步信号。在后面博文中,我们会对这两个信号进行详细讲解。
引脚 5 、 9 :这两个引脚分别是 VGA 接口的自测试和预留接口,不过不同生产厂家对这两个接口定义不同,在接线时,两引脚可悬空不接。
引脚 4 、 11 、 12 、 15 :这四个是 VGA 接口的地址码,可以悬空不接。
引脚 6 、 7 、 8 、 10 :这四个引脚接地,无需解释。

VGA显示原理

VGA 显示器显示图像,并不是直接让图像在显示器上显示出来,而是采用扫描的方式,将构成图像的像素点,在行同步信号和场同步信号的同步下,按照从上到下、由左到右的顺序扫描到显示屏上。
结合 VGA 显示器扫描方式示意图,我们简要说明一下 VGA 显示器的扫描规律。
(1) 在行、场同步信号的同步作用下,扫描坐标定位到左上角第一个像素点坐标;
(2) 自左上角 ( 第一行 ) 第一个像素点坐标,逐个像素点向右扫描 ( 图中第一个水平方向箭头) ;
(3) 扫描到第一行最后一个数据,一行图像扫描完成,进行图像消隐,扫描坐标自第一行行尾转移到第二行行首( 图中第一条虚线 ) ;
(4) 重复若干次扫描至最后一行行尾,一帧图像扫描完成,进行图像消隐,扫描坐标跳转回到左上角第一行行首( 图中对角线箭头 ) ,开始下一帧图像的扫描。
在扫描的过程中会对每一个像素点进行单独赋值,使每个像素点显示对应色彩信息,
当一帧图像扫描结束后,开始下一帧图像的扫描,循环往复,当扫描速度足够快,加之人眼的视觉暂留特性,我们会看到一幅完整的图片,而不是一个个闪烁的像素点。这就是VGA 显示的原理。

VGA 显示模式及相关参数

行同步时序可分为 6 个阶段,对于这 6 个阶段的参数是有严格定义的,参数配置不正确,VGA 不能正常显示。 VGA 显示器可支持多种分辨率,不同分辨率对应个阶段的参数是不同的,常用 VGA 分辨率时序参数,具体见图 6 。

   下面我们以经典 VGA 显示模式 640x480@60 为例,为读者讲解一下 VGA 显示的相关参数。

   (1) 显示模式: 640x480@60
          640x480 是指 VGA 的分辨率, 640 是指有效显示图像每一行有 640 个像素点, 480 是指每一帧图像有 480 行, 640 * 480 = 307200 ≈ 300000 ,每一帧图片包含约 30 万个像素点,之前某品牌手机广告上所说的 30 万像素指的就是这个; @60 是指 VGA 显示图像的刷新频率,60 就是指 VGA 显示器每秒刷新图像 60 次,即每秒钟需要显示 60 帧图像。

   (2) 时钟 (MHz) : 25.175MHz
          这是 VGA 显示的工作时钟,像素点扫描频率。

   (3) 行同步信号时序 ( 像素 ) 、场同步信号时序 ( 行数 )
          行同步信号时序分为 6 段, Sync (同步)、 Back Porch (后沿)、 Left Border (左边框)、 “Addressable” Video (有效图像)、 Right Border (右边框)、 Front Porch (前沿),这 6 段构成一个行扫描周期,单位为像素时钟周期。
          同步阶段,参数为 96,指在行时序的同步阶段,行同步信号需要保持 96 个像素时钟周期的高电平, 其他几个阶段与此相似。
          场同步信号时序与其类似,只是单位不再是像素时钟周期,而是一个完整的行扫描周期,在此不再赘述。
          在这里,我们看回图 6,由图可知,即使 VGA 显示分辨率相同,但刷新频率不同的话,相关参数也存在差异,如 640x480@60 、 640x480@75 ,这两个显示模式虽然具有相同的分辨率,但是 640x480@75 的刷新频率更快,所以像素时钟更快,时序参数也有区别。

   下面我们以显示模式 640x480@60 、 640x480@75 为例,学习一下时钟频率的计算方法。

   行扫描周期 * 场扫描周期 * 刷新频率 = 时钟频率
   640x480@60:
   行扫描周期:800( 像素 ) ,场扫描周期: 525( 行扫描周期 ) 刷新频率: 60Hz
   800 * 525 * 60 = 25,200,000 ≈ 25.175MHz(误差忽略不计)
   640x480@75:
   行扫描周期:840( 像素 ) 场扫描周期: 500( 行扫描周期 ) 刷新频率: 75Hz
   840 * 500 * 75 = 31,500,000 = 31.5MHz
   在计算时钟频率时,大家要谨记一点,要使用行扫描周期和场扫描周期的参数进行计算,不能使用有效图像的参数进行计算,虽然在有效图像外的其他阶段图像信息均无效,但图像无效阶段的扫描也花费了扫描时间。
   以上就是对 VGA 显示标准中分辨率相关参数的讲解,在编写 VGA 驱动时,我们要根据 VGA 显示模式的不同调整相关参数,只有这样 VGA 图像才能正常显示。

VGA显示自定义的汉字字符

Verilog实现:

// 假设已经有了汉字字符的字模数据
always @(posedge clk) begin
    // 定位到屏幕的特定位置
    if(/* 定位逻辑 */) begin
        // 输出姓名和学号的字模数据到rgb
        rgb <= /* 姓名和学号的字模数据 */;
    end
end

输出一幅彩色图像
Verilog实现

always @(posedge clk) begin
    if(/* 图像数据读取逻辑 */) begin
        rgb <= /* 读取的图像数据 */;
    end
end

加入延时会出现什么现象

在Verilog中,可以使用#操作符来实现延时。在Verilog中,延时是按照仿真时间来计算的,而不是实际的硬件时间。
示例:

localparam time_unit = 1; // 根据仿真设置调整

always @(posedge clk) begin
    if (/* 行同步信号的生成条件 */) begin
        #(10 * time_unit); // 故意加入10个时间单位的延时
        hsync <= ~hsync; // 切换行同步信号
    end
end

always @(posedge clk) begin
    if (/* 场同步信号的生成条件 */) begin
        #(16.67 * 1000 * time_unit); // 故意加入大约1/60秒的延时(60Hz场频)
        vsync <= ~vsync; // 切换场同步信号
    end
end

出现的现象

屏幕闪烁、图像滚动或偏移、显示不稳定、刷新率变化、显示器无法同步

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值