基于FPGA的VGA波形显示方法研究
随着微电子技术的发展,应用FPGA技术开发的信号处理系统在各种行业中得到了广泛的应用。VGA是IBM公司在1987年随PS/2机一起推出的一种视频传输标准,具有分辨率高、显示速度快、颜色丰富等优点,在彩色显示器领域得到了广泛的应用。采用FPGA设计VGA控制器也是近几年研究的一个热点,这种方式设计的显示系统,在不使用VGA显示卡的情况下,实现图像的显示和控制,具有成本低、结构简单、应用灵活的优点。目前关于这方面的研究论文主要集中在显示原理的介绍、FPGA设计VGA时序控制器[1-2]以及图像显示方法[3-4]上,至于波形的显示方法主要集中在计算机上通过显卡实现,利用FPGA而无需显卡的VGA显示波形的讨论比较少见。本文依据VGA显示原理,介绍两种VGA显示波形的方法,给出了两种波形显示方法的流程图,同时针对波形显示中出现的不稳定性提出了一种稳定显示波形的策略,并给出了VGA显示的结果波形。显示方法利用Verilog HDL 语言作为逻辑描述手段,在QuartusII软件环境下使用Stratix II系列的FPGA芯片完成。
1 VGA显示原理
常见的彩色显示器一般由CRT构成,彩色由R、G、B三色组成。采用逐行扫描的显示方式,阴极射线枪发出的电子束打在涂有荧光粉的荧光屏上,产生R、G、B 三基色,最后合成一个彩色图像。
对于图像的显示,可以利用行、场同步信号的计数器,在显示可视区间内按照图片的大小划定行和列的起始坐标和终止坐标,当扫描点在图像显示区域内时,根据扫描点在图像显示区中的相对坐标位置,计算得到当前要显示的图像像素点在图像存储器中的地址,然后读取显示。
如图1所示,x表示行计数器的计数值(行坐标),y表示列计数器计数值(列坐标),显示的分辨率为H×V,(x,y)为显示区域内的任意一像素点。波形显示区域的大小为M×N,起始点为(m0,n0),(m,n)则为扫描点在波形显示区域中的相对坐标。当扫描点到达波形显示区域时, 即满足以下关系:
则有m=x-m0,n=y-n0;此时,可以将m作为波形存储器的地址,取出波形数据进行显示,波形存储器的大小可以设置为大于或等于M。
2 波形显示方法
在这里讨论两种波形显示的方法。假设存储在波形RAM中的数据为x(k),(m,n)为扫描点在波形显示区域中的相对坐标。
方法一:如图2(a)流程所示,当扫描点进入波形显示区域时,开始读取波形RAM中的数据,将读出的数据x(k)与当前扫描点在波形显示区域中的纵坐标n或者N-n作比较,如果相等则显示,否则不显示。图2(b)所示为方法一显示的效果图。
方法二:如图3(a)流程所示,当扫描点进入波形显示区域时,开始读取波形RAM中的数据,将当前扫描点在波形显示区域中的纵坐标n或者N-n与读出的当前数据x(k)和上一个波形数据x(k-1)进行对比,如果扫描点刚好处于这两个值之间则显示,否则不予显示。图3(b)所示为方法二显示的效果图。
3 显示控制器设计
VGA显示控制器须提供R、G、B三基色图像信号,HS行同步信号和VS场同步信号。由于VGA接口显示器仅能处理串行模拟信号,因此,VGA控制器所产生的信号经D/A转换器将数字信号转变为模拟信号后发送给显示器使用。VGA显示器正确、完整地显示数字图像包括时序的构建和数字图像信息的模拟化两个方面。据此系统硬件实现框图如图4所示,系统硬件由ADC控制模块、波形稳定控制模块、RAM存储模块、VGA控制模块组成。在ADC控制模块的控制下将A/D转换器转换后的数字信号经波形稳定模块处理后,存入数据缓存器RAM内,而后VGA控制器在驱动显示器的时候,读取数据缓存器中的数据进行显示[5]。通常VGA显示器显示的数据量较大,而FPGA内置的片内存储器资源很难满足存储量的需求,因此,一般都需要通过外接存储器进行扩展,对于图像等大数据量处理系统通常选用SDRAM进行扩展[6],本系统只进行波形的显示,不进行数据处理等操作,故片内存储器足够满足使用要求。
需要说明的是,信号的A/D采集时钟选为125 MHz,而VGA的显示标准选择的是视频电子标准协会VESA(Video Electronics Standards Association)即为1 280×1 024@60 Hz,故像素时钟为108 MHz。为了产生这两种时钟,在FPGA片外接100 MHz的晶振,使用FPGA内部两个锁相环经倍频后得到。对于不同时钟速率之间的数据交换, 一般会通过使用FIFO进行缓冲,本文使用双端口RAM进行缓存,配置为一个读端口和一个写端口,两个端口拥有各自独立的时钟(分别为108 MHz和125 MHz), 设计简单的控制时序就可实现数据的正确读写。
3.1 存储数据宽度的选择
通常ADC的分辨率为12 bit或者14 bit,支持补码形式表示,数字信号表示的最大范围为4 096或者16 384,而实际的显示器的分辨率远远小于此值,常见的有640×480、1 024×768、1 280×1 024等。因此根据显示波形区域的大小,存储在显示缓存器中数据宽度可以缩减,例如波形显示区域的大小为1 024×512,选用横向显示,则可将显示数据的宽度截取为9 bit,这样一来最大值不会超过511,避免了数据值较大而无法显示的情况。本文中所选用的波形显示区域大小为1 024×768,即M=1 024,N=768,显示数据截取为10 bit,但需注意,并不是从采集进来的数字信号直接截取。为了防止数据较大而溢出波形显示区域,作如下处理:首先从ADC采集进来的数据分别截取9 bit和8 bit,然后将截取后的两个数据进行相加,结果为10 bit数据,其最大值不会超过768,这样就防止了显示溢出而导致的波形显示失真。
3.2 稳定显示波形策略
由于系统采集的时钟与VGA显示的像素时钟不同,通常都会选取部分数据进行显示,而其余的数据将会被丢弃,因此如何选取数据变得尤为重要,如果选取不合适,会造成显示波形闪动,无法分辨。为了使显示的波形稳定,在数据采集时进行了预处理:首先判断扫描点是否在波形显示区域内,如果在,则读取波形RAM中的数据并显示;否则对采集进来的信号进行基准点检测,当检测到基准点时,开始向波形RAM中写数据,写满时停止写入,而后面采集的信号全部丢弃。利用这种方式,显示的基准点位于显示区域最左边线,而通常需要将显示的基准点移至显示区域的中心位置。对于这种方式的实现方案是:首先定制大于或等于2倍于显示宽度大小的波形RAM,当扫描点不在波形显示区域中时,开始将采集的数据进行存储。当数据存储地址大于显示区域宽度一半时,开始检测基准点,同时将采集的数据继续写入波形RAM中,检测到基准点时,将此点对应的数据地址tadd保存起来,而后继续存储直至存满为止。当扫描点到达波形显示区域时,从地址radd开始读取数据进行显示,这样就达到了目的。其中地址radd的计算公式为:
需要说明的是,以上介绍的稳定显示波形策略,存储器资源占用很少,大量采集的数据将会被丢失。当VGA控制器以像素时钟读取波形RAM时,从ADC采集进来的数据不会写入波形RAM,以保持波形的完整性;当VGA控制器不读取波形RAM时,ADC采集进来的数据以采集速率写入波形RAM中,直到写满后停止。对于本系统设计,当VGA控制器不读取波形RAM时,能够保证波形RAM写满完整一帧数据。当n0≤y≤n0+N成立时,需要的时间为1 280×768÷108 MHz≈9.102μs,对波形RAM不进行写入操作。不满足时,需要的时间为1280×256÷108 MHz≈2.427 μs;如果波形RAM的大小为2 KB,采集速率为125 MHz, 则写入波形RAM的时间为2048÷125 MHz≈16.384 ns,可见对于波形RAM有足够的时间进行写入操作。以上分析均没有考虑消隐所用的时间。
3.3 VGA时序
在VGA 接口协议中,不同的显示模式都有严格的工业标准、不同的分辨率或不同的刷新频率,故其时序也不相同[7]。VESA的标准参考显示时序如图5所示,B为行同步信号,占用112个像素时钟周期,C为行消隐后肩, E为行消隐前肩,D为有效数据显示期;P为场同步信号,占用3个行周期,Q为场消隐后肩,S为场消隐前肩,R为行有效显示期。在逐行扫描情况下,1 280×1 024分辨率有效显示区域为每行1 280个像素,一场1 024行,实际考虑到行消隐和场消隐时间的影响,实际分辨率为1 688×1 066。场同步信号VS用来确定一帧图像的开始和结束时间,确保图像数据从左到右、从上到下扫描,以形成一幅幅图像。行同步信号HS标志着一行像素的开始和结束,使图像数据显示在屏幕从左到右的有效区域。
首先根据刷新频率确定主时钟频率,然后由主时钟频率和图像分辨率计算出行总周期数,再把同步、消隐各时序段的时间按照主计数脉冲源频率折算成时钟周期数。在FPGA中利用计数器,以计算出的各时序段时钟周期数为基准产生不同宽度和周期的脉冲信号,利用它们的逻辑组合产生视频DAC的控制信号和VGA接口的同步信号。
- RedHatLinux新手入门教程(5)(11-12)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- 声卡安装向导中文版(11-12)
- MPlayer安装和使用指南(11-12)
- Windows CE 进程、线程和内存管理(三)(11-09)