基于FPGA的VGA显示 论文
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18: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 H z×60Hz模式。
下图(1)为VGA显示控制器控制CRT显示器
VGA(Video Graphic Array)接口,即视频图形阵列,也叫做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.1 VGA时序控制模块(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 + guard bands = 25.6μs + B + C +E = 32.2μs;
引入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 @( posedge clk) //25MHZ
// 在垂直刷新循环内,当h_count计到规定的最大值805时,则清零;否则加1计数
h_sync的电平变化:
assign h_sync_pulse_w = (h_count < hsync_end); //从h_count计数到94
(3.77us)为1,95~805为0 在
v_sync负脉冲宽度内,
v_sync_pulse_w为高电平assign h_sync=~h_sync_pulse_w;
(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 :