标签:
作者:MiS603开发团队
日期:20150911
公司:南京米联电子科技有限公司
论坛:www.osrc.cn
EAT博客:http://blog.chinaaet.com/whilebreak
博客园:http://www.cnblogs.com/milinker/
在本章开始介绍视频图像处理开发平台的硬件结构,主要包括VGA显示模块(ADV7123)、HDMI显示模块(SIL9134)、DDR3存储模块、数字摄像头模块、模拟视频输入模块(TW2867)以及STM32配置模块,主要介绍各个模块的功能以及各个模块的基本原理,在此基础之上给出各个模块的测试代码。最后,给出一个基本的视频采集、缓存、显示的例程。
在这里给出MIS603视频图像处理平台,如下图所示。
MIS603视频图像处理部分框图
16.1 VGA概述
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模拟信号传输示意图
在本次设计中使用了专业的VGA驱动芯片ADV7123,兼容型号CS7123,它是一款最高时钟频率可达330MHz的3通道10位高速视频DAC芯片,输入兼容TTL逻辑电平,内部参考电压1.235V,输出电流范围2mA~26.5mA,单电源3.3V供电,最高支持1600x1200@100Hz视频输入,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必须等长布线。
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 | ||
640x480@60Hz | 25.175 | 96 | 48 | 640 | 16 | 800 | 2 | 33 | 480 | 10 | 525 |
800x600@60Hz | 40 | 128 | 88 | 800 | 40 | 1056 | 4 | 23 | 600 | 1 | 623 |
1024x768@60Hz | 65 | 136 | 160 | 1024 | 24 | 1344 | 6 | 29 | 768 | 3 | 806 |
1280x720@60Hz | 74.25 | 40 | 220 | 1280 | 110 | 1650 | 5 | 20 | 720 | 5 | 750 |
1280x1024@60Hz | 108 | 112 | 248 | 1280 | 48 | 1688 | 3 | 38 | 1024 | 1 | 1066 |
1920x1080@60Hz | 148.5 | 44 | 148 | 1920 | 88 | 2200 | 5 | 36 | 1080 | 4 | 1125 |
在这里说一下时钟频率计算,就是上文提到的第1个矩形和场频率有关,思考一下,很简单的。时钟频率=行最大值x列最大值x扫描频率。
以800x600分辨率的进行VGA时序仿真,代码详见工程
水平计数器从0到1055,共1056个像素点。
垂直计数器从0到627,总共628行。
行同步信号,从1开始,128结束,共128个像素点。
场同步信号,4行。
有效像素从1开始,800结束,共800个像素。
有效行计数从1开始,600结束,共600行。
由此可见时序参数符合规范。
采样时钟vga_clk_o:
行同步信号,数据有效信号。
数据分析:1:绿色;2:蓝色;3:黑色;4:青色;5:红色;6:紫色;7:黄色;8:白色。
实际图片效果。
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. /*水平计数器和行同步信号产生*/ always@(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. /*垂直计数器和场同步信号产生*/ always@(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)、为了测试时序是否正常,设计了彩条显示实验
原理:在关键位置改变输出数据的值,之后保持不变,再到关键位置改变输出值,之后保持不变。
/lways@(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驱动。
详细参考:6_02_VGA_TEST
在本节学习了VGA驱动,主要是VGA时序和代码编写,代码编写的基础是时序,时序理解后代码编写很容易。此外还学习了几个Verilog关键字。
标签:
原文地址:http://www.cnblogs.com/milinker/p/4804908.html