2023年11月30日发(作者:)

VGA显示器控制电路

论文

前言

VGA(视频图形阵列)作为一种标准的显示接口得到广泛的应用。利用FPGA

芯片和EDA设计方法,可以因地制宜,根据用户的特定需要,设计出针对性强

VGA显示控制器,不仅能够大大的降低成本,还可以满足生产实践中不断变

化的用户需要,产品升级换代方便迅速。

在本设计中采用Altera公司的EDA软件工具Quartus II,并以Cyclone II系列

FPGA的器件作为主实现硬件平台的设计。

一、 FPGA的原理

FPGA Filed Progranmmable Gate Array的缩写,即现场可编程逻辑阵

列。FPGA是在CPLD的基础上发展起来的新型高性能可编程逻辑器件它一般采用

SRAM工艺,也有一些专用器件采用Flash工艺或反熔丝(Anti_Fuse)工艺等。

FPGA的集成度很高,其器件密度从数万系统门到数千万系统门不等,可以完成

极其复杂的时序与组合逻辑电路功能,适用于高速、高密度的高端数字逻辑电路

设计领域。FPGA的基本组成部分有可编程输入/输出单元,基本可编程逻辑单元、

嵌入式块RAM、丰富的布线资源、底层嵌入功能单元、内嵌专用硬核等。FPGA

的主要器件供应商有Xilinx Altera Lattice Actel Atmel 等。

二、 VGA转换接口的简单描述

本设计另外自制VGA接口电路。

VGA时序控制模块是整个显示控制器的关键部分,最终的输出信号行、场

同步信号必须严格按照VGA时序标准产生相应的脉冲信号。对于普通的VGA

显示器,其引出线的共含5个信号:G,R,B(三基色信号)HS(行同步信号)

VS(场同步信号)。在五个信号时序驱动时,VGA显示器要严格遵循“VGA

业标准”,即640Hz×480 Hz×60Hz模式。

下图(1)为VGA显示控制器控制CRT显示器

VGAVideo Graphic Array)接口,即视频图形阵列,也叫做D-Sub接口,

15针的梯形插头,分3排,每排5个,传输模拟信号。VGA接口采用非对称

分布的15针连接方式,其工作原理:是将显存内以数字格式存储的图像(帧)

信号在RAMEAC里经过模拟调制成模拟高频信号,然后再输出到显示设备成像。

目前大多数计算机与外部显示设备之间都是通过模拟VGA接口连接,计算机内

部以数字方式生成的显示图像信息,被显卡中的数字/模拟转换器转变为RG

B三原色信号和行、场同步信号,信号通过电缆传输到显示设备中。对于模拟显

示设备,如模拟CRT显示器,信号被直接送到相应的处理电路,驱动控制显像

生成图像。而对于LCDDLP扥数字显示设备,显示设备中需配置相应的A/D

(模拟/数字)转换器,将模拟信号转变为数字信号。在经过D/AA/D2次转

换后,不可避免地造成了一些图像细节的损失。VGA接口应用于CRT显示器无

可厚非,但用于连接液晶之类的显示设备,则转换过程的图像损失会使显示效果

略微下降。VGA接口的引脚分配如下图(1)所示

图(1

三、主要功能模块设计

注:主要模块为三块,一个二分频模块,一个VGA时序和行点位置模块,一个图形生成

模块,本来想利用老师提供的方案进行制作,但在按键去抖模块以及按键累计模块没有能完

成,故更改方案,换用读取拨动开关的模式来选择模式显示。

1.1 VGA时序控制模块(vgaxm.v

功能:

根据VGA显示器的工作原理,提供同步信号(H_SYNCV_SYNC及像

素位置信息。

设计思路:

根据VGA显示器的工作原理,以垂直同步信号的出现时刻作为时间的起点

(原点),根据时序图算出每一个关键时间点所需的计数器最大值,据此输出

H_SYNCV_SYNC,在此基础上对扫描的行数及像素点数进行计数,从而输

出像素位置信息。

1.1.1VGA的时序详细讲解

对于VGA显示器,每个像素点的输出频率为25.175MHZ,本实验采用

50MHz的时钟信号,经过模块divider(二分频模块)的分频得到25MHz的时钟

输入信号。依据VGA时序标准,行同步信号HS,行周期为32.2us,也就是

H_sync(行)的周期;场同步信号VS,场周期为16.89ms,也就是V_sync(一

帧)的周期。

刷新1个像素所需时间Tpixel = 1/ fclk =40ns

从(b)水平刷新循环中,可以知道刷新一行所需时间公式:

Trow = B+C+D+E=Tpixel 640 guard bands = 25.6s + B + C +E = 32.2s

引入h_count[9..0]用于Trow25MHz的定时计数,计数清零时由时序可

得下面计算式子:

h_countend

同时可以从该时序图确定p_begin_time p_end_time的像素点pixel开始计

数以及清零计数的时间,计算式子如下:

p_begin_time :

p_end_time :

还能得出行扫描h_synch_count0~805计数期间,从第几计数开始为电

平变化。图中,B=3.77us就是说在h_count计数起到3.77us到来之间行信号h_sync

保持低电平,在3.77us32.2us之间为高电平,刚好为一个行信号周期。以下

是计算式子(hsync_end代表h_sync的低电平截止时间范围)

hsync_end

程序简单描述如下:

h_count计数:

always @( posedge clk) //25MHZ

// 在垂直刷新循环内,当h_count计到规定的最大值805时,则清零;否则

1计数

h_sync的电平变化

assign h_sync_pulse_w = (h_count < hsync_end); //h_count计数到94

3.77us195~8050

v_sync

v_sync_pulse_w为高电平

assign h_sync=~h_sync_pulse_w;

刷新第一行

RGB

Q=1.02ms R=15.456ms S=0.35ms

480

h_end_time

h_begin_time

V_

SYNC

原点

P=64s

T=16. 89ms

screen

a)垂直刷新循环

a垂直刷新循环,可以知道刷新完480行,并完成一帧所需时间Tscreen

=P+Q+R+S= Trow 480 guard bands = 15.456ms+ P + Q + S = 16. 89ms

引入v_count[18..0] :用于Tscreen的定时计数,每当h_count计数满805

v_count计数加1一次;计数清零时由时序可得下面计算式子(v_countend

v_count计数清零值)

v_countend

同时可以从该时序图确定h_begin_time h_end_time的行计数line开始计

数以及清零计数的时间,计算式子如下:

h_begin_time :

h_end_time :

还能得出场扫描v_syncv_count0~525计数期间,从第几计数开始为电

平变化。图中,P=64us就是说在v_count计数起到64us到来之间场信号v_sync

保持低电平,64us16. 89ms之间为高电平,刚好为一个场信号周期(一帧)

以下是计算式子(vsync_end代表v_sync的低电平截止时间范围)

vsync_end

程序简单描述如下:

v_count计数:

always @ (posedge clk )

// 当垂直刷新循环结束(满480)时v_count清零;否则当h_count计到

规定的最大值(805)时加1计数

v_sync的电平变化:

assign v_sync_pulse_w = (v_count < vsync_end); //v_count0计数到264us

1 3~5250 h_sync负脉冲

宽度内,h_sync_pulse_w为高电

assign v_sync=~v_sync_pulse_w;

1.1.2 提供行列以及格线计数值

行或列计数:line pixel

格线计数器:line_cntpixel_cntstrip_cnt

1line[8..0]:用于对行数(1~480行)计数,其clk等于水平同步信号h_sync

的下降沿

2pixel [9..0] :用于对每行的像素点数(1~640个点)计数,其clk等于输入

时钟fclk25M

/* 3. line[8..0]对像素所处行计数 */

always @ (negedge h_sync )

//h_sync的下降沿触发line计数。

//h_begin_time v_counth_end_time,且当

line 480时,则line1计数;

//否则line清零。

/* 4. pixel[9..0]对像素所处列计数 */

always @ (posedge clk )

/*1line480(必须有此条件,否则pixelh_sync来后B+C时间之后即

开始加1计数,而此时line=0p_begin_timeh_countp_end_timepixel

640时,则pixel1计数;*/

//否则pixel清零。

3output[4:0] line_cnt; //用于棋盘格1的水平格线计数 32

,32.2uss计数一次

4output[5:0] pixel_cnt; //用于棋盘格1的垂直格线计数 64进制 40ns

计数一次

5output[5:0] strip_cnt; //用于横彩条2的水平格线计数 6464

32.2uss计数一次

2.1生成图形子模块

注:RGB[2..0]:颜色信号,R——红色信号;G——绿色信号;B——蓝色信号。其对应

颜色关系如下表所示。

功能:

根据时序控制子模块输出的像素位置信息,在不同的显示模式下,输出不同

的颜色信号。

设计思路:

采用case语句,来确定不同的显示模式;在每种显示模式下,采用if-else

语句,根据像素所处的位置(即linepixel的范围)来确定输出不同的颜色信

号。对棋盘格1、横彩条2的格线的判断不用枚举的方法,而是根据vgacore2.v

输出的格线计数器line_cntpixel_cntstrip_cnt的大小,用if-else语句简单地

实现。

本模块主要的图形生成程序简述如下:

/* 2. 根据cnt值产生不同的显示图形 */

always @ (posedge clk )

begin

if( line>9'd0 & line<=9'd480 & pixel>9'd0 & pixel<=10'd640) //若在有

begin 效区域内

case(cnt)

0:begin/*1)模式14大图形块 */

1:begin/*2)模式2:竖彩条*/

2:begin/*3)模式3:横彩条*/

3:begin/*4)模式4:棋盘格1 16*16 */

4:begin/*5)模式5:小横彩条 */

5:begin/*6)模式6:棋盘格2 30*40 */

endcase

end

else rgb=3b000;//超出有效区域,则为黑色

end

2.1.1 VGA竖彩条发生和横彩条发生

竖彩条发横模块根据像素点计数器的h_count的计数值来产生彩条,其流程

图如(a)所示。它对行点数(像素点)计数器的数值进行判断,每80条竖线生

成一种竖彩条,共八种竖彩条。横彩条发生模块与竖彩条发生模块类似。它根据

场扫计数器(行)的计数值来残生横彩条,流程图如(b)所示。每60条扫描线

为一个彩条宽度,共8色横彩条模式。

N

Y

Line<59

H_dat=111

N

Pixel<80

Y

v_dat=111

N

Y Y

Line<119

N

H_dat=110

Pixel<160

v_dat=110

N

Y Y

Line<179

N

H_dat=101

Pixel<240

v_dat=101

N

Y

Line<239Pixel<320

N

H_dat=100

Y

v_dat=100

N

Y Y

Line<299

N

H_dat=011

Pixel<400

v_dat=011

N

Line<359

Y Y

H_dat=010

N

Pixel<480

v_dat=010

N

Line<

419 v_dat=001

Y

H_dat=001

N

Pixel<560

Y

N

H_dat=000

N

v_dat=000

横彩条(b 竖彩条(a)

2.1.2 对模式6和模式2的简单描述如下:

根据vgacore2.v输出的格线计数器line_cntpixel_cntstrip_cnt的大小,

if-else语句简单地实现。

line_cnt对行数进行计数,为32进制计数

模式6

/*6)模式6:横彩条2--从上至下,每6行显示一种颜色,

分别为白、黄、粉、红、浅蓝、绿、黑、蓝,并重复此规律。

*/

5:begin

if(strip_cnt<=6d6) rgb=3b111; //

else if(strip_cnt<=6d12) rgb=3b110;//

……

end

模式2

/*2)模式2:棋盘格1(与方案1不同) */

1:begin

if((line==9'd1)|(line_cnt==5'd30)|(pixel==10'd1)

|(pixel_cnt==6'd40)) rgb=3'b100; //格线为红色

else rgb=3'b001; //格内显示蓝色

end

……

开始(棋盘1模式)

Y Y Y Y

Line=1?

Pixel=1?

Line_cnt=1Pixel_cnt=1

6?32 6?32?48?64

?

N N N N

RGB=100 显示红色线

Rgb=001 显示蓝色背景

棋盘216*16棋盘

小横彩条

strip_cnt<=7

strip_cnt<=14

strip_cnt<=21

strip_cnt<=28

strip_cnt<=35

Rgb=100

Rgb=011

Rgb=010

Rgb=001

Rgb=000

strip_cnt<=42

strip_cnt<=49

strip_cnt<=56

strip_cnt<=63

Else

Rgb=000

Rgb=111

Rgb=110

Rgb=101

Rgb=101

3.1 分频模块

本设计有两个分频器,一个是提供标准时钟信号25MHZ的二分频器,一个

是提供按键去抖时钟1ms25000分频器。

二分频:

分频系数计算公式:

25000分频:

分频系数计算公式:

感言:

这次课程设计让我对EDA软件工具Quartus II的运用有了更深一面的认

识。通过对VGA的学习以及设计,我认识到了VGA的工作原理以及关于Verilog

VHL的简单语言思维。本想让这设计能显示出图片与文字,但学识还未成熟,

很遗憾这最后的一个课程设计没有能突破自己的计划。但是,很高兴能认识到这

门具有非常强悍潜力的知识,这门技术的背后非常的广阔,需要更多的知识和创

造力。

行与点的计数值

总电路

竖条