基于FPGA的VGA彩条信号产生器原理及源代码

合集下载

基于FPGA的VGA彩色图片的显示现场可编程门阵列

基于FPGA的VGA彩色图片的显示现场可编程门阵列

论文摘要:本论文依据VGA接口原理采用了Verilog HDL语言对Altera的Cyclone系列的FPGA进行了设计,通过MATLAB 二值化得到图片颜色的数据,将得到的数据存储到ROM中,然后读取ROM中的数据直接送到显示器,节省了计算机的处理过程,加快了数据的处理速度,节约了硬件成本。

此方案可以广泛应用于各种仪器,数字视频系统、高分辨率的彩色图片图像处理、视频信号再现等。

论文关键词:现场可编程门阵列,图像控制器,只读存储引言VGA接口显示器是计算机系统以及智能仪器中重要的显示终端设备。

标准的VGA接口需要提供以下几组基本的信号:行同步信号Hsync场同步信号Vsync以及红黄蓝3路模拟信号。

因此要使数字图像信息在VGA接口显示器正确、完整地显示,就涉及到了时序的构建和数字图像信息的模拟化两方面。

如果接口前端无可供利用的时序信息,那么就可参照有关标准来构造时序,这可利用可编程器件很方便地实现;另外由于VGA是一个模拟的接口标准,因此数字图像信息模拟化可用视频DA转换器来实现。

VGA标准是当前最常用的视频显示标准,还包括SVGA、XVGA等子标准。

本文主要以640×480,60Hz下VGA显示标准为例,实现一个满足多方面需求的VGA显示终端接口。

设计可应用于图像处理、视频信号再现、数据可视化分析等方面,实现方法和器件的选取以及设计应用列举都具有典型的代表意义。

理论分析VGA显示接口的硬件设计和原理(1)基本原理说明这次系统设计使用的显示器是满足VGA标准的常用的彩色显示器,由CRT(阴极射线管)构成,彩色由G、R、B(绿:Green,红:Red,蓝:Blue)三基色组成。

显示则用逐行扫描的方式解决,阴极射线枪发出电子束打在涂有荧光粉的荧光屏上,产生GRB三基色,合成一个彩色像素。

硬件选用了AnalogDevice公司的ADV7123。

ADV7123由三个10位高速DAC 组成,最高时钟速率为240MHZ,即可以达到最高240MS/s的数据吞吐率。

基于FPGA的VGA显示详解(附VHDL代码)

基于FPGA的VGA显示详解(附VHDL代码)

基于FPGA的VGA显示(后附VHDL代码)整个VGA的时序操作很简单,就是形成一个具有一定占空比的电平周期。

只是整个VGA的操作涉及到一些专有名词,理解上比较困难,一旦明白了这些是什么意思后,操作即将变得很简单。

VGA工作流程:常见的彩色显示器,一般由CRT (阴极射线管)构成,彩色是由R、G、B(红、绿、蓝)三基色组成,CRT用逐行扫描或隔行扫描的方式实现图像显示,由VGA控制模块产生的水平同步信号和垂直同步信号控制阴极射线枪产生的电子束,打在涂有荧光粉的荧光屏上,产生R、G、B三基色,合成一个彩色像素。

扫描从屏幕的左上方开始,由左至右,由上到下,逐行进行扫描,每扫完一行,电子束回到屏幕下一行的起始位置,在回扫期间,CRT对电子束进行消隐,每行结束是用行同步信号HS进行行同步;扫描完所有行,再由场同步信号VS进行场同步,并使扫描回到屏幕的左上方,同时进行场消隐,预备下一场的扫描。

行同步信号HS 和场同步信号VS是两个重要的信号。

注意点:什么时候消隐?为什么要消隐?当一行扫描完毕后然后电子枪又转到下一行的这段时间或是扫描完所有的行后电子枪回到第一行的这段时间,这两段时间都要消隐。

在消隐的时间内,数据是无效的。

这样就保证电子枪的回扫的个动作不干扰显示,因为回扫这个动作是很频繁的,若在这个时间段内数据有效,那么就回在显示屏上出现电子枪回扫的轨迹。

消隐的时候我们干什么?消隐这个动作是显示屏(CRT)执行的,我们在编程时只要注意有这么个东西就行。

同步信号(包括HS和VS)是什么?这个就相当于一个数据起始信号,表明数据马上就要开始了。

如果撇开具体的设备,那么这个信号和AD、DA中常用的Sync(同步)、CS(片选)信号相当。

该信号一般为负电平,但对于有的显示器可不关心该信号的极性,因为它内部可自动转换正负逻辑。

对于普通的VGA显示器,需要引出5个信号:R,G,B:三原色;HS:行同步信号;VS:场同步信。

FPGA—VGA显示

FPGA—VGA显示

VGA一、设计目的1、利用VHDL语言的描述方法进行设计完成VGA显示的系统设计;2、自行选择VGA显示模式;3、通过FPGA产生VGA Monitor的控制时序;4、通过FPGA产生彩条图形,在VGA显示器上显示;5、扩展要求:可以在拨动开关控制下,通过FPGA+VGA接口的系统在屏幕上显示不同图像。

二、设计原理1、VGA简要介绍显示绘图阵列(video graphic array,VGA)接口是LCD液晶显示设备的标准接口,大多应用在显示器与显卡之间,同时还可以用在等离子电视输入图像的模数转换上。

VGA显示输出RGB三原色信号,RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色,目前在图像显示领域中应用非常广泛。

2、VGA的显示特点(1)扫描格式繁多,分辨率从320×200一直延伸到1280×102,行频15.8~70Hz,场频50~100Hz。

常见的行频有31.4Hz,37.8Hz,57.9Hz,62.5Hz 等,常见场频有50Hz,60Hz,70Hz,100Hz,16700K之分。

(2)显示器的显示方式有两种:A/N显示方式和APA显示方式,即文本显示方式和图形显示方式。

A/N方式已淘汰不用,目前微机都采用APA图形方式。

(3)VGA接口为显示器提供两类信号,一类是数据信号,一类是控制信号。

数据信号包括红(Red)、绿(Green)、蓝(Blue)信号,简称RGB信号,控制信号包括水平同步信号和垂直同步信号。

输出不同分辨率时,水平同步信号和垂直同步信号的频率也不相同。

3、VGA显示原理常见的彩色显示器一般由CRT(阴极射线管)构成,彩色是由R(红)、G(绿)、B(蓝)三种基色组成。

显示是采用逐行扫描的方式,阴极射线枪发出的电子束打在涂有荧光粉的荧光屏上,产生RGB三色基,最后合成一个彩色图像。

浅谈应用FPGA实现彩条信号显示

浅谈应用FPGA实现彩条信号显示
p a n ev l c 和显示前沿 (r n o c ) ly it r a ) F o t p r h d 四个部分 。几
种 常用模式的时序参数如下表所示 。
1 } A 0 Z
a b段 段 段 c d段 段总共 n个列像素 e
_
的图像数据信号进 行控制 ,这样 就造 成了 CU资源 的浪 费 , P 同 信 号 保 持 在 V A规 定 的 O G V~0 7 .V之 间 。 V AH Y C 和 G S N
VA G
_ _
VARDVA G E ,G
GE N V A B U R E ,G LE置高或低来产生 8种颜色。 实际
泛 的应用 。 采用 F G PA对显示器的 v A 口进行设计, G接 数据流只 统的可靠 性和设计的灵活性 。

BU 。 L E 每个 电阻与终端的 7 5欧电缆 电阻相结合 , 确保颜色 V Y C信号使用 L T L或 LC O 3/ 标准驱动 电平 。 SN vT VMSIO 通过
直扫描信 号 。V A R D V AG E N V A B U G_ E ,G R E ,G _ L E是颜 色控制 信号 步脉冲 (y c a 、 S n ) 显示后沿 (a k p r h b 、 B c o c ) 显示时序段 (i— D s 线, 控制当前显示的像素色彩 。
技 术市场
浅谈 应 用 F GA 实现彩 条信号 显示 P
李 琳
武汉 4 0 7 ) 30 4 ( 武汉职业技 术学院, 湖北
【 摘
要】 G V A是 IM 在 18 年 随 P /机一起推 出的一种视频传输标准, B 97 S 2 具有分辨率高、 显示速 率快、 色丰富等优点.采 颜

基于FPGA的VGA图像显示

基于FPGA的VGA图像显示

基于FPGA的VGA图像显示1、VGA显示原理VGA标准是一种计算机显示标准,最初是由IBM公司在1987 年提出的,分辨率是640*480。

VGA 接口也叫做D_Sub 接口,是显卡上输出模拟信号的接口。

目前大多数计算机与外部显示设备之间都是通过模拟VGA接口连接,计算机内部以数字方式生成的显示图像信息,被显卡中的D/A 转换器转变为R、G、B三原色信号和行、场同步信号,信号通过电缆传输到显示设备中。

常见的彩色显示器一般由阴极射线管(CRT) 构成,彩色由GRB(Green Red Blue) 基色组成。

显示采用逐行扫描的方式解决,阴极射线枪发出电子束打在涂有荧光粉的荧光屏上,产生GRB 基色,合成一个彩色像素。

扫描从屏幕的左上方开始,从左到右,从上到下,逐行扫描,每扫完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT 对电子束进行消隐,每行结束时,用行同步信号进行行同步;扫描完所有行,用场同步信号进行场同步,并使扫描回到屏幕的左上方,同时进行场消隐,并预备进行下一次的扫描。

要实现VGA显示就要解决数据来源、数据存储、时序实现等问题,其中关键还是如何实现VGA时序。

VGA的标准参考显示时序如图1所示。

行时序和帧时序都需要产生同步脉冲(Sync a)、显示后沿(Back porch b)、显示时序段(Display interval c)和显示前沿(Front porch d)四个部分。

2、方案设计由VGA的显示原理可知,该任务的关键是VGA时序控制部分和汉字图形显示部分:(1)VGA时序控制部分,采用FPGA本地50MHz时钟,根据所需时序要求,经Verilog语言编写的计数模块分频而得到,该部分十分重要,如果产生的时序有偏差,那么就会使汉字图形无法显示或显示结果混乱;(2)汉字图形显示部分,有2种方法可以实现:第1 种是在对像素进行行计数、场计数的时候,就把字库信息直接赋值给颜色信号R、G、B,这种方法虽然简单,但是控制很不灵活,需要对汉字的显示像素一一判定对应的位置,容易出现错误,不易修改,所以本次采用的是第2 种方法,第2 种方法是使用FPGA内部的一种资源来存储汉字的字库信息,然后由程序将其提取出来作为显示信号发送到VGA 接口,以实现汉字图形的显示,这样就克服了第一种方法易出错又不易修改的缺点。

基于FPGA的VGA显示设计报告

基于FPGA的VGA显示设计报告

正文一,VGA时序标准VGA是一种常用的显示输出接口,采用行场扫描控制结合RGB三色合成原理,输出显示信号。

每个VGA接口为15针接口,分三行排布,每行5针。

如图所示:图1.1 VGA接口15针并未全部使用,有效的信号线共5根,即红绿蓝三基色信号线:R,G,B,每线电压从0V到0.71V变化,表示无色到饱和,依据电平高低,显示颜色的饱和程度。

行同步控制信号,Hsync,控制每行扫描像素的有效和失效。

场同步:Vsync,控制场方向,即整个图像显示过程的时间长度,场同步中的显示部分的时间长度,等于每行扫描时间的总和。

在不同刷新频率下,显示每个像素的时间是不同的,相同刷新频率下,每个像素显示时间是固定的,所以,不同的每个像素写入时间,导致了分辨率的不同。

因为VGA的显示是逐行扫描,每行从左到右扫描,到了行尾,回归到下一行的行头,继续向尾部扫描。

所以,显示原理是逐次写入每行的像素数据,直到整幅图像显示成功为止。

VGA显示的数据是不能锁存的,所以必须一次又一次的连续输入数据,72Hz的刷新率下,一秒钟显示72幅图像,所以,需要连续写入72幅图像,才能达到一秒的显示效果。

所以,VGA显示图像,要反反复复写入图像数据,才能得到持续的显示效果。

图1.2 VGA接口线序VGA显示,无法做到类似于TFT液晶屏的定点写入,VGA是扫描式暂时显示,所以时序显得尤为重要,时序出现失误,图像会出现走形,无法达到准确效果。

而显示的时序控制主要依靠两条数据通道:行同步和场同步,即Hsync和Vsync,其控制了扫描显示的起点和终点,同时控制扫描起点的时间,通过时间的控制,达到确定的显示效果。

具体的控制时序图如下:图1.3 VGA 同步时序VGA显示中,以每个像素写入时间作为FPGA时钟周期,所以每个时钟周期写入一组RGB像素值。

逐行写入,所以每行数据显示的结果,拼凑成一帧图像,72Hz下,每秒显示72帧图像。

由于本设计要求静态显示效果,所以,我们只定义一帧的数据,最后无限循环执行即可。

基于FPGA的VGA显示系统的设计与实现

基于FPGA的VGA显示系统的设计与实现
Embedded Systems 设计应用 嵌入式系统
责任编辑:叶雷
基于FPGA的VGA显示系统的设计与实现
Design and implementation of VGA display system based on FPGA
陈启武 白天蕊 西南交通大学 信息科学与技术学院(四川 成都 610031)
基色信号实现图像的正确显示。
图像显示控制模块vga_control_module.v的部分代码如
下:
module vga_control_module
(
input CLK, RSTn, Ready_Sig;
input [10:0] Column_Addr_Sig, Row_Addr_Sig,
input [63:0] Rom_Data;
摘要:针对VGA(视频图形阵列)接口显示器的检测需求,设计了一种基于Altera FPGA的VGA显示系统。详细介 绍了VGA显示的原理,采用硬件描述语言Verilog完成了VGA显示所需的驱动时序和图像存储相关模块的设计,并 对整个系统进行了综合仿真,验证了设计的正确性。仿真与测试结果表明,该设计可以在简单的情况下实现图像 或字符显示,节约了硬件成本,还可以满足不同显示标准的需要。 关键词:VGA;图像显示;FPGA;设计实现 DOI: 10.3969/j.issn.1005-5517.2016.2.013
此外,FPGA电路的可重构性,为系统功能的优化和升级以及
功能拓展提供
了很大的设计
空间。因此,
由FPGA完成
VGA图像的显
示和控制,较
好的实现了图
图1 VGA接口电路
像数据处理的
实时性和可靠性,具有成本低、结构简单、应用灵活的优点, 可以广泛应用于视频和计算机的显示技术领域。

基于FPGA实现VGA的彩色图片显示

基于FPGA实现VGA的彩色图片显示

基于FPGA实现VGA的彩色图片显示
0 引言
视频图形阵列显示接口是微机系统使用的一种通用显示接口,广泛应用于智能控制系统中,作为系统的显示终端。

对于由嵌入式微处理器构成的
图像处理系统来说,采用VGA显示输出具有兼容性强、显示内容丰富的优势。

同时,VGA显示接口具有结构简单、性能可靠、兼容性强、时序容易控
制的特点。

因此,结合FPGA的VGA图像控制器在嵌入式的图像处理系统中有广泛的应用前景。

目前大多数计算机与外部显示设备之间都是通过模拟VGA接口连接,计算机内部以数字方式生成的显示图像信息,被显卡中的数字/模拟转换器转
变为R、G、B三原色信号和行场同步信号,信号通过电缆传输到显示设备中。

1 VGA显示
常见的VGA接口的彩色显示器,一般由cRT(阴极射线管)构成,
色彩由R、G、B(红:Red,绿:Green,蓝:Blue三基色组成。

显示采用逐。

VGA彩色信号发生器

VGA彩色信号发生器

VGA 彩条信号发生器一、设计简要说明:用FPGA 实现VGA 的彩条信号显示,通过按键实现横纹、竖纹、方格图案的变化,并能进一步设计出文字、图像的显示。

显示图像分辩率为640×480,刷新率为60Hz 。

VGA 显示原理见教材《数字系统设计与V erilog HDL 》(第三版)P276,这里只做简单介绍。

当显示屏分辩率为640×480时,整个屏上有640×480=307200个点(也称为像素),每个点的位置由其所在行和列确定,如图1所示A 点的位置是410行450列。

一幅图像就由这样的点阵来显示,像素点点亮的方式为从左到右,从上到下一行一行地扫描,当一屏扫完也就完成了一帧图像的显示,一秒钟扫60帧图像,其刷新率为60Hz 。

设计的关键在于:1、显示某一颜色的位置;2、如何由二进制代表颜色应当注意,VGA 显示器每扫描完一行,再扫描一下行时会花一定时间来准备,因此要满足时序要求,见图2。

图2 VGA 行扫描时序图同样每扫描完一帧,再扫描下一帧行时也会花一定时间来准备,因此也要满足其时序要求,见图3。

图3 VGA 场扫描时序图显示的颜色用三位二进制表示,共可以显示八种颜色,对应关系见表1:表1颜色编码0 479450410从0计数到639 从0计数到479二、源代码及说明(参考) //VGA 彩条信号发生器源代码 /*引脚定义Clock50MHz :输入时钟,采用50MHz ;key :彩条选择信号,为"00"时显示竖彩条,为"01"时显示横彩条,其他情况显示棋盘格;rgb :输出三基色; hs :行同步信号; vs :场同步信号。

*/module color(clock50MHz,key,rgb,hs,vs);input clock50MHz; input[1:0] key; output hs,vs; output[2:0] rgb; reg hs,vs,clock; reg[2:0] rgb,rgbx,rgby; reg[9:0] hcnt,vcnt;parameter h_Ta=96,h_Tb=40,h_Tc=8,h_Td=640,h_Te=8,h_Tf=8,h_Tg=800; parameter v_Ta=2,v_Tb=25,v_Tc=8,v_Td=480,v_Te=8,v_Tf=2,v_Tg=525; always@(posedge clock50MHz) //2分频,得到25MHz 的频率 begin c lock<=~clock; e ndalways@(posedge clock) //行计数800begin if(hcnt==h_Tg-1) hcnt<=0; else hcnt<=hcnt+1;end always@(negedge hs) //场计数525begin if(vcnt==v_Tg-1) vcnt<=0; else vcnt<=vcnt+1;end always@(posedge clock) //时钟clock 为25MHz begin if(hcnt<=h_Ta-1) hs<=0; //产生行同步信号 else hs<=1; end always@(vcnt)begin if(vcnt<=v_Ta-1) vs<=0; //产生场同步信号 else vs<=1; end always@(posedge clock)begin //竖彩条 (说明显示的位置及颜色)if(hcnt<=h_Ta+h_Tb+h_Tc-1) rgbx<=3'b000; //黑色else if(hcnt<=h_Ta+h_Tb+h_Tc+80-1) rgbx<=3'b001; //红 else if(hcnt<=h_Ta+h_Tb+h_Tc+160-1) rgbx<=3'b010; //绿 else if(hcnt<=h_Ta+h_Tb+h_Tc+240-1) rgbx<=3'b100; //蓝 else if(hcnt<=h_Ta+h_Tb+h_Tc+320-1) rgbx<=3'b101; //青 else if(hcnt<=h_Ta+h_Tb+h_Tc+400-1) rgbx<=3'b110; //品 else if(hcnt<=h_Ta+h_Tb+h_Tc+480-1) rgbx<=3'b000; //黑 else if(hcnt<=h_Ta+h_Tb+h_Tc+560-1) rgbx<=3'b011; //黄 else if(hcnt<=h_Ta+h_Tb+h_Tc+640-1) rgbx<=3'b111; //白111 01B1 1 0 0 1 1 0 0 G 1 1 1 1 0 0 0 0 R 白 黄 青 红 品 绿 蓝 黑 颜色else rgbx<=3'b000;if(vcnt<=v_Ta+v_Tb+v_Tc-1) rgby<=3'b000; /*横彩条(说明显示的位置及颜色)*/else if(vcnt<=v_Ta+v_Tb+v_Tc+60-1) rgby<=3'b001; else if(vcnt<=v_Ta+v_Tb+v_Tc+120-1) rgby<=3'b010; else if(vcnt<=v_Ta+v_Tb+v_Tc+180-1) rgby<=3'b100; else if(vcnt<=v_Ta+v_Tb+v_Tc+240-1) rgby<=3'b101; else if(vcnt<=v_Ta+v_Tb+v_Tc+300-1) rgby<=3'b110; else if(vcnt<=v_Ta+v_Tb+v_Tc+360-1) rgby<=3'b111; else if(vcnt<=v_Ta+v_Tb+v_Tc+420-1) rgby<=3'b011; else if(vcnt<=v_Ta+v_Tb+v_Tc+480-1) rgby<=3'b111; else rgby<=3'b000; endalways @(key)begin if(key==2'b00) rgb<=rgbx; else if(key==2'b01) rgb<=rgby;else if(key==2'b10) rgb<=(rgbx+rgby); else rgb<=(rgbx-rgby); endendmodule 三、仿真结果。

经典_简单FPGA 彩色条 vga

经典_简单FPGA  彩色条 vga
`define V_FRONT_PORCH 37 // lines
`define V_SYNCH 6 // lines
`define V_BACK_PORCH 23 // lines
`define V_TOTAL 666 // lines
*/
/*
// 800 X 600 @ 75Hz with a 49.500MHz pixel clock
`define V_ACTIVE 600 // lines
`define V_FRONT_PORCH 1 // lines
`define V_SYNCH 2 // lines
`define V_BACK_PORCH 21 // lines
`define V_TOTAL 624 // lines
`define H_BACK_PORCH 48 // pixels
`define H_TOTAL 800 // pixels
`define V_ACTIVE 480 // lines
`define V_FRONT_PORCH 11 // lines
`define V_SYNCH 2 // lines
`define V_FRONT_PORCH 11 // lines
`define V_SYNCH 2 // lines
`define V_BACK_PORCH 31 // lines
`define V_TOTAL 524 // lines
*/
/*
// 640 X 480 @ 72Hz with a 31.500MHz pixel clock
`define V_ACTIVE 768 // lines

VGA彩条信号显示控制电路

VGA彩条信号显示控制电路

摘要本设计是用 FPGA 来实现 VGA 图像控制器,控制显示器显示彩条信号,用VHDL语言,在QuartusI I上实现软件仿真。

本文首先介绍了VGA显示的基本原理,然后提出了一种VGA图像控制器的设计方案,并用VHDL硬件描述语言和原理图输入的方法完成了该方案的设计,通过显示横彩条、竖彩条、棋盘格,验证了VGA_SYNC同步信号功能模块时序的正确性,软件实验环境为 Quartus II 6.0 开发软件。

本系统尝试用FPGA实现 VGA图像显示控制器,这一过程通过编程实现,之后通过软件的测试和仿真,当软件验证无误后完成硬件的下载验证,最终在显示器上实现输出,基本原理就是利用FPGA的可编程原理和VGA的时序控制原理,这在产品开发设计中有许多实际应用。

例如显示器,电视等的维修,可以期望采用FPGA设计的VGA接口可以将要显示的数据直接送到显示器,就可以可靠的找到故障的大致原因等。

从而省掉每次都要接信号源的麻烦,同时也节约了成本。

节省了计算机的处理过程,加快了数据的处理速度,节约了硬件成本。

同时亦可将其作为信号源,应用于电视机或计算机等彩色显示器的电路开发,方便彩色显示器驱动控制电路的调试。

[关键词]: VGA ;FPGA ;图像控制器AbstractThis design is the use of FPGA to realize VGA image controller, controls the display to display the color signal, using VHDL language, on the QuartusII software simulation. This paper firstly introduces the basic principle of VGA display, and then put forward a kind of VGA image controller design, and use VHDL hardware description language and schematic input method to complete the design, through to display the cross color, vertical striped, checkerboard, verification of the VGA_SYNC function module synchronization signal timing is correct, software test environment for Quartus II 6 software development.The system attempts to use the FPGA achieve VGA image display controller, this process is realized by programming, followed by the software testing and simulation, when the software validation correctly completes the hardware download verification, culminating in the display to achieve output, basic principle is the use of FPGA can weave Cheng Yuanli and VGA to control the timing of this principle, in product in the design of many practical applications. Such displays, television repair, can expect to use FPGA to design VGA interface can display data directly to the display, can reliably find fault causes etc.. In order to save every time the signal source of trouble, but also save the cost. Save a lot of computer process, accelerate the speed of dealing with data, save the cost of hardware. At the same time as the signal source, is applied to the television or computer color display circuit, convenient color display drive control circuit debugging.[Key words]: VGA; FPGA; image controller目录1 绪论.......................................................... -2 -2 设计要求及方案论证............................................ -3 -2.1 设计要求................................................ - 3 -2.2 设计方案................................................ - 3 -3 系统设计...................................................... -4 -3.1 设计原理................................................ - 4 -3.2 程序设计................................................ - 5 -3.2.1时钟部分.......................................... - 5 -3.2.2色彩显示部分...................................... - 5 -3.2.3程序流程图........................................ - 5 - 4系统仿真...................................................... - 5 - 5实验小结...................................................... - 9 - 参考文献....................................................... - 11 - 程序清单....................................................... - 11 -1绪论现如今,随着液晶显示器的出现,越来越多的数字产品开始使用液晶作为显示终端。

VGA彩条信号发生器

VGA彩条信号发生器

FPGA课程设计报告—VGA彩条信号发生器学院:班级:学号:姓名:完成日期:目录一.设计课题背景 (2)二.设计要求 (2)三.设计原理 (2)四. 设计方案 (3)五. 电路图 (5)六. 结果图 (5)七. 实验心得 (7)附录 (8)一.设计背景实验设计了基于VHDL描述的VGA显示控制器,通过FPGA控制CRT显示器显示色彩和图形,完成的功能包括横向和纵向彩色条幅的显示以及正方形色块。

二.设计要求1. 熟练掌握 VHDL语言和QuartusII 软件的使用。

2. 理解状态机的工作原理和设计方法。

3. 熟悉 VGA 接口协议规范。

4. 通过对VGA接口的显示控制设计,理解VGA接口的时序工作原理。

5. 利用 FPGA 实现 VGA 彩条信号发生器.6. 可以产生彩色横条, 彩色竖条信号, 彩色棋盘格信号.7. 由一个按键按照顺序选择不同模式的信号输出.三.设计原理1、显示控制原理常见的彩色显示器一般由阴极射线管(CRT)构成,彩色由GRB(Green Red Blue)基色组成。

显示采用逐行扫描的方式解决,阴极射线枪发出电子束打在涂有荧光粉的荧光屏上,产生GRB基色,合成一个彩色像素。

扫描从屏幕的左上方开始,从左到右,从上到下,逐行扫描,每扫完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT、对电子束进行消隐,每行结束时,用行同步信号进行行同步;扫描完所有行,用场同步信号进行场同步,并使扫描回到屏幕的左上方,同时进行场消隐,并预备进行下一次的扫描。

2、VGA时序信号计算机内部以数字方式生成的显示图像信息,被显卡中的数字/模拟转换器转变为R、G、B 三原色信号和行、场同步信号,信号通过电缆传输到显示设备中。

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

1、VGA彩条信号产生彩条信号产生模块包括了彩条模式控制、竖彩条发生、横彩条发生和棋盘格发生三个模块。

基于FPGA的VGA时序彩条信号实现方法及其应用

基于FPGA的VGA时序彩条信号实现方法及其应用
[ sr c ] VGA—i n in l a d c lrsrpi g r b an d b sn PGA. Ab ta t tmi g sg as n oo ti ma ewe eo t i e y u i g F
The i al w e e sgn s r us d s ou c s e a s r e w h n e de e o n t c r u t o c l pl s a v l pi g he ic is f o or a m di p a s ly
维普资讯
基 于 FPG A 的 VG A 时 序 彩 条 信 号
实 现 方 法 及 其 应 用
Th e h d t e r t e M t o o G ne a e VG A- m i Ti ng Col r S r p S g a s b o t i i n l y FPG A nd I s A p i a i n a t plc to
收 稿 日期 : 0 2 O — 3 2 O 5 O 九 五国家重点科技攻关项 目
低 成 本 的研 究 过程 中。

2 P DP显 示信 号 的 数 据 流 程
P P 是 一 种 矩 阵 式 平 面 显 示 器 件 , 的 输 入 图 像 D 它 必 须 是 数 字 式 的 , 果 输 入 的 图 像 信 号 是 模 拟 视 频 信 如 号 , 须 先 进 行 模 / 转 换 , 可 以 在 P P 上 进 行 显 必 数 才 D

转 lD换 卜 S 制 驱 A / 信 H 器 动路 号 1 V 电
CBlnk a


频× 控 视B 储 8 ’
图 1

特别是 19 9 2年 日本 富 士 通 公 司 开 始 2 1英 寸 AC

课程资料:基于fpga的vga时序彩条信号实现方法及其应用

课程资料:基于fpga的vga时序彩条信号实现方法及其应用

基于FPGA的VGA时序彩条信号实现方法及其应用时间:2007-06-11 来源: 作者: 点击:1051 字体大小:【】摘要:利用现场可编程逻辑器件产生VGA时序信号和彩条图像信号,并将其作为信号源,应用于彩色等离子显示器的电路开发,方便彩色等离子显示器驱动控制电路的调试.1 引言彩色等离子体显示器(Plasma Display Panel,简称PDP)是利用气体放电产生真空紫外线激发荧光粉进行发光显示的一种平板显示器件,它具有重量轻、厚度小、视角大、响应快、图像无畸变、不受磁场影响等许多优点。

自从1964年美国Illinois大学教授Bitze和Slottow 发现了放电气体的记忆效应,1966年Bitze教授利用交流气体放电现象发明等离子显示屏以来,等离子显示技术已获得了很大的发展,等离子显示器成为人们期望用以实现大屏幕显示的新型显示器件之一。

特别是1992年日本富士通公司开始21英寸AC型彩色PDP的批量生产并投放市场以来,等离子显示技术更是获得了长足的发展,42英寸级和60英寸级的大尺寸、全彩色的显示屏也已经投放市场。

目前,PDP业界正集中精力于提高图像质量、降低功耗、降低成本的研究过程中。

2 PDP显示信号的数据流程PDP是一种矩阵式平面显示器件,它的输入图像必须是数字式的,如果输入的图像信号是模拟视频信号,必须先进行模/数转换,才可以在PDP上进行显示。

模拟图像的转换如图1所示。

A/D转换电路将输入的计算机显示信号、电视信号等进行数字化后,得到8bit的红、绿、蓝三色信号,以及行、场同步信号、时钟信号和复合消隐信号等,再送到彩色PDP的存储控制电路进行处理,最后送到显示屏进行显示。

图13 VGA信号时序图2所示是计算机VGA(640×480,60Hz图像格式的信号时序图,其点时钟DCLK为25.175MHz,场频为59.94Hz。

图中Vsync为场同步信号,场周期Tvsync为16.683ms,每场有525行,其中480行为有效显示行,45行为场消隐期。

基于FPGA的VGA彩条图像显示

基于FPGA的VGA彩条图像显示

基于FPGA的VGA彩条图像显示1. 设计的任务及内容在电子电路领域中,设计自动化工具已经被广大电子工程师所接受,它必将取代人工设计方法并成为主要的设计手段。

目前,Verilog语言已经成为各家EDA工具和集成电路厂商认同和共同推广的标准化硬件描述语言,随着科学技术的迅猛发展,电子工业界经历了巨大的飞跃。

集成电路的设计正朝着速度快、性能高、容量大、体积小和微功耗的方向发展,这种发展必将导致集成电路的设计规模日益增大。

该实训的设计是用Verilog语言硬件描述语言设计出一个VGA图象显示控制器,用Verilog 硬件描述语言进行编程,把Verilog语言描述的VGA图象显示控制器所需的程序在QuartusⅡ软件环境下进行模拟仿真,以此来验证所设计的结果是否满足设计的要求。

在结果符合要求的情况下把Verilog程序下载到FPGA器件上,利用FPGA器件内部存储器存储所需要的数据,再通过VGA接口输出到显示器上,从而达到设计的要求。

VGA显示器因为其输出信息量大,输出形式多样等特点已经成为现在大多数设计的常用输出设备,FPGA以其结构的优势可以使用很少的资源产生VGA的各种控制信号。

CRT显示器作为一种通用型显示设备,如今已广泛应用于我们的工作和生活中。

与嵌入式系统中常用的显示器件相比,它具有显示面积大、色彩丰富、承载信息量大、接口简单等优点,如果将其应用到嵌入式系统中,可以显著提升产品的视觉效果。

如今随着液晶显示器的出现,越来越多的数字产品开始使用液晶作为显示终端。

但基于VGA标准的显示器仍是目前普及率最高的显示器[1]。

若驱动此类显示器,需要很高的扫面频率,以及极短的处理时间,正是由于这些特点,所以可以用FPGA来实现对VGA显示器的驱动。

本次专业课程设计即选用FPGA 来实现VGA的显示。

随着FPGA的不断发展及其价格的不断下降,FPGA的可编程逻辑设计的应用优势逐渐显现出来。

现在,越来越多的嵌入式系统选择了基于FPGA的设计方案。

基于FPGA的VGA时序彩条信号实现

基于FPGA的VGA时序彩条信号实现

基于FPGA的VGA时序彩条信号实现0 引言利用现场可编程逻辑器件产生VGA 时序信号和彩条图像信号,并将其作为信号源,应用于电视机或计算机等彩色显示器的电路开发,方便彩色显示器驱动控制电路的调试。

计算机显示器的显示有许多标准,常见的有VGA,SVGA 等。

在这里尝试用FPGA 实现VGA 图像显示控制器,这一过程通过编程实现,之后通过软件的测试和仿真,当软件验证无误后完成硬件的下载验证,最终在CRT 显示器上实现输出,基本原理就是利用FPGA 的可编程原理和VGA 的时序控制原理,这在产品开发设计中有许多实际应用。

1 VGA 显示原理VGA(Video Graphics Array)作为一种标准的显示接口得到了广泛的应用。

VGA 在任何时刻都必须工作在某一显示模式下,其显示模式分为字符显示模式和图形显示模式,而在应用中讨论的都是图形显示模式。

VGA的图形模式分为三类:CGA,EGA 兼容的图形模式;标准VGA 图形模式;VGA 扩展图形模式,后两种图形模式统称为VGA 图形模式。

文中基于标准VGA 模式来实现。

工业标准的VGA 显示模式为:640×480×16×60。

常见的彩色显示器一般由阴极射线管(CRT)构成,彩色由GRB(Green Red Blue)基色组成。

显示采用逐行扫描的方式解决,阴极射线枪发出电子束打在涂有荧光粉的荧光屏上,产生GRB 基色,合成一个彩色像素。

扫描从屏幕的左上方开始,从左到右,从上到下,逐行扫描,每扫完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT、对电子束进行消隐,每行结束时,用行同步信号进行行同步;扫描完所有行,用场同步信号进行场同步,并使扫描回到屏幕的左上方,同时进行场消隐,并预备进行下一次的扫描。

VGA 显示控制器控制CRT 显示图象的过程如图1 所示。

基于FPGA的游戏代码(VGA现实)

基于FPGA的游戏代码(VGA现实)

基于FPGA的游戏代码(VGA现实)//VGA显示module vga(clkin,btn_click,X,Y,red,green,blue,hsync,vsync, switch,reset,x_increment,y_increment,q,x_increment_2,y_incr ement_2,q_2,X_2,Y_2,btn_click_2,showmenu,inred,ingreen,inblue,inhsync,invsync,man1score,man2score, aiscore,music,nanyi);input clkin; //50MHzinput [2:0] btn_click; // button click: Left-Middle-Rightinput [9:0] X,Y;input [2:0] btn_click_2; // button click: Left-Middle-Rightinput [9:0] X_2,Y_2;input switch;input reset;input [8:0]x_increment;input [8:0]y_increment;input [32:0] q; //移位寄存器input [8:0]x_increment_2;input [8:0]y_increment_2;input [32:0] q_2;input showmenu;input inred;input ingreen;input inblue;input inhsync,invsync;input music,nanyi;output red,green,blue; output hsync,vsync;output [8:0]man1score; output [8:0]man2score; output [8:0]aiscore;reg red,green,blue;reg hsync,vsync;reg clk1; //25MHzreg[9:0] hcount,vcount; reg show;reg [18:0]e='d0;reg [18:0]f='d0;reg [18:0]g='d0;reg [18:0]h='d0;reg [12:0]ballx='d475; reg [12:0]bally='d275; reg [12:0]ballvx=0;reg [12:0]ballvy=0;reg [12:0]aix='d375; reg [12:0]aiy='d157; reg [12:0]aivx;reg [12:0]aivy;reg [12:0]man1x='d475; reg [12:0]man1y='d392; reg [12:0]man1vx;reg [12:0]man1vy;reg [12:0]man2x='d475;reg [12:0]man2y='d157;reg [12:0]man2vx;reg [12:0]man2vy;reg [8:0]aiscore='d0;reg [8:0]man1score='d0;reg [8:0]man2score='d0;reg visible='b1;reg restart='d0;reg [12:0]randnum;reg [12:0]temp;always@(posedge clkin) //分频beginclk1=~clk1;endparameter char_line00 = 128'h00000000000000000000000000000000,char_line01 = 128'h00000000000000000000000000000000, char_line02 = 128'h00000000000000000006000000000000, char_line03 = 128'h000E0000000018000003800000000000, char_line04 = 128'h000E000000001C000000800000001E00, char_line05 = 128'h000C000000600C0000007F80000FFF00, char_line06 = 128'h000C000007F00400007FFC0003FE0F80, char_line07 = 128'h000C00000630000003F0000001C01C00, char_line08 = 128'h000C0000062000300030780000003800,char_line09 = 128'h000C7C0006200FFC003F800000007000, char_line0a = 128'h003FFF000621FE00000000000000C000, char_line0b = 128'h0FEC0E00042780000001FC0000028000, char_line0c = 128'h060C0E0004A00200003E1C0000030000, char_line0d = 128'h060C0C0007A003000020180000018000, char_line0e = 128'h020FCC0004204320001FE00000018000, char_line0f = 128'h037F0C00042036300000008000018000, char_line10 = 128'h030C0C0004221E300001CFC000018000, char_line11 = 128'h030C180005A31C3007EE688000018000, char_line12 = 128'h030C180007A30E300648688000018000, char_line13 = 128'h010DF8000C231F300649488000018000, char_line14 = 128'h01FFB8200C2333300749488000008000, char_line15 = 128'h010C10200C23213004494E8000008000, char_line16 = 128'h000C002008234030044B4A8000018000, char_line17 = 128'h000C002008230030074A488000018000,char_line18 = 128'h000400301023FFF0044A088400018000, char_line19 = 128'h000600701067E0200844D884001F8000, char_line1a = 128'h000701F031E2002009C850C4000F8000, char_line1b = 128'h0003FFE020E0002010D0307C00038000, char_line1c = 128'h00007F004060000020A0203C00030000, char_line1d = 128'h00000000004000000000400400000000, char_line1e = 128'h00000000000000000000000000000000, char_line1f = 128'h00000000000000000000000000000000, char_line20 = 128'h00000000000000000000000000000000, char_line21 = 128'h00000000000000000000000000000000, char_line22 = 128'h00000000000E00000006000000000000, char_line23 = 128'h00000000000700000003800000000000, char_line24 = 128'h00000000000100000000800000001E00, char_line25 = 128'h00000F000000078000007F80000FFF00,char_line26 = 128'h00F07F000203FFE0007FFC0003FE0F80, char_line27 = 128'h03E0E00003FE01F003F0000001C01C00, char_line28 = 128'h1F000000060001800030780000003800, char_line29 = 128'h0100000006000000003F800000007000, char_line2a = 128'h010000000E03E000000000000000C000, char_line2b = 128'h01000FC00C7F00000001FC0000028000, char_line2c = 128'h0100FF0000060000003E1C0000030000, char_line2d = 128'h01F7D000000E08000020180000018000, char_line2e = 128'h03C1980000180C00001FE00000018000, char_line2f = 128'h1F019800007818000000008000018000, char_line30 = 128'h010********C30000001CFC000018000, char_line31 = 128'h010********E600007EE688000018000, char_line32 = 128'h010********B80000648688000018000, char_line33 = 128'h01331004006360000649488000018000, char_line34 = 128'h01C6100400C738000749488000008000, char_line35 = 128'h03861004010D9E0004494E8000008000, char_line36 = 128'h0E0C100400198F80044B4A8000018000, char_line37 = 128'h7C18180E003183F8074A488000018000, char_line38 = 128'h7030181E00C181F0044A088400018000, char_line39 = 128'h00600FFC018180000844D884001F8000, char_line3a = 128'h008007F00601800009C850C4000F8000, char_line3b = 128'h010000000001800010D0307C00038000, char_line3c = 128'h00000000001F000020A0203C00030000, char_line3d = 128'h00000000000700000000400400000000, char_line3e = 128'h00000000000600000000000000000000, char_line3f = 128'h00000000000000000000000000000000;reg[6:0] char_bit; //显示位计算 256 * 32reg[6:0] char_bit1;reg[6:0] char_bit2;reg[6:0] char_bit3;always@(posedge clk1)beginif(hcount==10'b1100011111) //799beginif(vcount==10'b1000001100)//524beginvcount<=10'b0;hcount<=10'b0;endelse beginhcount<=10'b0;vcount=vcount+1;endendelse hcount=hcount+1;endalways@(posedge clk1)beginshow=showmenu;if(show==0)beginif((hcount>10'b0000000111)&&(hcount<10'b0001101000)) //行同步宽度96个像素hsync<=1'b0;else hsync<=1'b1;endelse if(show==1) hsync<=inhsync;endalways@ (posedge clk1)beginif(show==0)beginif((vcount>10'b0000000001)&&(vcount<10'b0000000100))/ /场同步宽度2个行vsync<=1'b0;else vsync<=1'b1;endelse if(show==1) vsync<=invsync;end///////////////////////////////////////////////mainCode////////////////////////////////////////////////////////always @(posedge clkin) ////////ball's movementbegine=e+1;if (reset==1'b1)begin /////////reset!aiscore=0;man1score=0;man2score=0;visible=1;ballvx=0;ballvy=0;ballx=10'd475;bally=10'd275;endif(restart==1) begin /////////restart!visible=1;//yanshi3secondsballvx=0;ballvy=0;ballx=10'd475;bally=10'd275;restart=0;endif(e==500000)beginballx=ballx+ballvx;bally=bally+ballvy;e=0;if(ballx>=770)begin ballx=770;ballvx=-ballvx;end if(ballx<=180)begin ballx=180;ballvx=-ballvx;end if(bally>=500)begin bally=500;ballvy=-(ballvy);end if(bally<=50) begin bally=50;ballvy=-1*(ballvy);endif(ballx>375&&ballx<=575&&bally>=50&&bally<=58)beginvisible=0;ballvx=0;ballvy=0;man1score<=man1score+1;restart=1;endif(ballx>=375&&ballx<=575&&bally<=500&&bally>=492) beginvisible=0;ballvx=0;ballvy=0;if(switch==0) beginaiscore<=aiscore+1;restart=1;endelse man2score<=man2score+1;restart=1;end//if(man1score==7)beginyouwin=1;man1score=0;man2score=0;aiscore=0;end //if(aiscore==7||man2score==7)beginyoulose=1;man1score=0;man2score=0;aiscore=0;end if(switch==0) //man VS computerbeginif((ballx-aix)*(ballx-aix)+(bally-aiy)*(bally-aiy)<='d1225) beginballvx=ballvx;ballvy=-ballvy;ballx=ballx+(ballx>aix?4:(-4));bally=bally+(bally>aiy?4:(-4));endendelse //man1 vs man2begin//if((ballx-man2x)*(ballx-man2x)+(bally-man2y)*(bally-bally)<='d1255)if((ballx-X_2)*(ballx-X_2)+(bally-Y_2)*(bally-Y_2)<='d1225)begin//ballvx=aivx-ballvx;//ballvy=aivy-ballvy;ballvx=x_increment_2+(ballvx>0?ballvx:(-ballvx))*(ballx>X?1:(-1));ballvy=y_increment_2+(ballvy>0?ballvy:(-ballvy))*(bally>Y?1:(-1));ballx=ballx+(ballx>man2x?4:(-4));bally=bally+(bally>man2y?4:(-4));endendif(show==0)begin/////////////////////////////////////if((ballx-X)*(ballx-X)+(bally-Y)*(bally-Y)<='d1225)beginif(x_increment*x_increment+y_increment*y_increment>4)be gin endif((Y-bally)>'d30)//1/*beginif(ballvx==0&&ballvy==0)beginif(q[5]==0)ballvx=x_increment;elseballvx=-x_increment;ifballvy=y_increment;endelse*/ beginif(q[5]==0) ballvx=x_increment/'d8+(ballvx>0?ballvx:(-ballvx))*(ballx>X?1:(-1));//mouse rightelse ballvx=-x_increment/'d8+ (ballvx>0?ballvx:(-ballvx))*(ballx>X?1:(-1));if(q[6]==0) ballvy=-y_increment/'d8+(ballvy>0?ballvy:(-ballvy))*(bally>Y?1:(-1));//mouse upelse ballvy=y_increment/'d8+(ballvy>0?ballvy:(-ballvy))*(bally>Y?1:(-1));end// endif((bally-Y)>'d30)//2beginif(ballvx==0&&ballvy==0)beginballvx=x_increment;ballvy=y_increment;endelse beginif(q[5]==0) ballvx=x_increment/'d8+(ballvx>0?ballvx:(-ballvx))*(ballx>X?1:(-1));//mouse rightelse ballvx=-x_increment/'d8+(ballvx>0?ballvx:(-ballvx))*(ballx>X?1:(-1));if(q[6]==0) ballvy=-y_increment/'d8+(ballvy>0?ballvy:(-ballvy))*(bally>Y?1:(-1));//mouse upelse ballvy=y_increment/'d8+(ballvy>0?ballvy:(-ballvy))*(bally>Y?1:(-1));endendif(bally>=(Y-'d30)&&bally<y&&ballx bdsfid="384">X)//3 begintemp=(ballvx>0?ballvx:(-ballvx))*(ballx>X?1:(-1));ballvx=(ballvy>0?ballvy:(-ballvy))*(bally>Y?1:(-1));ballvy=temp;endif(bally<(Y+'d30)&&bally>=Y&&ballx>X)//4begintemp=(ballvx>0?ballvx:(-ballvx))*(ballx>X?1:(-1));ballvx=(ballvy>0?ballvy:(-ballvy))*(bally>Y?1:(-1));ballvy=-temp;endif(bally>=(Y-'d30)&&bally<y&&ballxbegintemp=(ballvx>0?ballvx:(-ballvx))*(ballx>X?1:(-1));ballvx=-(ballvy>0?ballvy:(-ballvy))*(bally>Y?1:(-1));ballvy=-temp;if(bally>(Y+'d30)&&bally>=Y&&ballxbegintemp=(ballvx>0?ballvx:(-ballvx))*(ballx>X?1:(-1));ballvx=(ballvy>0?ballvy:(-ballvy))*(bally>Y?1:(-1));ballvy=temp;endballx=ballx+(ballx>man1x?4:(-4));bally=bally+(bally>man1y?4:(-4));if(ballvx*ballvx+ballvy*ballvy>=2)beginballvx=ballvx;ballvy=ballvy;endendend//////////////////////endendalways@(posedge clkin) ////////ai's movementif(switch==0&&show==0)beginif(reset==1||restart==1)begin aix='d475;aiy='d157;endg=g+1;if(g==500000)g=0;aix=aix+aivx;aiy=aiy+aivy;if(aix<190)aix=190;if(aix>760)aix=760;if(a</y&&ballx</y&&ballx> iy<60) aiy=60;if(aiy>255) aiy=255;if(aixbeginif(ballvx>0)aivx=1*ballvx; if(ballvx<0)aivx=-1*ballvx; if(ballvx==0)aivx=1;endif(aix>ballx)beginif(ballvx>0)aivx=-1*ballvx; if(ballvx<0)aivx=1*ballvx; if(ballvx==0)aivx=-1; endendend////////////////////////////////////////////////Main VGA Code////////////////////////////////////////////////////////////always@(posedge clk1)beginif(show==1)begin{red,green,blue}<={inred,ingreen,inblue};end/////////////////////////////////////////////////////////////////// if(man1score==7)beginif(hcount == 10'd420) char_bit2 <= 7'd128; //先显示最高位数据 128 wei 572是X轴的起始坐标else if(hcount > 10'd420 && hcount < 10'd548) char_bit2 <= char_bit2-1'b1; //依次显示后面的数据if(hcount > 10'd420 && hcount < 10'd548) begin //////////kai shi you xicase(vcount)10'd321: if(char_line20[char_bit2]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd322: if(char_line21[char_bit2]){red,green,blue}<=3'b110; //红色else {red,green,blue}<=3'b010; //绿色10'd323: if(char_line22[char_bit2]) {red,green,blue}<= 3'b110; //红色10'd324: if(char_line23[char_bit2]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd325: if(char_line24[char_bit2]) {red,green,blue}<= 3'b110; //红seelse {red,green,blue}<= 3'b010; //绿色10'd326: if(char_line25[char_bit2]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd327: if(char_line26[char_bit2]) {red,green,blue}<= 3'b110; //红色else {red,green,blue} <= 3'b010; //绿色10'd328: if(char_line27[char_bit2]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd329: if(char_line28[char_bit2]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd330: if(char_line29[char_bit2]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd331: if(char_line2a[char_bit2]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd332: if(char_line2b[char_bit2]) {red,green,blue}<=3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd333: if(char_line2c[char_bit2]) {red,green,blue}<= 3'b110; //红色10'd334: if(char_line2d[char_bit2]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd335: if(char_line2e[char_bit2]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd336: if(char_line2f[char_bit2]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色/////-------------------------------------------------------------------10'd337: if(char_line30[char_bit2]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd338: if(char_line31[char_bit2]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd339: if(char_line32[char_bit2]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd340: if(char_line33[char_bit2]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd341: if(char_line34[char_bit2]) {red,green,blue}<= 3'b110; //红seelse {red,green,blue}<= 3'b010;//绿色//红色else {red,green,blue}<= 3'b010; //绿色10'd343: if(char_line36[char_bit2]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd344: if(char_line37[char_bit2]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd345: if(char_line38[char_bit2]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd346: if(char_line39[char_bit2]) {red,green,blue}<= 3'b110; //红色else{red,green,blue}<= 3'b010; //绿色10'd347: if(char_line3a[char_bit2]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd348: if(char_line3b[char_bit2]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd349: if(char_line3c[char_bit2]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd350: if(char_line3d[char_bit2]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd351: if(char_line3e[char_bit2]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色//红色else {red,green,blue}<= 3'b010; //绿色endcaseendendif(man2score==7)beginif(hcount == 10'd420) char_bit1 <= 7'd128; //先显示最高位数据 128 wei 572是X轴的起始坐标else if(hcount > 10'd420 && hcount < 10'd548) char_bit1 <= char_bit1-1'b1; //依次显示后面的数据if(hcount > 10'd420 && hcount < 10'd548) begin //////////kai shi you xicase(vcount)10'd201: if(char_line20[char_bit1]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd202: if(char_line21[char_bit1]){red,green,blue}<=3'b110; //红色else {red,green,blue}<=3'b010; //绿色10'd203: if(char_line22[char_bit1]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd204: if(char_line23[char_bit1]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd205: if(char_line24[char_bit1]) {red,green,blue}<= 3'b110; //红seelse {red,green,blue}<= 3'b010; //绿色10'd206: if(char_line25[char_bit1]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd207: if(char_line26[char_bit1]) {red,green,blue}<= 3'b110; //红色else {red,green,blue} <= 3'b010; //绿色10'd208: if(char_line27[char_bit1]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd209: if(char_line28[char_bit1]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd210: if(char_line29[char_bit1]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd211: if(char_line2a[char_bit1]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd212: if(char_line2b[char_bit1]) {red,green,blue}<=3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd213: if(char_line2c[char_bit1]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd214: if(char_line2d[char_bit1]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd215: if(char_line2e[char_bit1]) {red,green,blue}<= 3'b110;//红色else {red,green,blue}<= 3'b010; //绿色10'd216: if(char_line2f[char_bit1]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色/////-------------------------------------------------------------------10'd217: if(char_line30[char_bit1]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd218: if(char_line31[char_bit1]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd219: if(char_line32[char_bit1]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd220: if(char_line33[char_bit1]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd221: if(char_line34[char_bit1]) {red,green,blue}<= 3'b110; //红seelse {red,green,blue}<= 3'b010;//绿色10'd222: if(char_line35[char_bit1]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd223: if(char_line36[char_bit1]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd224: if(char_line37[char_bit1]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd225: if(char_line38[char_bit1]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd226: if(char_line39[char_bit1]) {red,green,blue}<= 3'b110; //红色else{red,green,blue}<= 3'b010; //绿色10'd227: if(char_line3a[char_bit1]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd228: if(char_line3b[char_bit1]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd229: if(char_line3c[char_bit1]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd230: if(char_line3d[char_bit1]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd231: if(char_line3e[char_bit1]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd232: if(char_line3f[char_bit1]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色endcaseendendif(aiscore==7)beginif(hcount == 10'd420) char_bit <= 7'd128;else if(hcount > 10'd420 && hcount < 10'd548) char_bit <= char_bit-1'b1;if(hcount > 10'd420 && hcount < 10'd548) begincase(vcount)10'd201: if(char_line00[char_bit]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd202: if(char_line01[char_bit]){red,green,blue}<=3'b110; //红色else {red,green,blue}<=3'b010; //绿色10'd203: if(char_line02[char_bit]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd204: if(char_line03[char_bit]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd205: if(char_line04[char_bit]) {red,green,blue}<= 3'b110; //红seelse {red,green,blue}<= 3'b010; //绿色10'd206: if(char_line05[char_bit]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd207: if(char_line06[char_bit]) {red,green,blue}<= 3'b110; //红色else {red,green,blue} <= 3'b010; //绿色10'd208: if(char_line07[char_bit]) {red,green,blue}<= 3'b110;//红色else {red,green,blue}<= 3'b010; //绿色10'd209: if(char_line08[char_bit]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd210: if(char_line09[char_bit]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd211: if(char_line0a[char_bit]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd212: if(char_line0b[char_bit]) {red,green,blue}<=3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd213: if(char_line0c[char_bit]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd214: if(char_line0d[char_bit]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd215: if(char_line0e[char_bit]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd216: if(char_line0f[char_bit]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色/////-------------------------------------------------------------------10'd217: if(char_line10[char_bit]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd218: if(char_line11[char_bit]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd219: if(char_line12[char_bit]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd220: if(char_line13[char_bit]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd221: if(char_line14[char_bit]) {red,green,blue}<= 3'b110; //红seelse {red,green,blue}<= 3'b010;//绿色10'd222: if(char_line15[char_bit]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd223: if(char_line16[char_bit]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd224: if(char_line17[char_bit]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd225: if(char_line18[char_bit]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd226: if(char_line19[char_bit]) {red,green,blue}<= 3'b110; //红色else{red,green,blue}<= 3'b010; //绿色10'd227: if(char_line1a[char_bit]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd228: if(char_line1b[char_bit]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd229: if(char_line1c[char_bit]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd230: if(char_line1d[char_bit]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd231: if(char_line1e[char_bit]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色10'd232: if(char_line1f[char_bit]) {red,green,blue}<= 3'b110; //红色else {red,green,blue}<= 3'b010; //绿色endcaseendend////////////////////////////////////////////////////////////////// if(show==0&&man1score!=7&&man2score!=7&&aiscore! =7)beginif(((hcount-X)*(hcount-X)+(vcount-Y)*(vcount-Y))<='b110111111)begin{red,green,blue}<=btn_click + 1'b1;end ///////////man1else {red,green,blue}<=3'b000;if((hcount>=375)&&(hcount<=575)&&(((vcount>=40)&&( vcount<=50))||((vcount>=500)&&(vcount<=510)))) begin{red,green,blue}<=3'b001; ////////two gatesendif(hcount>=170&&hcount<=780&&((vcount>=40&&vcou nt<=42)||(vcount>=508&&vcount<=510)||vcount==275)) begin{red,green,blue}<=3'b011; ///////heng bian kuangendif(vcount>=40&&vcount<=510&&((hcount>=170&&hcou nt<=172)||(hcount>=778&&hcount<=780)))begin{red,green,blue}<=3'b011; ///////shu bian kuangendif(((hcount-475)*(hcount-475)+(vcount-275)*(vcount-275))<='b111110111111&&((hcount-475)*(hcount-475 )+(vcount-275)*(vcount-275))>='b111110000000)begin{red,green,blue}<=3'b011; ///////zhong xin yuanendif((((hcount-ballx)*(hcount-ballx)+(vcount-bally)*(vcount-bally))<='b10111111)&&(visible==1))begin{red,green,blue}<=3'b100; //////// ballendif(switch==0)beginif((hcount-aix)*(hcount-aix)+(vcount-aiy)*(vcount-aiy)<='b110111111)begin{red,green,blue}<=3'b001; ////////aiendendif(switch==1)beginif((hcount-X_2)*(hcount-X_2)+(vcount-Y_2)*(vcount-Y_2)<='b110111111)begin{red,green,blue}<=btn_click_2 + 1'b1; //////// man2 endendendendendmodule。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、VGA显示原理
1、VGA显示器采用光栅扫描方式,即轰击荧光屏的电子束在CRT显示器上从左到右、从上到下做有规律的移动,其水平移动受水平同步信号HSYNC控制,垂直移动受垂直同步信号VSYNC控制。

扫描方式多采用逐行扫描。

完成一行扫描的时间称为水平扫描时间,其倒数称为行频率,完成一帧扫描时间称为竽扫描时间,其倒数称为场频,又称为刷新率。

VGA 工业标准要求的时钟频率如下:
时钟频率25.175MHZ
行频31469HZ
场频59.94HZ
2、VGA显示器总是从屏幕的左上角开始扫描同,先水平扫描完一行(640个像素点)到最右边,然后回到最左边(期间CRT对电子束作行消隐),换下一行,继续扫描,直到扫描到屏幕的最右下角(共480行),这样就扫描完一帧图像,然后再回到屏幕最左上角(期间CRT 对电子束作场消隐),开始下一帧图像的扫描。

这样的扫描标准VGA模式(640*480*60HZ)下,每秒需扫描60帧,面每一个像素点的扫描周期大约为40ns。

3、VGA显示器上的每一个像素点可以有多种颜色,由三基色信号R、G、B组合构成,本例中为节省空间,每个像素点采用3位二进制数表示(R、G、B信号各为1位),因此总共可显示8种颜色,如表1所示。

图1
表2 行扫描时序要求(单位:像素)
根据以上的行、场扫描时序的要求,我们可设置两个计数器,一个是行计数器hcnt,进行模800计数;另一个是场计数器vcnt,进行模525计数。

行扫描计数器的驱动时钟频率(像素输出的频率)按照VGA工业标准为25.175MHZ。

场扫描计数器以行同步信号HS为驱动时钟,当HS的下降沿到来时进行计数。

设置完计数器后,就可对行图像H-Td和场图像V-Td 所对应的640*480个点赋值。

二、源代码。

在下面的例子中,实现了一个彩条信号产生器。

其中key为控制按键,当其为“00”时,显示竖彩条;当其为“01”时,显示横彩条。

其它值时显示棋盘格。

VGA彩条信号发生器源代码
/*引脚定义
clock50MHZ :输入时钟采用50MHZ:
key :彩条选择信号,为“00”时显示竖彩条,为“01”时横彩条,其它情况显示棋盘格;rgb :输出三基色;
hs :行同步信号;
vs :场同步信号。

*/
module color(clock50MHZ, key, rgb, hs, vs);
input clock50MHZ ; input[1:0] key ; output hs, vs ; output[2:0] rgb ;
reg hs, vs,clock ; reg[2:0] rgb ,rgbx , rgby ; reg[9:0] hcut ,vcut ;
parameter h_Ta=96 , h_Tb=40 , h_Tc=8 , h_Td=640 , h_Te=8 , h_Tf=8 , h_Tg=800 ; parameter v_Ta=2 , v_Tb=25 , v_Tc=8 , v_Td=480 , v_Te=8 , v_Tf=2 ,v_Tg=525 ; always@(posedge clock50MHZ) //2分频,得到25MHZ的频率
begin clock<=~clock ; end
always@(posedge clock) //行计数800
begin if(hcnt==h_tg-1) hcnt<=0 ; else hcnt<=hcnt+1 ; end
always@(negedge hs) //场计数525
begin if(vcnt==v_tg-1) vcnt<=0 ; else vcnt<=vcnt+1 ; end
always@(posedge clock) //产生行同步信号
begin if(hcnt〈=h_ta-1) hs<=0 ; else hs<=1 ; end
always@(vcnt) //产生场同步信号
begin if(vcnt〈=v_ta-1) vs<=0 ; else vs<=1 ; end
always@(posedge clock)
begin
if(hcnt<=h_Ta+ h_Tb+ h_Tc-1) rgbx<=3‵b000; //竖彩条
else if(hcnt<=h_Ta+ h_Tb+ h_Tc+80-1) rgbx<=3‵b100;
else if(hcnt<=h_Ta+ h_Tb+ h_Tc+160-1) rgbx<=3‵b010;
else if(hcnt<=h_Ta+ h_Tb+ h_Tc+240-1) rgbx<=3‵b001;
else if(hcnt<=h_Ta+ h_Tb+ h_Tc+320-1) rgbx<=3‵b101;
else if(hcnt<=h_Ta+ h_Tb+ h_Tc+400-1) rgbx<=3‵b110;
else if(hcnt<=h_Ta+ h_Tb+ h_Tc+480-1) rgbx<=3‵b000;
else if(hcnt<=h_Ta+ h_Tb+ h_Tc+560-1) rgbx<=3‵b011;
else if(hcnt<=h_Ta+ h_Tb+ h_Tc+640-1) rgbx<=3‵b111;
else rgbx<=3‵b000;
if(vcnt<= v_Ta+ v_Tb+ v_Tc-1) rgby<=3‵b000; //竖彩条else if(vcnt<= v_Ta+ v_Tb+ v_Tc60-1) rgby<=3‵b001;
else if(vcnt<= v_Ta+ v_Tb+ v_Tc120-1) rgby<=3‵b010;
else if(vcnt<= v_Ta+ v_Tb+ v_Tc180-1) rgby<=3‵b100;
else if(vcnt<= v_Ta+ v_Tb+ v_Tc240-1) rgby<=3‵b101;
else if(vcnt<= v_Ta+ v_Tb+ v_Tc300-1) rgby<=3‵b110;
else if(vcnt<= v_Ta+ v_Tb+ v_Tc360-1) rgby<=3‵b111;
else if(vcnt<= v_Ta+ v_Tb+ v_Tc420-1) rgby<=3‵b011;
else if(vcnt<= v_Ta+ v_Tb+ v_Tc480-1) rgby<=3‵b111;
else rgby<=3‵b000;
end
always@(key)
begin if(key==2‵b00) rgb<=rgbx;
else if(key==2‵b01) rgb<=rgby;
else rgb<=(rgbx+rgby);
end
endmodule。

相关文档
最新文档