作者:MiS603开发团队
日期:20150911
公司:南京米联电子科技有限公司
论坛:www.osrc.cn
EAT博客:http://blog.chinaaet.com/whilebreak
博客园:http://www.cnblogs.com/milinker/
MiS603开发板 第十六章 图像之VGA接口测试
第十六章图像之VGA接口测试
在本章开始介绍视频图像处理开发平台的硬件结构,主要包括VGA显示模块(ADV7123)、HDMI显示模块(SIL9134)、DDR3存储模块、数字摄像头模块、模拟视频输入模块(TW2867)以及STM32配置模块,主要介绍各个模块的功能以及各个模块的基本原理,在此基础之上给出各个模块的测试代码。最后,给出一个基本的视频采集、缓存、显示的例程。
在这里给出MIS603视频图像处理平台,如下图所示。
MIS603视频图像处理部分框图
16.1VGA概述
VGA是Video Graphics Array的简称,也叫D-Sub接口。目前显示器都配备VGA接口,有的显示器还配备DVI(Digital Visual Interface)和HDMI(High Definition Multimedia Interface)接口。VGA 是IBM在1987年随PS/2机一起推出的一种视频传输标准,具有分辨率高、显示速率快、颜色丰富等优点,在彩色显示器领域得到了广泛的应用。根据不同分辨率,VGA 分为VGA(640x480)、SVGA(800x600)、XGA(1024x768)、SXGA(1280x1024)等。目前VGA已经成为一种标准,广泛应用于显示器、TFT液晶屏中。
VGA接口分为公头和母头,一般显示器都自带一根公头线,MIS603开发平台上是母头,VGA接口一共15根线,分为3排,标号如图6.1-1所示。
图6.1-1 VGA接口
VGA接口每个引脚的定义如表6.1-1所示。
表6.1-1 VGA引脚定义
标号 |
名称 |
描述 |
标号 |
名称 |
描述 |
1 |
RED |
红色分量视频 |
9 |
KEY |
保留,每个厂家都不同 |
2 |
GREEN |
绿色分量视频 |
10 |
SGND |
同步信号地 |
3 |
BLUE |
蓝色分量视频 |
11 |
ID0 |
显示器ID第0位 |
4 |
ID2 |
显示器ID第2位 |
12 |
ID1 |
显示器ID第1位 |
5 |
GND |
地 |
13 |
HSYNC |
行同步信号 |
6 |
RGND |
红色分量地 |
14 |
VSYNC |
场同步信号 |
7 |
GGND |
绿色分量地 |
15 |
ID3 |
显示器ID第3位 |
8 |
BGND |
蓝色分量地 |
在这里强调一下,VGA接口的RED、GREEN和BLUE传输的是模拟信号,峰峰值为0V~0.714V,0V代表无色,0.714V代表满色;HSYNC和VSYNC传输的是数字信号,为TTL电平。VGA模拟信号传输如图6.1-2所示,源端和终端匹配电阻均为75欧姆。
图6.1-2 VGA模拟信号传输示意图
16.2 VGA硬件电路解析
在本次设计中使用了专业的VGA驱动芯片ADV7123,兼容型号CS7123,它是一款最高时钟频率可达330MHz的3通道10位高速视频DAC芯片,输入兼容TTL逻辑电平,内部参考电压1.235V,输出电流范围2mA~26.5mA,单电源3.3V供电,最高支持[email protected]视频输入,SYNC控制同步信号,BLANK 控制消隐。
VGA模块电路如上图所示,该模块支持RGB888数字输入,支持1080P视频输入,RGB模拟信号输出,终端和源端匹配电阻75欧姆。ADV7123和FPGA连接方式和具体含义如下表所示。
ADV7123(CS7123)和FPGA连接方式
标号 |
对应的FPGA引脚 |
描述 |
Video_clk |
N8 |
驱动时钟,由FPGA输出 |
Video_blank |
R9 |
数据有效,由FPGA输出 |
Video_hs |
P9 |
VGA行同步信号,由FPGA输出 |
Video_vs |
N9 |
VGA场同步信号,由FPGA输出 |
Video_d[23:16] |
H13,J14,K15,L14,M15,N14,P15,R15 |
VGA数据红色分量,从到位到低位 |
Video_d[15:8] |
J13,L12,M13,R14,J11,K12,T14, R12 |
VGA数据绿色分量,从到位到低位 |
Video_d[7:0] |
M12,P12,N12,P11,N11,M10,L10,T9 |
VGA数据蓝色分量,从到位到低位 |
注:VGA和HDMI共用FPGA引脚
对于1080P视频时钟为148.5MHz,对硬件要求很高,PCB必须等长布线。
16.3 VGA时序分析
VGA时序如上图所示,编写程序的依据就在这张图中。首先看到有3个矩形,第1个矩形是VGA驱动的最大部分,里面包括所有的信息,在此基础之上有2个同步信号,即HSYNC和VSYNC(行同步和场同步),HSYNC可以确定一行的开始和结束,VSYNC可以确定一场的开始和结束,但是同步信号也有时间,因此就引出Hor Sync和Ver Sync(行同步时间和场同步时间)。接下来就是H Back Proch和V Back Porch(行消隐和场消隐),消隐存在主要是为了兼容电子管屏幕设计的。然后是第2个矩形,这是Hor”Active”Video和Ver“Active”Video(行视频有效和场视频有效),在这个区域中是显示视频的地方。最后就是H Front Porch和V Front Porch(行前肩和场前肩)。到此,一场完整视频就显示完毕了。在这里说以一下第3个矩形,有4个参数H Left Border、H Right Border、V Top Border和V Bottom Border,在不同分辨率中这4个参数不同,在800x600及其以上的分辨率中这4个参数为0。
说了半天,大家可能晕了?在此给出一个简化的时序图,如下图所示。一行数据包括:Hor Sync(行同步)、Hor Back Porch(行消隐)、Hor Active Video(行视频有效)和Hor Front Porch(行前肩);一场数据包括:Ver Sync(场同步)、Ver Back Porch(场消隐)、Ver Active Video(场视频有效)和Ver Front Porch(场前肩)。
VGA时序主要分为行时序和场时序,行时序是以像素为单位的,场时序是以行为单位的。VGA行时序对行同步时间、消隐时间、行视频有效时间和行前肩时间有特定要求,列时序也是如此,如果其中一部分时序出现问题就会造成显示出现问题。常用VGA分辨率时序参数如下表所示。
VGA常用分辨率时序参数
显示模式 |
时钟 /MHz |
行时序参数(单位:像素) |
列时序参数(单位:行) |
||||||||
a |
b |
c |
d |
e |
f |
g |
h |
i |
k |
||
[email protected] |
25.175 |
96 |
48 |
640 |
16 |
800 |
2 |
33 |
480 |
10 |
525 |
[email protected] |
40 |
128 |
88 |
800 |
40 |
1056 |
4 |
23 |
600 |
1 |
623 |
[email protected] |
65 |
136 |
160 |
1024 |
24 |
1344 |
6 |
29 |
768 |
3 |
806 |
[email protected] |
74.25 |
40 |
220 |
1280 |
110 |
1650 |
5 |
20 |
720 |
5 |
750 |
[email protected] |
108 |
112 |
248 |
1280 |
48 |
1688 |
3 |
38 |
1024 |
1 |
1066 |
[email protected] |
148.5 |
44 |
148 |
1920 |
88 |
2200 |
5 |
36 |
1080 |
4 |
1125 |
在这里说一下时钟频率计算,就是上文提到的第1个矩形和场频率有关,思考一下,很简单的。时钟频率=行最大值x列最大值x扫描频率。
16.4 VGA时序仿真
以800x600分辨率的进行VGA时序仿真,代码详见工程
水平计数器从0到1055,共1056个像素点。
垂直计数器从0到627,总共628行。
行同步信号,从1开始,128结束,共128个像素点。
场同步信号,4行。
有效像素从1开始,800结束,共800个像素。
有效行计数从1开始,600结束,共600行。
由此可见时序参数符合规范。
16.5 ChipScope数据分析
采样时钟vga_clk_o:
行同步信号,数据有效信号。
数据分析:1:绿色;2:蓝色;3:黑色;4:青色;5:红色;6:紫色;7:黄色;8:白色。
实际图片效果。
16.6程序分析
1:VGA时序参数定义文件,支持不同分辨率,只需要更改宏定义即可实现。
2:VGA测试顶层文件,例化DCM时钟模块和vga_driver模块。
3:由50MHz生成40MHz时钟模块。
4:vga_driver模块,生成相关VGA时序参数。
5:ChipScope模块,在线分析数据。
6:ucf文件,包括引脚分配和时钟约束。
整个VGA模块测试框图,vga_driver.v是整个设计的核心,考虑到程序的可移植性专门写了vga_paramter.v文件存放VGA时序参数,通过条件编译选择不同的分辨率,由于不同分辨率需要的时钟也不一样,,VGA_Test.v产生测试所需的数据,本实验产生彩条。
代码解析:
1)、水平计数器和行同步信号产生
//horizontal counter&&hs sysc generate. /*水平计数器和行同步信号产生*/ [email protected](posedge clk_i or negedge rst_n_i) begin if(!rst_n_i) begin x_cnt <= 12‘d0; end else if(x_cnt < H_TOTAL-12‘d1) begin x_cnt <= x_cnt + 12‘d1; end else begin x_cnt <= 12‘d0; end end assign w_hs = (x_cnt < H_SYNC)?1‘b1:1‘b0; |
2)、垂直计数器和场同步信号产生
//vertical counter&&vs sysc generate. /*垂直计数器和场同步信号产生*/ [email protected](posedge clk_i or negedge rst_n_i) begin if(!rst_n_i) begin y_cnt <= 12‘d0; end else begin if(x_cnt == H_TOTAL-12‘d1) begin if(y_cnt < V_TOTAL-12‘d1) begin y_cnt <= y_cnt + 12‘d1; end else begin y_cnt <= 12‘d0; end end end end assign w_vs = (y_cnt < V_SYNC)?1‘b1:1‘b0; |
3)、数据请求产生和有效区域坐标输出
//------------------有效区域产生视频请求信号---------------------// assign w_data_requst = ((x_cnt >= H_SYNC+H_BACK-X_AHEAD)&& (x_cnt < H_SYNC+H_BACK+H_ACTIVE-X_AHEAD))&& ((y_cnt >= V_SYNC+V_BACK)&& (y_cnt < V_SYNC+V_BACK+V_ACTIVE)); //----------------在有效区域输出行坐标和列坐标--------------------// assign w_x_pos = w_data_requst?(x_cnt-H_SYNC-H_BACK+12‘d1):12‘d0; assign w_y_pos = w_data_requst?(y_cnt-V_SYNC-V_BACK+12‘d1):12‘d0; |
4)、为了测试时序是否正常,设计了彩条显示实验
原理:在关键位置改变输出数据的值,之后保持不变,再到关键位置改变输出值,之后保持不变。
/[email protected](posedge used_clk) begin if(data_requst)//-数据请求-// begin case(x_pos) 12‘d1: //-输出绿色RGB值-// begin {red_data,green_data,blue_data} <= GREEN_RGB; end (H_DISP/8)*1://-输出蓝色RGB值-// begin {red_data,green_data,blue_data} <= BLUE_RGB; end (H_DISP/8)*2://-输出黑色RGB值-// begin {red_data,green_data,blue_data} <= BLACK_RGB; end (H_DISP/8)*3://-输出青色RGB值-// begin {red_data,green_data,blue_data} <= CYAN_RGB; end (H_DISP/8)*4://-输出红色RGB值-// begin {red_data,green_data,blue_data} <= RED_RGB; end (H_DISP/8)*5://-输出紫色RGB值-// begin {red_data,green_data,blue_data} <= PURPLE_RGB; end (H_DISP/8)*6://-输出黄色RGB值-// begin {red_data,green_data,blue_data} <= YELLOW_RGB; end (H_DISP/8)*7://-输出白色RGB值-// begin {red_data,green_data,blue_data} <= WHITE_RGB; end default://-数据保持不变-// begin {red_data,green_data,blue_data} <= {red_data,green_data,blue_data}; end endcase end else begin {red_data,green_data,blue_data} <= {8‘d0,8‘d0,8‘d0}; end end |
下载程序,屏幕上会出现8个彩条。通过调整宏定义和时钟实现不同分辨率的VGA驱动。
16.7程序源码
详细参考:6_02_VGA_TEST
16.8 小结
在本节学习了VGA驱动,主要是VGA时序和代码编写,代码编写的基础是时序,时序理解后代码编写很容易。此外还学习了几个Verilog关键字。