VGA介绍

本文介绍了VGA接口的基本概念,包括其历史、信号定义和时序。VGA通过模拟信号传输红绿蓝三原色,在FPGA中,VGA接口的实现涉及到RGB565数据格式和数模转换。在正点原子的FPGA开发板上,通过电阻匹配网络将数字颜色数据转换为模拟信号输出给显示器。
摘要由CSDN通过智能技术生成

以下内容来自正点原子FPGA开发指南,觉得讲的不错,就搬了过来。

一、VGA简介

VGA的全称是Video Graphics Array,即视频图形阵列,是一个使用模拟信号进行视频传输的标准。早期的CRT显示器由于设计制造上的原因,只能接收模拟信号输入,因此计算机内部的显卡负责进行数模转换,而VGA接口就是显卡上输出模拟信号的接口。如今液晶显示器虽然可以直接接收数字信号,但是为了兼容显卡上的VGA接口,也大都支持VGA标准。
在这里插入图片描述

VGA接口定义及各引脚功能说明如图 18.1.2所示,我们一般只用到其中的1(RED)、2 (GREEN)、3(BLUE)、13(HSYNC)、14(VSYNC)信号。引脚1、2、3分别输出红、绿、蓝三原色模拟信号,电压变化范围为 0~0.714V,0V代表无色,0.714V 代表满色;引脚13、14输出TTL电平标准的行/场同步信号。
在这里插入图片描述
在VGA视频传输标准中,视频图像被分解为红、绿、蓝三原色信号,经过数模转换之后,在行同步(HSYNC)和场同步(VSYNC)信号的同步下分别在三个独立通道传输。VGA在传输过程中的同步时序分为行时序和场时序,如图 18.1.3、图 18.1.4所示。

在这里插入图片描述
从上面两幅图中我们可以看到VGA传输过程中的行同步时序和场同步时序非常类似,一行 或一场(又称一帧)数据都分为四个部分:低电平同步脉冲、显示后沿、有效数据段以及显示前沿。

行同步信号HSYNC在一个行扫描周期中完成一行图像的显示,其中在a段维持一段时间的低电平用于数据同步,其余时间拉高;在有效数据期间(c段),红绿蓝三原色数据通道上输出一行图像信号,其余时间数据无效。

与之类似,场同步信号在在一个场扫描周期中完成一帧图像的显示,不同的是行扫描周期的基本单位是像素点时钟,即完成一个像素点显示所需要的时间;而场扫描周期的基本单位是完成一行图像显示所需要的时间。

早期的VGA特指分辨率为640X480的显示模式,后来根据分辨率的不同,VGA又分为VGA(640x480)、SVGA(800x600)、XGA(1024x768)、SXGA(1280x1024)等。不同分辨率的VGA显示时序是类似的,仅存在参数上的差异,如图 18.1.5所示。

需要注意的是,即便分辨率相同,刷新速率(每秒钟图像更新次数)不一样时,对应的VGA像素时钟及时序参数也存在差异。例如,显示模式 “640480@75”刷新速率为75hz,与相同分辨率下刷新速率为60hz的“640480@60”模式相比,像素时钟更快,其他时序参数也不尽相同。

在这里插入图片描述

二、FPGA上VGA接口部分的原理图

以正点原子的开拓者开发板为例

这部分的原理图很关键,因为我们并不是在代码中直接将图像数据转换成RGB三路模拟信号,而是由开发板上的转换电路实现的。我们在代码中要做的,就是获取正确的RGB565格式的数据,然后由转换电路转换成RGB三路模拟信号输出给显示器。

在这里插入图片描述

从上图中可以看到,FPGA管脚输出的颜色数据位宽为16bit,数据格式为RGB565,即数据高5位表示红色,中间6位表示绿色,低5位表示蓝色。RGB565格式的数据一共可表示65536种颜 色,此外常用的颜色数据格式还有RGB888,数据位宽越大,可以表示的颜色种类就越丰富。

由前面的简介我们知道,VGA传输的是模拟信号,因此需要对FPGA输出的RGB565颜色数据进行数模转换。此过程可以通过专用的视频转换芯片(如ADV7123)来实现,在这里我们采用另外一种更简单的方案——利用电阻匹配网络来实现数字信号到模拟信号的转换,如图18.3.1所示。

  • 8
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Verilog VGA 分频的具体实现方式可以有多种,下面我将介绍其中一种常见的方式: VGA 信号的时序是由水平和垂直同步信号控制的。水平同步信号 HSYNC 的频率为 31.5kHz,垂直同步信号 VSYNC 的频率为 60Hz。为了得到一个稳定的 VGA 信号,我们需要将这两个信号进行分频处理,以便生成适合硬件设备处理的频率。 具体的分频实现方式如下: 1. 定义分频系数 我们可以定义一个分频系数,用来将输入的时钟信号分频,从而得到输出时钟信号。例如,如果我们将分频系数设置为 2,那么输出时钟信号的频率就是输入时钟信号的一半。 2. 分频器实现 接下来,我们需要实现一个分频器,将输入的时钟信号进行分频。下面是一个简单的分频器 Verilog 代码示例: ``` module clk_divider( input clk_in, input [7:0] divisor, output reg clk_out ); reg [7:0] count = 0; always @(posedge clk_in) begin if (count == divisor - 1) begin count <= 0; clk_out <= ~clk_out; end else begin count <= count + 1; end end endmodule ``` 在这个示例中,我们定义了一个分频器模块,包含一个输入时钟信号 clk_in,一个分频系数 divisor 和一个输出时钟信号 clk_out。在 always 代码块中,我们使用一个计数器 count 来计算时钟周期数,并将其与分频系数进行比较。当计数器达到分频系数时,将计数器清零,并将输出时钟信号反转。 3. 分频器连接 最后,我们需要将分频器与 VGA 时序生成模块连接起来,以便生成一个适合硬件设备处理的 VGA 信号。下面是一个简单的 VGA 时序生成模块 Verilog 代码示例: ``` module vga_timing_gen( input clk, input reset, output reg hsync, output reg vsync, output reg [10:0] hcount, output reg [9:0] vcount ); reg [7:0] hsync_count = 0; reg [7:0] vsync_count = 0; always @(posedge clk) begin if (reset) begin hsync_count <= 0; vsync_count <= 0; hcount <= 0; vcount <= 0; hsync <= 1; vsync <= 1; end else begin if (hcount == 799) begin hcount <= 0; hsync <= ~hsync; hsync_count <= hsync_count + 1; if (hsync_count == 3) begin hsync_count <= 0; vsync_count <= vsync_count + 1; if (vsync_count == 525) begin vsync_count <= 0; vsync <= ~vsync; end vcount <= vcount + 1; end end else begin hcount <= hcount + 1; end end end endmodule ``` 在这个示例中,我们定义了一个 VGA 时序生成模块,包含一个输入时钟信号 clk 和一个复位信号 reset,以及输出的水平同步信号 hsync、垂直同步信号 vsync、水平计数器 hcount 和垂直计数器 vcount。在 always 代码块中,我们使用计数器 hcount 和 vcount 来生成 VGA 时序信号,当计数器达到阈值时,我们就可以生成水平同步信号和垂直同步信号。 最后,我们将分频器模块与 VGA 时序生成模块连接起来,将输入时钟信号 clk_in 连接到分频器的输入 clk_in,将分频系数 divisor 设置为需要的分频系数,将分频器的输出时钟信号 clk_out 连接到 VGA 时序生成模块的输入时钟信号 clk 即可。 这就是 Verilog VGA 分频的基本实现方式,希望对您有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值