Chinaunix首页 | 论坛 | 博客
  • 博客访问: 404436
  • 博文数量: 105
  • 博客积分: 4100
  • 博客等级: 上校
  • 技术积分: 1040
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-27 19:57
文章存档

2012年(1)

2011年(9)

2010年(4)

2009年(25)

2008年(66)

我的朋友

分类:

2008-07-28 09:53:26

今天想用fpga来控制vga接口,无从下手,对这个接口的定义,是没有一点了解,上网上找了找,明白了些许,其中网上的材料对消隐这个概念没有写清楚,对于我们这些没学过电视原理之类课程的人来说,这些相对是很困难的,我的理解是行消隐就是当扫描到一行的最右边时电子束自动转到下一行的最左端的这个过程就是行消隐了,场消隐类似,这此不再说了,另外用fpga来控制vga显示的程序比较简单,我是选择用vhdl实现,不过我想是做一个vga的IP,然后将它放入NIOSII系统中去,这样就更能体现sopc.
 
下面这个文章是转载网上的,对原创作者表示敬意!!
使用 FPGA 控制 VGA 显示
 
显示器因为其输出信息量大,输出形式多样等特点已经成为现在大多数设计的常用输出设备。在  FPGA  的设计中可以使用很少的资源,就产生  VGA 各种控制信号。这个示例在 RHicSP2200B  FPGA  开发板/学习板上使用  VGA  接口在显示器上显示了文字以及简单的图形,可以作为VGA 显示设计的参考,如果在使用这个例子的过程中有任何问题都可以通过 邮件    或者  联系作者。

显示器术语

像素与分辨率
      
 显示器的显示方式有两种 : A/N(Alphabet/Number:字符/数字)显示方式 和 APA(All Point Addressable:全点寻址)
显示方式,即文本显示方式和图形显示方 式。A/N 方式已淘汰不用,目前微机都采用 APA 图形方式。
        显示器上输出的一切信息,包括数值、 文字、表格、图象、动画等等,都是由光点(即像素)构成的。组成屏幕显示画面的最小单位是像素,像素之间的最小距离为点距(Pitch)。点距越小像素密度越大,画面越 清晰。显示器的点距有 0.31mm、0.28mm、0.24mm、0.22mm 等多种。
        分辨率指整屏显示的像素的多少,是衡量显示器的一个常用指标。这同屏幕尺寸及点距密切相关,可用屏幕实际显示的尺寸与 点距相除来近似求得。点距为 0.28mm 的 15 英寸显示器,分辨率最高为 1024×768。

显示器尺寸
       显示器屏幕尺寸以对角线来度量,常用的显示器有  14、15、17、19、21  英寸等。 显示器水平方向长度与垂直方向高度之比 一般为 4:3。

扫描频率
        显示器采用光栅扫描方式,即轰击荧光屏的电子束在  CRT  屏幕上从左到右(受水 平同步信号  HSYNC  控制)、从上到下(受 垂直同步信号 VSYNC 控制)做有规律的移动。光栅扫描又分逐行扫描和隔行扫描。电子束采用光栅扫描方式,从屏幕左上角一点 开始,向右逐点进行扫描,形成一条水平线;到达最右端后,又回到下一条水平线的左 端,重复上面的过程;当电子束完成右下角一点的扫描后,形成一帧。此后,电子束又回到左上方起点,开始下一帧的扫描。这种 方法也就是常说的逐行扫描显示。
        而隔行扫描指电子束在扫描时每隔一 行扫一线,完成一屏后再返回来扫描剩下的 线,这与电视机的原理一样。隔行扫描的显示器比逐行扫描闪烁得更厉害,也会让使用者的眼睛更疲劳。目前微机所用显示器几乎都是逐行扫描。
       完成一行扫描所需时间称为水平扫描时间,其倒数称为行频率;完成一帧(整屏) 扫描所需的时间称为垂直扫描时间,其倒数为垂直扫描频率,又称刷新频率,即刷新一屏的频率。常见的有 60Hz、75Hz 等,标准 VGA 显示的场频60Hz,行频为31.5kHz。

显示带宽
       带宽则指显示器可以处理的频率范围。如果 60Hz 刷新频率的 VGA 方式,其带宽达  640×480×60=18.4MHz;70Hz  刷新频率1024×768 分辨率的 SVGA 方式,其带宽达1024×768×70=55.1MHz。
      早期的显示器频率固定。现在流行的多 屏显示器采用自动跟踪技术,使显示器的扫描频率自动与显示卡的输出同步,达到较宽 的适用范围。

显示卡术语
        一个像素点可有多种颜色,由表示该像素的二进位数(又称像素的位宽)决定。像 素位宽为  8bit,则每个像素有  28=256  种颜 色;位宽为16bit 则有 216=65536 种颜色, 位宽为  24bit  则有  224  即一千七百多万种颜色。显示卡内的D/A(数/模)转换电路将每 个像素的位宽(二进位整数)转换成对应亮度的  R、G、B(红、绿、蓝)模拟信号,控制屏幕上相应的三色荧光点发光,产生所要求的颜色。
       随着 PC 机的不断更新换代,显示控制卡(即显示适配器)的标准也不断发展。从最初的 MDA(单色显示适配器)→CGA(彩色图形显示适配器)→EGA(增强型图形适配器)→VGA(视频图形阵列适配器)。VGA 一改以前显示卡采用的数字视频信号输出,而用模拟视频信号输出,VGA  卡内的  D/A 转换器将数字信号转换为控制 R、G、B 三 原色的模拟信号,使像素色彩变化非常平滑,更适合人的视觉感受。
性能高于VGA 并与之兼容的显示适配 卡有 TVGA 和 SVGA。随着 Windows 的普及和对快速度、多色彩、高分辨率的需要, 一些厂家在 
SVGA  芯片中增加更多的硬件 来支持  Windows  的加速,这类显示适配器一般被称作 AVGA(Accelerated VGA:加速VGA)。目前大多数微机上的显示卡都属于 AVGA 类型。
      显示卡主要由图形处理芯片、视频存储器及 BIOS 芯片等组成。一般 AVGA 类型显示卡的控制器由单块 AVGA 芯片充当,其中包含的图形加速控制器对提升图形功能至关重要。
      显示卡的性能主要取决于卡上使用的图形芯片。早期的图形芯片没有帧缓冲器,有关帧的操作都要由  CPU去处理,降低了显示速度。现在多数显示卡上都设置具有图形处理功能的加速芯片,可处理像 Windows类型的图形任务而减少  CPU  参与。更高级的显示卡上有协处理器,可大大减免  CPU 的处理和参与。
      利用视频存储器 VRAM 储存显示数据,可减少甚至免去访问系统主存,加快显示速度。 640×480-16色VGA显示一屏需640×480×Log216/8=154KB   显示存储器,1024×768 真彩显示一屏则需1024×768×24÷8≈2.3MB。 显示卡插在系统板的扩展槽内,通过电缆连接到机箱背面的15 针D 型插座连接器上。某些高档的主板内置了显示卡的功能。 CRT  显示器背面有一个与显示器连接好的视频电缆,电缆的末端是  15针插入式连接器,使用时将它直接插入主机机箱背面的 15孔D 型插座上即可。

VGA 时序设计
       在 VGA 中,水平同步脉冲在光栅扫描 线需要回到水平开始位置也就是屏幕的左边的时候插入,垂直同步脉冲在光栅扫描线需要回到垂直开始位置也就是屏幕的上方的时候插入。复合同步脉冲是水平同步脉冲与垂直同步信号的组合。RGB 为像素数据,在没有图像投射到屏幕时插入消隐信号,当消隐有效时,RGB 信号无效。

水平时序
        在水平时序中,包括以下几个时序参数:水平同步脉冲宽度;水平同步脉冲结束到水平门的开始之间的宽度;一个视频行可视区域的宽度;一个完整的视频行的宽度,从水平同步脉冲的开始到下一个水平同步脉冲的开始。

垂直时序
        在垂直时序与水平时序类似,包括以下几个不同的时序参数:垂直同步脉冲宽度; 垂直同步结束到垂直门的开始之间的宽度; 一个视频帧可是区域的宽度;一个完整视频帧的宽度,从垂直同步脉冲到下一个垂直同步脉冲的开始。

组合视频帧时序
       
视频帧由 vlen 个视频行组成,每一行由 hlen 个像素,水平门与垂直门的“与”函数 即为可是区域,图像的其他区域为消隐区。 目前存在很多种不同VGA 模式,以下就常见的各种模式种参数进行说明,给出  VGA 模式中各种时序参数可以参考。

表 1  水平时序
 
说明:有效时间包括  6  列过扫描边界列,有些时序表将这几列加在后沿和前沿中

表 2  垂直时序
 
说明:有效时间包括  4  行过扫描边界行,有些时序表中将这几行加在后沿和前沿中。

*当有效时间增加时,它超过了 vsync 信号的上升沿,因此前沿为-1


        在实际设计中如何通过不同的系统频率确定适当的显示模式 ? 例如在 RhicSP2200  开发板中FPGA  的系统时钟频率为  50MHz。这个时钟频率可以用来设计 显示  800X600  模式,为了显示器显示效果好,采用场频(刷新频率)75Hz,那么帧长可以确定为  666,而行总长设计为  1000  像素。
       根据以上所述,我们可以设计如Examples1类似HDL代码,使用这段代码在Valid 有效期间对RGB 中 Blue 两位赋值1,得到一个蓝色屏幕显示边界如图1 所示。
 

色彩原理
        RGB  色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色 通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB  即是代表红、 绿、蓝三个通道的颜色,通过三种基本颜色亮度值从 0~255 不同产生出其他各种颜色,这种模式叫加色模式。为什么叫加色模式呢,举个例子,通常使用的电视屏幕和电脑 屏幕上的显示就是这样的模式,在没有图象时,屏幕是黑的,若R,G,B 三色亮度都为255  时混合叠加打在屏幕上时则显示成白色。就是加起来是白色的意思,叫加色模式。这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之 一。
        而与我们电脑相关的地方,就是目前的显示器大都是采用了 RGB 颜色标准,这就是为什么它对我们来说这么重要了。
       在显示器上,是通过电子枪打在屏幕的红、绿、蓝三色发光极上来产生色彩的,目前的电脑一般都能显示  32  位颜色,约有一百万种以上的颜色。如果说它所显示的颜色 还不能完全吻合自然界中的某种色彩的话,那已经几乎是我们肉眼所不能分辩出来的了。
       而  RhicSP2200  开发板系统中每一个色 彩都是使 用   2bit   来 表示的,因 此可见 RhicSP2200  系统可以出现64  种不同的颜 色。其他色彩的使用请在实际工作中更多的加以体会。

显示
        通过以上的讲述,已经可以在计算机显示器上显示一个有颜色的区域了,在这个小节中我们再举一个简单的例子,在显示器中显示两个镶嵌的正方形,字符等显示与其类似,可以参考瑞芯科技其他设计示例。 例如我们可以在 xpos 与 ypos 的某一区间给 RGB 信号赋不同的值将得到如图2 所示的显示效果。

 

例子  1:使用  50MHz  时钟频率产生的 VGA 同步脉冲以及视频有效信号

module sync_gen_50m( 
    rst_n,// synthesis attribute clock_buffer of rst_n is ibufg;
    clk,
    
    hsync,
    vsync,
    valid,
    x_cnt,
    y_cnt
    );
input           rst_n   ;
input           clk     ;
 
output          hsync   ;
output          vsync   ;
output          valid   ;
output  [9:0]   x_cnt   ;
output  [9:0]   y_cnt   ;
 
reg             hsync   ;
reg             vsync   ;
reg             valid   ;
reg     [9:0]   x_cnt   ;
reg     [9:0]   y_cnt   ;
 
always @ ( posedge clk or negedge rst_n )
    if ( !rst_n )
        x_cnt <= 10'd0;
        else if ( x_cnt == 10'd1000 )
        x_cnt <= 10'd0;
    else
        x_cnt <= x_cnt + 1'b1;
        
always @ ( posedge clk or negedge rst_n )
    if ( !rst_n )
        y_cnt <= 10'd0;
        else if ( y_cnt == 10'd665 )
        y_cnt <= 10'd0;    
        else if ( x_cnt == 10'd1000 )
        y_cnt <= y_cnt + 1'b1;    
        
always @ ( posedge clk or negedge rst_n )
    if ( !rst_n ) 
        begin
            hsync <= 1'b0;
            vsync <= 1'b0;
        end
    else
        begin
            hsync <= x_cnt <= 10'd50;
            vsync <= y_cnt <= 10'd6;
        end    
 
always @ ( posedge clk or negedge rst_n )                     
    if ( !rst_n )
        valid <= 1'b0;
    else
        valid <=    ( ( x_cnt > 10'd180 ) && ( x_cnt < 10'd980) &&
                      ( y_cnt > 10'd35)   && ( y_cnt < 10'd635) ); 
                    
endmodule

阅读(1763) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~