|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Zedd 于 2019-3-30 15:31 编辑 , }: ]) [+ h( j
* D, b& u k* n% r
# Z& J" p+ P/ u- B! n# ] P( R X, J @1 d6 ]5 ]0 k2 e% F
VGA标准介绍 计算机显示器有许多现实标准,常见的有VGA、SVGA等,在这里我们用VGA接口来控制显示器,VGA是Video Graphics Adapter(Array)的缩写,即视频图形阵列。作为一种标准的显示接口得到广泛的应用。VGA接口常使用15针的DB15接口,该接口引脚功能如下表所示:
6 k, }+ A. F# v# _& I8 B% |
4 f- u2 T# j7 s Z
" }3 s$ |+ K0 G2 U ?: @9 o8 u
( W% `3 }7 s) v# ?& D9 F! o . r `! ^6 G4 x% t
2 c1 ^; v- x1 D7 a" b; n' e
VGA 扫描方式 在VGA标准兴起的时候。常见的彩色显示器一般由CRT(阴极射线管)构成,色彩是由RGB(红、绿、蓝)三基色组成。显示是用逐行扫描的方式解决。阴极射线枪发出电子束打在涂有荧光粉的荧光屏上,产生RGB三基色,合成一个彩色像素,扫描从屏幕的左上方开始,从左到右,从上到下进行扫描,每扫完一行,电子束都回到屏幕的左边下一行的起始位置。在这期间,CRT对电子束进行消隐。每行结束时,用行同步信号进行行同步;扫描完所有行,用场同步信号进行场同步,并使扫描回到屏幕的左上方。同时进行场消隐,预备下一场的扫描。 随着显示技术的发展,出现了液晶显示器,液晶显示器的成像原理与CRT不同,液晶显示器是通过对液晶像素点单元施加电压与否,来实现液晶单元的透明程度,并添加三色滤光片、分别使R、G、B这3中光线透过滤光片,最后通过3个像素点合成一个彩色像素点,从而实现彩色显示。但是由于液晶显示技术后于CRT显示技术诞生,因此在液晶显示器诞生的时候,为了能够兼容传统的显示接口,因此液晶显示器通过内部电路实现了对VGA接口的完全兼容。因此,我们在使用显示器时,只要该显示器带有标准的VGA接口,我们就不用去关系其成像原理,直接使用标准的VGA时序即可驱动。 对于普通的显示器(无论是液晶还是CRT),共有5个信号:R、G、B三基色信号,行同步信号HS,场同步信号VS。对于时序驱动,VGA显示器要严格遵循“VGA工业标准”,即640*480*60Hz模式,否则可能会损害VGA显示器。 VGA标准时序分析通常我们所用的显示器都满足工业标准,因此我们设计VGA控制器时要参考显示器的技术规格,下图是VGA行扫描、场4扫描的时序图。 - L2 t' I y, Z& M
6 ?5 O" W7 T; x. X2 m行扫描时序要求(单位:输出一个像素的时间间隔,即像素时钟): - Ta(行同步头):96
- Tb:40
- Tc:8
- Td(行图像):640
- Te:8
- Tf:8
- Tg:800
' X: ^- Z- [9 U/ ^: l, {. N6 X
4 U3 h3 K: s' P1 ^5 E* v0 I: T
% T% k) V; g9 ^0 i) E! `/ F- O场扫描时序要求(单位:输出一行Line的时间间隔): - Ta(场同步头):2
- Tb:25
- Tc:8
- Td(场图像):480
- Te:8
- Tf:2
- Tg:525& |) w: L0 a! Q1 R- H$ s
& u" K" @; u. E1 x3 w" b/ L( [4 p " j, ?, z. c) E( }" D
VGA工业标准所要求的频率如下: 时钟频率 25.175MHz(像素输出的频率) 行频率 31469 Hz 场频率 59.94Hz(每秒图像刷频率) VGA 工业标准显示模式要求:行同步、列同步都为负极性,即同步脉冲要求是负脉冲。
5 z6 M0 Q6 z/ g3 i% t4 K7 A下图为VGA图像显示扫描示意图,在设计时,可用两个计数器进行计数(行、场扫描计数器),行计数器的驱动时钟为25MHz,场计数器的驱动时钟为行计数器的溢出信号。计数的同时控制行、场同步信号输出。并在适当的时候送出数据,就能显示相应的图像。注意消隐器件送出的数据应该为0x00。显示器的刷新频率为25MHz/800/525 = 59.52Hz,接近VGA工业标准场帧频59.94Hz 4 G7 {: q/ G! K$ P# r0 J
芯航线FPGA学习套件VGA电路介绍 芯航线FPGA学习套件提供两种VGA接口输出,分别为8bit输出和高质量24位输出。24位高质量的VGA视频输出模块使用专用视频DAC芯片GM7123(兼容ADV7123),实现高达1600*1200分辨率、60Hz刷新频率,24位动态色彩输出。该模块性能优异,价格较高,主要用于视频图像处理系统中。本例因为设计的逻辑分析仪不需要如此高的动态色彩范围,因此使用8bit输出型VGA模块。8位VGA输出电路设计在“VGA_数码管_PS2”三合一模块上,下图为VGA_数码管_PS2模块图和VGA接口电路图:
. L8 [/ x& m6 J: z3 O1 D e
5 A4 Y6 c) u* I
: k0 l S7 g" E( _( y4 P: i$ Y' e" }% B* K0 m! U) G7 b" ~
该VGA接口三基色信号R、G、B共专用8位(分别是R为3位、G为3位、B为2位),因此可以显示256种颜色。RGB数据的格式如下表所示: & M( k: P6 r* R2 ~1 F* {
9 o5 N6 k' x2 T: ]
以下为常见的几种颜色对应的数据编码: 9 [* X2 H0 i( t, w7 q1 r
" b3 @$ u0 e' `# `
小结 通过以上介绍,我们了解了实现VGA驱动的行列扫描方法,即使用两个计数器分别进行行、场计数,根据计数值确定像素数据内容和行、场同步信号的电平状态。同时,也知道了要显示不同的颜色,只需要给D0~D7不同的数据,即可显示不同的颜色。 * a) s) T! Y% O$ f& L' w$ d
VGA 控制器设计第一步,设计行扫描计数器行扫描计数器即每个像素时钟自加1,一旦加满到799(刚好800个时钟周期),计数器清零并重新技术,该部分代码可如下设计:
+ u3 E6 C) Q3 C1 f: E% k% s& Y
3 `/ w- f4 B: F% G) B5 c0 e1 @1 g1 V# @: k
第二步,设计场扫描计数器由于场扫描计数器是在每次一行扫描完成后加1的,即场扫描计数器的自加条件是行扫描计数器溢出。所以,场扫描计数器的自加条件为行扫描完成,即 “hcount_r==10'd799”,场扫描计数器代码如下所示: 0 s u) P: I. c( p2 I
$ Z) C& Z0 p, V4 c" f3 a. P第三步,产生行同步信号和场同步信号 根据VGA工业标准时序,我们知道每一个完整的VGA帧都包含了数据段和消隐段,在消隐段期间,行同步信号和列同步信号有一段行同步头和场同步头,在同步期间,对应行同步信号或者场同步信号为低电平,因此我们可以根据行、场计数器的值来确定行、场同步信号的电平状态。对于行同步信号,其行同步头为一行扫描的前96个像素时钟周期,因此行同步信号可用如下的简单方式控制: 7 _4 |: y/ j3 {4 `# Z
0 [/ V# k- o! k: c. K对于场同步信号,其场同步头为一行扫描的前2个像素时钟周期,因此行同步信号可用如下的简单方式控制:
, i* ~; J5 T: g* u$ h7 f% Y
3 P$ U9 o% ^. v- E3 g, p6 Q0 d第四步,输出数据 VGA控制器的设计目的是为了驱动VGA显示器显示需求的图像内容,因此需要设计数据输出部分,这里,数据来源可以为其它部分产生的图像信号,如摄像头数据、BMP图片数据。我们在驱动VGA时,只需要保证在扫描正确的像素点时,其它部分产生的图像信号能够与该像素点位置对应上,则不需要对图像数据再进行二次处理,但是,在行、场消隐期间,需要保证输出到VGA的RGB数据线上的数据全部为0,因此可以设置一个二选一多路器,只有在非消隐期间,VGA控制器才直接输出其他部分输入的图像数据,而消隐器件则强制输出全0。 我们可以首先产生一个图像数据有效标志信号,然后使用该标志信号控制VGA输出数据的内容,即切换二选一多路器的通道,从而实现消隐器件数据全0的功能。 图像数据有效标志信号产生代码如下所示: 9 P7 _& ?; a& J. ~
% }4 `% y1 Q8 S& h/ cdat_act即为图像数据有效标志信号。 消隐强制输出0二选一多路器代码如下所示:
/ I; z! f8 i# A+ {0 U9 {" G4 f) A/ d$ D# l3 g1 G& m) Q
+ g# _6 M- @! |. Y" p) d其中,VGA_RGB是输出到VGA接口上的数据,而data_in则是其他模块传递过来的正确的图像数据。 8 b. W6 r. f2 ]
第五步,输出正确的行列扫描位置为了使其他模块能够根据当前扫描位置正确的输出图像数据,因此需要将VGA控制器的实时扫描位置输出,以供其他模块使用。 2 j) X' |- s: t) f
/ o! a. d$ a$ @" t- N) ]/ O6 D, x
3 O- D* B1 i+ W o! J完整VGA控制器设计 以上为我们根据直观思维设计的驱动电路,在代码中,直接使用了数字作为运算和比较的内容,这样不利于修改。因此,为了实现易于修改的控制器设计,方便后期简单修改后兼容其他分辨率,对代码进行优化,使用参数化设计。将代码中使用到的一些与时序相关的数字直接使用parameter这样的参数进行定义,这样在以后需要修改时间参数时,只需要修改parameter定义的内容即可,不需要再深入到代码中一个一个修改。这里不再一一介绍如何修改,只贴出最终设计修改完成的代码,请用户自行比对领悟。
5 ^" L6 w& r' s. K9 X* L
% ]9 s2 n& E2 y+ G
% K! }: ^ s% s, v
9 o) O7 w- s8 @9 Z: ?1 |; |3 U) t3 p
- k; v/ g) n% B
设计完成后,在Quartus II15.1中综合出来的电路符号如下所示:
) \/ F8 s1 U: I1 P0 X S. D# B$ t
每个端口的功能如下表所示:
1 h- \3 z. `0 ?5 W& ^2 V* l$ a7 O. J5 j5 B) c# S( e _9 ~
VGA控制器仿真验证本小节对设计的VGA控制器进行仿真验证,通过仿真查看行场同步信号是否满足设计需求。 Testbench设计Testbench的设计思路非常简单,只需要产生一个25MHz的时钟信号,然后在data_in端口上给一个固定的数据编码,为了与消隐时候的强制输出全0相区分,因此只需要是data_in上的数据不为0即可。testbench内容如下所示: # T+ a, o; _0 A2 Y6 I5 b9 d6 _
- y7 _$ Q) C% w0 O/ [) N
/ U) v: K+ E( f3 @/ o; A
" }: v8 n4 t' Q; H( a7 n1 g8 P
- ?& U8 Z5 L0 y- Q# ?3 I* ~仿真结果分析VGA_HS信号:1 g2 M' t; e" [* ^# `9 x
! M' |6 S8 u B& E6 u
- p) V0 s4 ]& K, c& K, C
) c* N' ]( [3 B! Y 由图可见,VGA_HS在0~95这一行扫描段内为低电平,即行同步头,其他时间为高电平,行扫描一次,行扫描计数器计数最大值为799,即刚好800个像素时钟周期,与设计一致,因此可知行扫描信号满足时序设计要求。 & n2 |4 Z/ Q. ^+ h! [; u
# X% E$ X; B( m( TVGA_VS信号: . ^0 J6 Y4 I, }/ @
6 ?, G) J$ x1 L/ K) Q1 y% S, a0 n5 ?, T: G3 w7 [5 M3 q/ c
由图可见,VGA_VS信号在0~1这一段场扫描时间内为低电平,即场同步头,其他时间为高电平。场扫描一次,场扫描计数器计数最大值为524,即刚好525个行扫描周期,与设计一致,满足VGA工业标准,因此可知场扫描信号满速时序设计要求。 ( _7 p1 g. T! ]& o) {- I1 a- Z
3 e7 j+ E# o' j# R
其他信号本文不再进行详细分析比对,在进行板级调试中,如果发现显示效果不对,则可根据实际显示效果,判断错误位置,如行同步信号错误、场同步信号错误等。 VGA控制器板级验证
. [: I6 k9 [& d ~& ] 在上一节,我们简述了VGA控制器的设计思路并给出了具体的VGA控制器设计过程,同时通过仿真验证了设计的合理性。本节,我们将对该VGA控制器进行板级验证,通过板级验证来进一步确定我们设计的正确性。 板级验证需求 X X' t6 l3 U' Y- J: m D
VGA的板级验证,主要验证以下三个方面: - 能够正确的全屏点亮屏幕,显示稳定
- 能否正确的显示颜色,即按照需求制定需要显示的颜色
- 能否正确的定位坐标,即实现在指定的位置显示对应的数据- `, E4 H( O7 D& i( J" d* O
板级验证电路设计
+ p0 C" v% u' C1 g, S; v% M为此,我们设计一个测试工程,该工程中我们测试上述提到的8种颜色,通过颜色的位置,不但能确定是否能够正确输出指定颜色的图像,还能间接确定是否能够精确指定像素位置。 因此,我们对屏幕进行划分,将屏幕划分成4行2列总共八个像素阵列,每个阵列分别显示一种颜色。据此,我们可以首先定义每种颜色的具体数据编码,然后再定义每个像素阵列的基本显示颜色,这里首先使用localparam定义每种颜色的具体数据编码:
6 G9 L; m# c3 ^, n1 ], b3 B6 r* q$ ^3 S* C/ {1 a' _1 t0 Z
* [+ S$ T9 Z3 {7 u5 N- ~% S% e; j
紧接着,我们需要知道VGA当前扫描的位置是在哪一个位置区间,换一种说法,我们需要通过VGA当前的扫描位置得到当前扫描的是哪一个像素阵列,然后给待显示数据赋予对应的颜色值即可。这里我们先定义每个像素块处于扫描中的条件。 1、 产生每一列的处于扫描状态标志信号,屏幕每行总共640个像素点,我们将屏幕划分成了2列,因此 (a) 当行扫描范围在0~319这一段像素内时,第0列处于活跃阶段; (b) 当扫描范围在320~639这一段像素内时,第1列处于活跃阶段。 因此可得: 9 A X( M! f9 l% @. h
! x: n! {. i* T# g3 ]3 f' c2、 产生每一行的处于扫描状态标志信号,屏幕每列总共480个像素点,我们将屏幕划分成了4列,因此 (a) 当行扫描范围在0~119这一段像素内时,第0行处于活跃阶段; (b) 当行扫描范围在120~239这一段像素内时,第1行处于活跃阶段; (c) 当行扫描范围在240~359这一段像素内时,第2行处于活跃阶段; (d) 当行扫描范围在360~479这一段像素内时,第3行处于活跃阶段, 因此可得: 2 n8 M9 H" r0 I) w4 { f, ]
4 ~6 ]8 p$ |# R2 h' D2 E) _6 I
3、 产生扫描每一个像素块的标志信号: , T/ K# s e/ u# f! k: _3 V
9 Z9 L3 N) s6 y7 d5 r( w$ Z
$ }$ s+ K2 K, k# }1 Z然后,我们就可以根据当前被扫描的像素块范围来确定需要给VGA输出什么颜色,这里采用一个多路器即可实现:
# a0 B9 Y% n) C, y3 R
$ V/ U! d0 ~7 k; ^$ F1 _' }% U1 ^) g( n' I0 D* V
: w* H# x, D$ o. ~8 g添加PLL时钟分频单元 通过以上步骤,我们就完成了简易VGA控制器测试电路的主要电路设计。在前面我们曾经提到,VGA控制器的像素时钟为25MHz,而我们芯航线FPGA开发板设计的是50MHz的晶振,因此需要使用锁相环对时钟进行分频得到25MHz的时钟,以供VGA控制器使用。注意,虽然我们直接使用寄存器二分频也能从50M直接分频得到25M时钟,但是这样分频出来的时钟驱动能力是非常差的,抖动也非常大,不能再作为时序电路的时钟使用,因此这里必须使用pll来得到25MHz时钟。具体PLL配置请参考《芯航线FPGA数字系统设计教程+实例解析》“FPGA设计思想与验证方法视频教程实验精讲手册”部分的“十六、 PLL锁相环介绍与简单应用”小节。
: P9 R8 O2 v4 M( p/ N/ B$ l9 G完整的测试电路代码实现完整的测试电路代码如下所示: ) {1 o' w* B& t& [$ e c' K- |7 d9 Y
( K+ l% ]$ A: i$ `8 a. t+ H6 T
9 Z! i' y2 S3 f! o @, \0 m% X+ Z9 z! ^- P
$ d4 s- ?9 d; q" d. {. e
; [+ Y. I a5 U" F; M: _
# U9 O& h5 H: K- w* p# L
板级验证引脚分配,VGA控制器测试工程引脚分配表如下所示: % \: R8 f. e3 t, |) a# I' N
$ Z; P3 ~. g+ @0 `6 n
芯航线FPGA学习套件主板与“VGA数码管PS2”三合一模块的连接如下所示: 7 i0 w: G" S: z: f0 b. @( B8 ^6 ?) l
2 L: E: N+ {, `4 k' P6 U最终测试效果如下图所示:
0 c' z. `0 h2 o8 ^1 I! u. }* A) s
9 q. z' m8 d' p" }5 R4 ^7 N+ B0 N/ T1 f
& h+ W( ^7 R% B
通过照片可知,VGA控制器设计能够稳定正确的刷新VGA显示器并控制正确的显示位置,因此设计无误。 后续,我们就可以使用该控制器再结合一定的图像信号产生电路实现更多更负责的显示系统设计。当然,也可能根据具体的使用环境,再对本控制器进行设计微调。& y2 n; i' I" J
6 C' J. [5 [% t$ l1 v/ F
# y% l! g, L W' X3 u. m: ^6 W
}: k4 |" q- d: P
" n0 [6 d+ g) z7 D: v 4 o: x5 B8 m4 n
3 W+ O& H! d$ A1 x) M4 m6 i: u5 ^5 ]* m* }9 E b
. _! p* K; A+ [, `* m
- u+ K9 Y4 K$ m& W( B% f/ S; ~* E5 {; i
! d% P& B8 R6 \4 V; e' p# K
; R: h, O# F2 k& m! V) y: c
Q R3 Y- X2 O
; r' F' R7 R; s/ H1 U + P# j! t/ @ m1 G- o# `3 u" v
B4 l- f; O7 F& @4 i$ V/ L 3 L- k6 P- q1 ]% w' Z/ {1 e/ ?& L3 J
* {& j( [8 P4 p4 w
+ l: W, K9 _( c
7 S5 }8 x( v% t
" N; x( u2 ^$ A: v
. t2 ~9 H% {& T* p5 a2 ~ 2 G7 c* n9 { }0 H2 t7 s* @9 [3 i0 Q
{' [- N4 x4 z6 j D; z1 e$ }( v6 C3 N! Z
# p- `& Q3 j# e2 ^/ j
6 Y5 V& Q- \9 U% [4 X O
- E1 R: q* _5 c, h ?% t
. T% B+ ^4 O! i Y( c: S! L% v
H& X7 x4 J+ A/ P+ W
% a3 P( B' T1 ~! `1 C) Q6 L3 k* H5 p" \& U6 b1 _& R9 y4 V* B
& ~2 l P5 h: `
, |( l% F G& i1 n$ P' L
5 Z# q- K( p: S2 \9 _- N+ \9 {1 s ; i: Q' L2 t. Z ~& c4 m- ^! M( i
" B; b$ u! `8 R1 s) {! D, ]" E: c
% s; e/ A4 m/ ~$ o% {' N
, y4 z a6 m) j* w5 U( Y0 i" Z0 D # n2 P r& h1 U* k! k' F, ^, G
: V: s T3 @ D* P
% y; f* |# M) k" E: y* k ( Z( ^1 e! r; ]+ X" C
: l) G& n# v0 _. _* P& f; |
$ \- `& H# z g
" [( F/ n( y- @8 I" j# q, V0 J" S5 A % v2 P1 ~7 \( B+ q: m9 E5 O: r
+ ~& D: v! ~6 `
5 R! m$ H" _/ m+ ^2 X- ]3 S
# d8 f$ }9 J/ b! ] t/ I d" X4 _3 Q4 x( A9 N$ e3 [
& ]- \( x) A9 z4 K7 }
|
|