毕业设计基于FPGA的VGA显示.docx
《毕业设计基于FPGA的VGA显示.docx》由会员分享,可在线阅读,更多相关《毕业设计基于FPGA的VGA显示.docx(16页珍藏版)》请在冰豆网上搜索。
毕业设计基于FPGA的VGA显示
VGA显示器控制电路
论文
前言
VGA(视频图形阵列)作为一种标准的显示接口得到广泛的应用。
利用FPGA芯片和EDA设计方法,可以因地制宜,根据用户的特定需要,设计出针对性强的VGA显示控制器,不仅能够大大的降低成本,还可以满足生产实践中不断变化的用户需要,产品升级换代方便迅速。
在本设计中采用Altera公司的EDA软件工具QuartusII,并以CycloneII系列的FPGA的器件作为主实现硬件平台的设计。
一、FPGA的原理
FPGA是FiledProgranmmableGateArray的缩写,即现场可编程逻辑阵列。
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×480Hz×60Hz模式。
下图
(1)为VGA显示控制器控制CRT显示器
VGA(VideoGraphicArray)接口,即视频图形阵列,也叫做D-Sub接口,是15针的梯形插头,分3排,每排5个,传输模拟信号。
VGA接口采用非对称分布的15针连接方式,其工作原理:
是将显存内以数字格式存储的图像(帧)信号在RAMEAC里经过模拟调制成模拟高频信号,然后再输出到显示设备成像。
目前大多数计算机与外部显示设备之间都是通过模拟VGA接口连接,计算机内部以数字方式生成的显示图像信息,被显卡中的数字/模拟转换器转变为R、G、B三原色信号和行、场同步信号,信号通过电缆传输到显示设备中。
对于模拟显示设备,如模拟CRT显示器,信号被直接送到相应的处理电路,驱动控制显像生成图像。
而对于LCD、DLP扥数字显示设备,显示设备中需配置相应的A/D(模拟/数字)转换器,将模拟信号转变为数字信号。
在经过D/A和A/D2次转换后,不可避免地造成了一些图像细节的损失。
VGA接口应用于CRT显示器无可厚非,但用于连接液晶之类的显示设备,则转换过程的图像损失会使显示效果略微下降。
VGA接口的引脚分配如下图
(1)所示
图
(1)
三、主要功能模块设计
注:
主要模块为三块,一个二分频模块,一个VGA时序和行点位置模块,一个图形生成模块,本来想利用老师提供的方案进行制作,但在按键去抖模块以及按键累计模块没有能完成,故更改方案,换用读取拨动开关的模式来选择模式显示。
1.1VGA时序控制模块(vgaxm.v)
功能:
根据VGA显示器的工作原理,提供同步信号(H_SYNC和V_SYNC)及像素位置信息。
设计思路:
根据VGA显示器的工作原理,以垂直同步信号的出现时刻作为时间的起点(原点),根据时序图算出每一个关键时间点所需的计数器最大值,据此输出H_SYNC和V_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+guardbands=25.6ms+B+C+E=32.2ms;
引入h_count[9..0]:
用于Trow(25MHz)的定时计数,计数清零时由时序可得下面计算式子:
h_countend:
同时可以从该时序图确定p_begin_time和p_end_time的像素点pixel开始计数以及清零计数的时间,计算式子如下:
p_begin_time:
p_end_time:
还能得出行扫描h_sync在h_count从0~805计数期间,从第几计数开始为电平变化。
图中,B=3.77us就是说在h_count计数起到3.77us到来之间行信号h_sync保持低电平,在3.77us到32.2us之间为高电平,刚好为一个行信号周期。
以下是计算式子(hsync_end代表h_sync的低电平截止时间范围):
hsync_end:
程序简单描述如下:
h_count计数:
always@(posedgeclk)//25MHZ
//在垂直刷新循环内,当h_count计到规定的最大值805时,则清零;否则加1计数
h_sync的电平变化:
assignh_sync_pulse_w=(h_countassignh_sync=~h_sync_pulse_w;
S=0.35ms
R=15.456ms
Q=1.02ms
RGB
V_SYNC
P=64μs
Tscreen=16.89ms
480行
h_begin_time
此时刻准备刷新第一行
h_end_time
原点
(a)垂直刷新循环
从(a)垂直刷新循环,可以知道刷新完480行,并完成一帧所需时间Tscreen=P+Q+R+S=Trow´480+guardbands=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_sync在v_count从0~525计数期间,从第几计数开始为电平变化。
图中,P=64us就是说在v_count计数起到64us到来之间场信号v_sync保持低电平,在64us到16.89ms之间为高电平,刚好为一个场信号周期(一帧)。
以下是计算式子(vsync_end代表v_sync的低电平截止时间范围):
vsync_end:
程序简单描述如下:
v_count计数:
always@(posedgeclk)
//当垂直刷新循环结束(满480)时v_count清零;否则当h_count计到规定的最大值(805)时加1计数;
v_sync的电平变化:
assignv_sync_pulse_w=(v_countassignv_sync=~v_sync_pulse_w;
1.1.2提供行列以及格线计数值
行或列计数:
line和pixel;
格线计数器:
line_cnt,pixel_cnt,strip_cnt
(1)line[8..0]:
用于对行数(1~480行)计数,其clk等于水平同步信号h_sync的下降沿;
(2)pixel[9..0]:
用于对每行的像素点数(1~640个点)计数,其clk等于输入时钟fclk25M。
/*3.line[8..0]对像素所处行计数*/
always@(negedgeh_sync)
//h_sync的下降沿触发line计数。
//当h_begin_time≦v_count≦h_end_time,且当
line≦480时,则line加1计数;
//否则line清零。
/*4.pixel[9..0]对像素所处列计数*/
always@(posedgeclk)
/*当1≦line≦480(必须有此条件,否则pixel在h_sync来后B+C时间之后即开始加1计数,而此时line=0),且p_begin_time≦h_count≦p_end_time,且pixel≦640时,则pixel加1计数;*/
//否则pixel清零。
(3)output[4:
0]line_cnt;//用于棋盘格1的水平格线计数32进制,32.2uss计数一次
(4)output[5:
0]pixel_cnt;//用于棋盘格1的垂直格线计数64进制40ns计数一次
(5)output[5:
0]strip_cnt;//用于横彩条2的水平格线计数64个64
32.2uss计数一次
2.1生成图形子模块
注:
RGB[2..0]:
颜色信号,R——红色信号;G——绿色信号;B——蓝色信号。
其对应颜色关系如下表所示。
功能:
根据时序控制子模块输出的像素位置信息,在不同的显示模式下,输出不同的颜色信号。
设计思路:
采用case语句,来确定不同的显示模式;在每种显示模式下,采用if-else语句,根据像素所处的位置(即line和pixel的范围),来确定输出不同的颜色信号。
对棋盘格1、横彩条2的格线的判断不用枚举的方法,而是根据vgacore2.v输出的格线计数器line_cnt、pixel_cnt和strip_cnt的大小,用if-else语句简单地实现。
本模块主要的图形生成程序简述如下:
/*2.根据cnt值产生不同的显示图形*/
always@(posedgeclk)
begin
if(line>9'd0&line<=9'd480&pixel>9'd0&pixel<=10'd640)//若在有
begin效区域内
case(cnt)
0:
begin/*
(1)模式1:
4大图形块*/
1:
begin/*
(2)模式2:
竖彩条*/
2:
begin/*(3)模式3:
横彩条*/
3:
begin/*(4)模式4:
棋盘格116*16*/
4:
begin/*(5)模式5:
小横彩条*/
5:
begin/*(6)模式6:
棋盘格230*40*/
endcase
end
elsergb=3‘b000;//超出有效区域,则为黑色
end
2.1.1VGA竖彩条发生和横彩条发生
竖彩条发横模块根据像素点计数器的h_count的计数值来产生彩条,其流程图如(a)所示。
它对行点数(像素点)计数器的数值进行判断,每80条竖线生成一种竖彩条,共八种竖彩条。
横彩条发生模块与竖彩条发生模块类似。
它根据场扫计数器(行)的计数值来残生横彩条,流程图如(b)所示。
每60条扫描线为一个彩条宽度,共8色横彩条模式。
Y
N
N
Y
Y
N
N
Y
Y
Y
Y
Y
Y
Y
Y
N
N
N
N
Y
Y
Y
N
N
N
N
N
N
N
N
Pixel<80
Pixel<160
Pixel<240
Pixel<320
Pixel<4000
Pixel<480
Pixel<560
Line<59
开始
Line<119
Line<179
Line<23999
Line<2999
Line<3599
Line<419
H_dat=111
H_dat=110
H_dat=101
H_dat=100
H_dat=011
H_dat=001
H_dat=000
H_dat=010
开始
v_dat=000
v_dat=001
v_dat=010
v_dat=011
v_dat=100
v_dat=101
v_dat=110
v_dat=111
横彩条(b)竖彩条(a)
2.1.2对模式6和模式2的简单描述如下:
根据vgacore2.v输出的格线计数器line_cnt、pixel_cnt和strip_cnt的大小,用if-else语句简单地实现。
line_cnt对行数进行计数,为32进制计数
模式6:
/*(6)模式6:
横彩条2--从上至下,每6行显示一种颜色,
分别为白、黄、粉、红、浅蓝、绿、黑、蓝,并重复此规律。
*/
5:
begin
if(strip_cnt<=6‘d6)rgb=3’b111;//白
elseif(strip_cnt<=6‘d12)rgb=3’b110;//黄
……
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;//格线为红色
elsergb=3'b001;//格内显示蓝色
end
……
N
Line=1?
N
N
N
Y
Y
Y
Y
开始(棋盘1模式)
Pixel=1?
Line_cnt=16?
32?
Pixel_cnt=16?
32?
48?
64?
RGB=100显示红色线
Rgb=001显示蓝色背景
(棋盘2)16*16棋盘
小横彩条
strip_cnt<=7
strip_cnt<=14
strip_cnt<=21
strip_cnt<=28
strip_cnt<=35
strip_cnt<=42
strip_cnt<=56
strip_cnt<=49
Rgb=100
Rgb=011
Rgb=010
Rgb=001
Rgb=000
Rgb=000
Rgb=111
Rgb=110
Rgb=101
Else
Rgb=101
strip_cnt<=63
3.1分频模块
本设计有两个分频器,一个是提供标准时钟信号25MHZ的二分频器,一个是提供按键去抖时钟1ms的25000分频器。
二分频:
分频系数计算公式:
25000分频:
分频系数计算公式:
感言:
这次课程设计让我对EDA软件工具QuartusII的运用有了更深一面的认识。
通过对VGA的学习以及设计,我认识到了VGA的工作原理以及关于VerilogVHL的简单语言思维。
本想让这设计能显示出图片与文字,但学识还未成熟,很遗憾这最后的一个课程设计没有能突破自己的计划。
但是,很高兴能认识到这门具有非常强悍潜力的知识,这门技术的背后非常的广阔,需要更多的知识和创造力。
附录
行与点的计数值
总电路
竖条
横条
16*16棋盘
..