VGA接口原理与Verilog实现编程案例解析

发布者:CrystalClear最新更新时间:2023-08-04 来源: elecfans关键字:VGA接口  Verilog  编程 手机看文章 扫描二维码
随时随地手机看文章

一、 软件平台与硬件平台

软件平台:

1、操作系统:Windows-8.1

2、开发套件:ISE14.7

3、仿真工具:ModelSim-10.4-SE

硬件平台:

1、 FPGA型号:Xilinx公司的XC6SLX45-2CSG324

2、 VGA接口

3、 液晶显示器


二、 原理介绍

VGA(Video Graphics Array)即视频图形阵列,是IBM在1987年推出的使用模拟信号的一种视频传输标准,在当时具有分辨率高、显示速率快、颜色丰富等优点,在彩色显示器领域得到了广泛的应用。这个标准对于现今的个人电脑市场已经十分过时。即使如此,VGA仍然是最多制造商所共同支持的一个标准,个人电脑在加载自己的特殊驱动程序之前,都必须支持VGA的标准。

VGA接口实物所示

 

左边带针的叫VGA公头,右边带槽的叫VGA母头。

VGA接口的特点:

1、 VGA接口不支持热插拔

VGA接口跟HDMI接口一样是不支持热插拔的。热插拔是指一般带电状态下对于接插件的插入或是拔除,并不只是针对有电源接口或者带供电的接口的接插件,而是所有。在运行状态时,插拔会产生耦合电流,电流不稳造成硬件烧坏,导致笔记本的接口端的保护受到冲击。就像U盘不能再一个时间段多次在一个端口插拔使用一样。各种电器的外露端子都会有金属的部分,它们都是要求接地的,但是不同的电器之间的地并不一定相同,比如一台DVD的地和一台电视机的接地都是相对于本身系统而言。

当端子插入时,首先要建立共同的地来对传输的信号作参考,这就要依靠端子和传输线上的金属部分了,金属部分接地同时也是对信号的屏蔽和保护。两个地相接触一瞬间,会有很高的尖峰脉冲产生,这种脉冲如果不加以滤除可能会直达芯片并将其损坏。另外还有一种是ESD,即静电损坏,这种更难以避免,因为在电子产品上,只能去防护,ESD的持续时间会更短US级别。所以正规的电子产品对于金属端子的接地有比较高的要求,同时在信号线上增加ESD防护器件来避免热插拔的损坏。但实际上很多厂家为了节省成本而偷工减料,或者是对热插拔的防护意识不够导致设计不合理,使得用户会出现热插拔损坏电器的现象产生。

2、  VGA不能传输音频

因为视频是VGA信号,而音频信号不是,所以VGA不能传输音频,只能传输视频。相信这就是为什么这几年极度的需求创新转换器的原因。VGA不支持音频传输也是给很多消费者带来烦恼,这最好的办法其实就是购买一款转换器,VGA转HDMI或者HDMI转VGA,达到视频传输的同时还支持音频信号的输出,一举两得。但是不要只想着转换器的输入与输出成问题,同时想想音频输出口,3.5mm是音频输出信号的重要连接线。购买时可以考虑想转换器有没有带3.5mm的音频输出口,然后另外购买一条音频线。

3、 VGA接口是一种D型接口,上面共有15针孔,分成三排,每排五个。其中比较重要的是3根RGB彩色分量信号和2根扫描同步信号HSYNC和VSYNC针。其引脚编号图如下图所示:

8c9d1904-17ac-11ee-962d-dac502259ad0.png

8cb34b34-17ac-11ee-962d-dac502259ad0.jpg

其中每个管脚的详细定义如下表所示

管脚名称定义
1RED红基色(75Ω,0.7Vp-p)
2GREEN绿基色(75Ω,0.7Vp-p)
3BLUE蓝基色(75Ω,0.7Vp-p)
4ID2地址码(显示器标识位2)
5GND
6RGND红色地
7GGND绿色地
8BGND蓝色地
9KEY保留
10SGND同步信号地
11ID0地址码(显示器标识位0)
12ID1地址码(显示器标识位1)
13HSYNC行同步信号
14VSYNC场同步信号
15ID3地址码(显示器标识位3)

 

VGA接口时序详解

VGA 显示器扫描方式从屏幕左上角一点开始,从左向右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT 对电子束进行消隐,每行结束时,用行同步信号进行同步;当扫描完所有的行,形成一帧,用场同步信号进行场同步,并使扫描回到屏幕左上方,同时进行场消隐,开始下一帧。完成一行扫描的时间称为水平扫描时间,其倒数称为行频率;完成一帧(整屏)扫描的时间称为垂直扫描时间,其倒数称为场频率,即屏幕的刷新频率,常见的有 60Hz,75Hz 等等,但标准的 VGA 显示的场频 60Hz。其扫描示意图如下图所示

8cc33044-17ac-11ee-962d-dac502259ad0.jpg

在对VGA扫描方式有一个直观的感受以后接下来在看一看VGA接口的详细时序与各个参数的定义。VGA的详细时序如下图所示:

8cd462f6-17ac-11ee-962d-dac502259ad0.png

总的来说,VGA的时序主要包括行时序与场时序两个部分。

其中行时序主要包括:行同步(Hor Sync) 、行消隐(Hor Back Porch) 、行视频有效(Hor Active Video)和行前肩(Hor Front Porch)这四个参数,行时序的时序图如下图所示

8ce7e16e-17ac-11ee-962d-dac502259ad0.png

而场时序主要包括:场同步(Ver Sync) 、场消隐(Ver Back Porch) 、场视频有效(Ver Active Video)和场前肩(Ver Front Porch)这四个参数,场时序的时序图如下图所示

8cf794e2-17ac-11ee-962d-dac502259ad0.png

需要注意的有三点:

1、行时序是以”像素”为单位的, 场时序是以”行”为单位的。

2、VGA 工业标准显示模式要求:行同步,场同步都为负极性,即同步脉冲要求是负脉冲。

3、VGA 行时序对行同步时间、 消隐时间、 行视频有效时间和行前肩时间有特定的规范, 场时序也是如此。常用VGA 分辨率时序参数如下表所示

8d033c52-17ac-11ee-962d-dac502259ad0.jpg

其中:

Pixel Clock = (Screen Refresh Frequency)*(Hor Active Video + Hor Front Porch + Hor Synv Pulse + Hor Back Porch)* (Ver Active Video + Ver Front Porch + Ver Synv Pulse + Ver Back Porch)

以640x480,60Hz这种分辨率格式来说,25.175MHz = 25175000Hz = 60*(640 + 16 + 96 + 48)*(480 + 11 + 2 + 31) = 60 * 800 * 525


三、 目标任务

1、编写VGA驱动代码,并用ModelSim对时序进行仿真,然后下载到开发板中使屏幕产生彩色条纹

2、在上个任务的基础上,把一张存在ROM里面的图片数据显示到显示器上


四、 设计思路与Verilog代码编写

4.1、 VGA驱动模块的接口定义与整体设计

Verilog编写的VGA模块除了Red,Green,Blue三基色、行同步HS以及场同步VS以外还要包括时钟、复位信号。其框图如下所示

8d170002-17ac-11ee-962d-dac502259ad0.png

其中:

I_clk是系统时钟;

I_rst_n是系统复位;

O_hs是行同步信号;

O_vs是场同步信号;

O_red是红色分量;

O_green是绿色分量;

O_blue是蓝色分量;

上面的模块框图中没有看到测试数据(彩条或者图片)的输入端口,原因是由于VGA的逻辑比较简单,所以我准备把发送测试图案(彩条或者图片)的逻辑也直接集成到vga_driver模块中,这样可能更加方便理解。但是对于实际一个比较复杂的项目来说,最好还是把各个模块独立开来,这样更加方便二次移植。在写代码之前,先了解一个关于图片的分辨率与位深度的知识点。

4.2、 图片的分辨率、图片的尺寸与位深度

图片的分辨率指图像中存储的信息量,是每英寸图像内有多少个像素点,它决定了位图图像细节的精细程度。描述分辨率的单位有:dpi(dots per inch)点每英寸、lpi(line per inch)线每英寸和ppi(pixel per inch)像素每英寸。

图片的尺寸是指一幅图片长度和宽度各占多少像素,我们平常说的一张640×480的图片指的就是这张图片的长度有640个像素点,宽度有480个像素点

位深度是指图片的每个像素是用多少位(bit)来表示的。比如黑白二色的图像是数字图像中最简单的一种,它只有黑、白两种颜色,也就是说它的每个像素只有1位颜色,位深度是1,用2的零次幂来表示;考虑到位深度平均分给R, G, B和Alpha,而只有RGB可以相互组合成颜色。所以4位颜色的图,它的位深度是4,只有2的4次幂种颜色,即16种颜色或16种灰度等级 )。8位颜色的图,位深度就是8,用2的8次幂表示,它含有256种颜色 ( 或256种灰度等级 )。24位颜色可称之为真彩色,位深度是24,它能组合成2的24次幂种颜色,即:16777216种颜色 ( 或称千万种颜色 ),超过了人眼能够分辨的颜色数量。当我们用24位来记录颜色时,实际上是以2^(8×3),即红、绿、蓝 ( RGB ) 三基色各以2的8次幂,256种颜色而存在的,三色组合就形成一千六百万种颜色。除了上面这几种情况以外,有的图片的位深度是16位,其中红基色占5位,绿基色占6位,蓝基色占5位,他们一共可以组成2^16中颜色。

在电脑上用选中图片以后,然后鼠标右键在菜单中点击属性,然后在详细信息选项卡中就能查看图片的各个详细信息了,上面这张图片的信息如下图所示

8d364930-17ac-11ee-962d-dac502259ad0.png

由上面的信息可知这张图片的大小为128*128。水平分辨率与垂直分辨率为96dpi(dots per inch),位深度为24-bit。

4.3、 原理图分析

在写代码之前,先来分析一下我的开发板的VGA接口原理图。由于FPGA输出的RGB数据为数字信号,而VGA接口的RGB数据为模拟信号,所以需要一个数模转换器把FPGA输出的数字信号转化为VGA接口的模拟RGB数据输出。一般情况下,为了保证输出数据的保真度,都会使用一个专用的数模转换芯片(比如ADV7123)来实现这个数模转换的功能,但是在我的开发板上为了简单起见,设计了一个电阻匹配网络来实现这个数模转换的功能,FPGA输出的RGB三基色数字信号一共占16-bit,其中Red分量占5-bit,Green分量占6-bit,Blue分量占5-bit。下面是VGA接口部分的原理图

8d42cdf4-17ac-11ee-962d-dac502259ad0.png

4.4、 vga_driver模块显示彩条Verilog代码编写

有了上面的基础之后就可以开始着手编写代码,现在在回过头去看行时序与场时序,其实可以发现VGA的时序真的是非常简单。

对行时序来说,只需要定义一个计数器,当计数器在像素时钟的作用下计满一行的总点数后清零,然后利用assign语句在计数值为Hor Sync期间把行时序信号拉低产生一个低脉冲就可以了。场时序与行时序非常类似,当行计数器计满一行了场计数器才加1,当计满一场的时间后,计数值清零,然后利用assign语句在Ver Sync期间把场时序信号拉低产生一个低脉冲就OK了。

有了行时序与场时序以后,接下来就是在Hor Active Video和Ver Active Video均有效的期间往Red,Green,Blue三个分量送数据,数据就会在在屏幕上显示出来了。而Hor Active Video有效的期间正是行计数器的计数值在大于(Hor Sync + Hor Back Porch),小于(Hor Sync + Hor Back Porch + Hor Active Video)的时候,而Ver Active Video有效的期间正是场计数器的计数值在大于(Ver Sync + Ver Back Porch),小于(Ver Sync + Ver Back Porch + Ver Active Video)的时候,所以在代码里面可以利用assign语句产生一个激活标志,当激活标志为高的时候给Red,Green,Blue三个分量送数据,数据就会在屏幕显示出来了。


下面以分辨率为640x480为例来编写vga_driver的代码,由前面的分辨率时序参数表可知,640x480分辨率的像素时钟为25.175Hz,但实际并不需要这么精确的时钟频率,我们取25MHz就可以了,我的开发板的时钟频率为50MHz,所以只需要简单的写一个二分频逻辑就可以得到这个像素时钟了。如果你想显示其他分辨率的图片,比如800x600分辨率的时钟频率是40MHz,这时候就需要用FPGA内部的Clocking Wizard IP核来得到这个40MHz的时钟,Clocking Wizard IP核内部回调用FPGA的PLL资源对输入频率进行处理来得到想要的输出频率。


下面是VGA接口产生彩条的完整代码


module vga_driver

(

    input                   I_clk   , // 系统50MHz时钟

    input                   I_rst_n , // 系统复位

    output   reg   [4:0]    O_red   , // VGA红色分量

    output   reg   [5:0]    O_green , // VGA绿色分量

    output   reg   [4:0]    O_blue  , // VGA蓝色分量

    output                  O_hs    , // VGA行同步信号

    output                  O_vs      // VGA场同步信号

);


// 分辨率为640*480时行时序各个参数定义

parameter       C_H_SYNC_PULSE      =   96  ,

                C_H_BACK_PORCH      =   48  ,

                C_H_ACTIVE_TIME     =   640 ,

                C_H_FRONT_PORCH     =   16  ,

                C_H_LINE_PERIOD     =   800 ;


// 分辨率为640*480时场时序各个参数定义

parameter       C_V_SYNC_PULSE      =   2   ,

                C_V_BACK_PORCH      =   33  ,

                C_V_ACTIVE_TIME     =   480 ,

                C_V_FRONT_PORCH     =   10  ,

                C_V_FRAME_PERIOD    =   525 ;

                

parameter       C_COLOR_BAR_WIDTH   =   C_H_ACTIVE_TIME / 8  ;


reg [11:0]      R_h_cnt         ; // 行时序计数器

reg [11:0]      R_v_cnt         ; // 列时序计数器

reg             R_clk_25M       ;


wire            W_active_flag   ; // 激活标志,当这个信号为1时RGB的数据可以显示在屏幕上


//////////////////////////////////////////////////////////////////

//功能:产生25MHz的像素时钟

//////////////////////////////////////////////////////////////////

always @(posedge I_clk or negedge I_rst_n)

begin

    if(!I_rst_n)

        R_clk_25M   <=  1'b0        ;

    else

        R_clk_25M   <=  ~R_clk_25M  ;

end

//////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////

// 功能:产生行时序

//////////////////////////////////////////////////////////////////

always @(posedge R_clk_25M or negedge I_rst_n)

begin

    if(!I_rst_n)

        R_h_cnt <=  12'd0   ;

    else if(R_h_cnt == C_H_LINE_PERIOD - 1'b1)

        R_h_cnt <=  12'd0   ;

    else

        R_h_cnt <=  R_h_cnt + 1'b1  ;

end                


assign O_hs =   (R_h_cnt < C_H_SYNC_PULSE) ? 1'b0 : 1'b1    ;

//////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////

// 功能:产生场时序

//////////////////////////////////////////////////////////////////

always @(posedge R_clk_25M or negedge I_rst_n)

begin

    if(!I_rst_n)

        R_v_cnt <=  12'd0   ;

    else if(R_v_cnt == C_V_FRAME_PERIOD - 1'b1)

        R_v_cnt <=  12'd0   ;

    else if(R_h_cnt == C_H_LINE_PERIOD - 1'b1)

        R_v_cnt <=  R_v_cnt + 1'b1  ;

    else

        R_v_cnt <=  R_v_cnt ;

end                


assign O_vs =   (R_v_cnt < C_V_SYNC_PULSE) ? 1'b0 : 1'b1    ;

//////////////////////////////////////////////////////////////////  


assign W_active_flag =  (R_h_cnt >= (C_H_SYNC_PULSE + C_H_BACK_PORCH                  ))  &&

                        (R_h_cnt <= (C_H_SYNC_PULSE + C_H_BACK_PORCH + C_H_ACTIVE_TIME))  && 

                        (R_v_cnt >= (C_V_SYNC_PULSE + C_V_BACK_PORCH                  ))  &&

[1] [2] [3] [4] [5]
关键字:VGA接口  Verilog  编程 引用地址:VGA接口原理与Verilog实现编程案例解析

上一篇:BLE广播包基础知识讲解
下一篇:如何把视频转换成音频 视频转换成音频的原理是什么

推荐阅读最新更新时间:2024-11-14 23:44

基础的PLC编程设计实例
PLC在学习的过程中,除了需要掌握必备的基础理论知识以外,更需要亲身设计电路来实践,刚开始学习PLC编程的时候,可以先从小的电路小的程序入手,由浅入深,先易后难的进行学习,今天我们就重点来看看具体的基础的PLC编程实例:
[嵌入式]
基础的PLC<font color='red'>编程</font>设计实例
变频器作为PROFIBUS_DP智能从站如何进行组态和编程
PLC与变频器的通信是PLC编程中最常用的功能,常规采用的profibus_DP通讯方式来实现,当然会根据现场实际来采用USS通信、以太网通信等。本节重点介绍PLC如何与西门子变频器进行通信组态及编程。 一、与西门子变频的通信组态 1、组态主站及profibus网络 打开项目,插入一个300的站,并插入一个315-2DP的CPU,然后新建一个DP网,本站地址为2,如下图所示: 2、生成变频器从站(这里以MASTERDRIVE为例) 在右侧的profibus_DP项目下找到SIMOVERT文件夹打开 CBP(communication board profibus)接口板是MASTERDRIVE的DP通信扩展板,在SIM
[嵌入式]
变频器作为PROFIBUS_DP智能从站如何进行组态和<font color='red'>编程</font>
MCS-51单片机外中断软件编程简介
简介:MCS-51单片机有多个中断源,以8051为例,有5个中断源,两个外中断、两个定时中断和一个串行中断,这一节我们讨论外中断软件编程。 外中断是由外部原因引起的中断,有两个中断源。即外中断0(INT0)和外中断1(INT1),中断请求信号由引脚P3.2(INT0)和P3.3(INT1)输入。 外中断请求信号有两种方式,一是电平方式,二是脉冲方式。可通过有关控制位的定义进行规定。 电平方式为低电平有效,只需在单片机的(INT0)和(INT1)中断请求输入端采样到有效的低电平时,就会激活外部中断。 脉冲方式则在脉冲的后负跳沿有效,即在相邻两个机器周期对中断请求引入端进行采样中,如前一次为高,后一次为低即为有效中断请求。
[单片机]
MCS-51单片机外中断软件<font color='red'>编程</font>简介
40亿美元市场保持8年没变,可编程逻辑FPGA到底怎么了
   FPGA 市场在2008年是40亿美元规模,到了2016年还是40亿美元。似乎显而易见,当 ASIC 越来越贵,可编程应该要增长才对。然而事实并非如此。下面就随嵌入式小编一起来了解一下相关内容吧。   在1996年 FPGA 市场容量为19亿美元,当年赛灵思预测到2001年市场能达到58亿美元。到了2001年,市场增长到20亿美元。   回到2008年,赛灵思的帅印由WimRoelandts交接给MosheGavrielov,该公司开始寻求在工业市场的新出路,这块市场一直被寄予厚望却从未实现预期的增长。   “过去四年里ASSP/ ASIC 的设计型初创公司减少了40%,”在2008年4月Gavrielov如是说,“为什么
[嵌入式]
改搭可编程FPGA SoC ADAS系统性故障锐减
基于雷达(RADAR)和摄影机设计的应用正大举进驻汽车驾驶安全领域。最初,自适应巡航控制和道路偏离警报等先进驾驶辅助系统(ADAS)只是一些非常便利的功能,而现在,它们在车辆控制上扮演更积极主动的角色,支持实现车道维持辅助(LKA)等功能。以前的高性能中央处理器(CPU)被认为是最适合这些应用的组件,但车厂须要综合考虑运算性能和低功率消耗,这促使工程师转向采用现场可编程门阵列(FPGA)组件。 ADAS须要满足特殊的功能安全要求。在2011年,ISO发布针对载重3.5吨以下客车的ISO26262标准,以降低系统出现故障后造成危险的风险。这个标准要求采用严密的设计过程,在应用执行过程中探测随机硬件故障,以减少系统性故障。 提升
[嵌入式]
51单片机——红外遥控 C语言入门编程
红外发射装置: 也就是通常我们说的红外遥控器是由键盘电路、红外编码电路、电源电路和红外发射电路组成。红外发射电路的主要元件为红外发光二极管。 它实际上是一只特殊的发光二极管;由于其内部材料不同于普通发光二极管,因 而在其两端施加一定电压时,它便发出的是红外线而不是可见光。目前大量的使用的红外发光二极管发出的红外线波长为940nm左右,外形与普通发光二极管相同。红外发光二极管有透明的,还有不透明的,在我们的红外遥控器上可以看到这个红外发光二极管。 通常红外遥控为了提高抗干扰性能和降低电源消耗,红外遥控器常用载波的方式传送二进制编码,常用的载波频率为38kHz,这是由发射端所使用的455kHz晶振来决定的。在发射端要对晶振进行整数
[单片机]
51单片机——红外遥控 C语言入门<font color='red'>编程</font>
Intel机器编程代码相似度系统,让每个人都有能力创建软件
近日,英特尔发布与麻省理工学院、佐治亚理工学院共同研发的全新机器编程系统。该系统称为机器推理代码相似度系统(MISIM),是一款检测软件意图的自动化引擎,通过识别代码结构、分析与其它功能相似代码的句法差异实现。 英特尔机器编程研究院创始人、首席科学家及总监Justin Gottschlich 表示:“英特尔机器编程的最终目标是让每个人都能创建软件。当这一目标完全实现时,每个人都可以通过自己最擅长的方式,如代码、自然语言或其他方式向机器表达自己的设计意图,从而创建软件。这是一个大胆的目标,需要付出许多努力,MISIM是我们迈出的坚实一步。” 随着异构计算崛起,硬件、软件系统变得越来越复杂,以及跨架构专业编程人员的稀缺
[嵌入式]
用作测试负载的数字可编程电阻器
  图1所示的数字可编程精密电阻可在定制设计的 ATE(自动测试设备)中用作微处理器驱动的电源负载。IC1 是一个 8 位 电流输出型 DAC,即DAC08型DAC ,它驱动电流-电压变换器 IC2A,IC2A又驱动功率 MOSFET Q1 的栅极。被测器件连接到 J1 和 J2。在工作时,来自被测器件的电流在采样电阻 R8A 和 R8B 上形成一个电压。放大器 IC2B 驱动 IC1 的基准输入端,并使反馈路径闭合。当 R8A 和 R8B 上的压降达到 Q2 的 VBE(ON) 时,晶体管 Q2 分流 Q1 的栅极驱动电流,提供过流保护功能。VO 和 IO 分别为输出电压和输出电流,N 代表加到 IC1 的二进制输入的等效十进制值
[测试测量]
用作测试负载的数字可<font color='red'>编程</font>电阻器
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved