|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
近年来FPGA越来越多的应用于图像处理领域。我们先了解一下图像处理的基础课题,图像的显示。显示器在接收图像信号时有多种接口,例如DVI,HDMI,VGA等。在做图像显示之前,我们先了解一些基础知识。
6 p1 m$ j8 |$ D: Y9 g$ u$ V" M, i3 l6 q) s/ |4 [' _$ J! H# N$ y
VGA
; y4 s8 A0 r# y* n' _6 O
; o" O3 @+ ^( Z% l$ oVGA(Video Graphics Array 视频图形阵列)是IBM 于1987年提出的一个使用模拟信号的电脑显示标准。VGA是最多制造商所共同支持的一个标准。个人电脑在加载自己的驱动程序之前,一般都支持VGA的标准。VGA接口即电脑采用VGA标准输出数据的专用接口。VGA接口共有3排共15针,其中需要FPGA编程控制的只有5个信号,即R(红)、G(绿)、B(蓝)、HS(水平同步信号)、VS(垂直同步信号)。. ^; N# k. b# x0 |
- E8 \) U- X; [$ ?& m/ ~RGB* z/ f _' t( O0 v
, m. i3 \; M( a
RGB (red、green、blue)即三基色,是色彩系统的一种。色彩系统是一种常用的表示颜色的方式。应用于计算机屏幕,分别有:RGB色彩系统、CMYK色彩系统、YIQ色彩系统、YUV色彩系统、YCbCr色彩系统等。根据人眼的结构,所有颜色都可看成是三个基本颜色——红(R),绿(G),蓝(B)的不同组合。在实际中用的最多的是RGB系统。
# w+ g* G3 S( K7 J* p( q+ D. f9 ~4 d( |' [. J- z) _0 w5 H
计算机屏幕的显示通常用的是这种系统。使用画图软件或PS软件时,特别是在保持图片时,经常被要求选择图片保存的格式,例如24位色或256色的等,这是什么意思呢?RGB颜色系统使用红绿蓝的不同组合来表示千万种色彩,其中红绿蓝有不同的比例,例如将红色从最淡到最红分成256个等级,如果每一级用一个数字来表示,则256级就需要一个8位位宽的二进制数来表示。同样,绿色,蓝色也可以这么划分。$ m6 l7 `. W ^* c
, ]' _% q2 @9 U
这样的话,就需要使用3个8位位宽的二进制数来表示,即RGB888,也就是24(8+8+8)位色。24位色,所能表示的颜色数量为2^24 = 1677,7216种,相近颜色的区别可以很小,已经超过了人眼睛的辨识能力,所以也叫真彩色(人眼大约能辨识100万种颜色)。256色指的是图片只使用256种颜色来表示。可以是rgb233或rgb332。9 y3 b7 g( T& e5 r4 r6 ~ T& p" k6 Q
5 |5 K$ r2 H- j6 f( m+ G/ p
显示分辨率
I6 ~! M" l3 d" T; B8 G
; B: S# [0 Y' T& M/ R$ R8 j显示分辨率。显示分辨率也称为像素分辨率,简称为分辨率,它是指可以使显示器显示的像素个数,通常用每行像素数乘每列像素数,例如:1024×768,表示显示器可以显示768行,1024列,共可显示786432个像素;分辨率为640×480,表示显示器可以显示480行,640列,共可显示307200个像素。* o9 V* f# c; u$ W( s, Y& \0 w, q e
0 f' ?! {8 [. Z4 i/ y; k显然,分辨率越高,显示屏可显示的像素就越多,图像就越清晰。每个显示器都有自己的最高分辨率,并且可以兼容其它较低的显示分辨率,所以一个显示器可以用多种不同的分辨率显示。
" \- z9 ]6 l5 |, F9 j3 M2 t+ P! }; H+ g: ?' j" T
PPI) S* J3 n1 \" \- c' a
, }6 l6 c7 h9 K6 ^; E
PPI。(Pixels Per Inch)即像素密度,所表示的是每英寸所拥有的像素数量。因此PPI数值越高,即代表显示屏能够以越高的密度显示图像。当然,显示的密度越高,拟真度就越高。% b! a# W+ U+ h7 ?
2 u, f1 u1 f$ E5 k
多年前买手机的时候能听到一个词,“视网膜屏”,即分辨率超过人眼识别极限的高分辨率屏幕。视网膜(Retina)屏幕是手机公司”发明”的一个营销术语。屏幕的像素密度达到326像素/英寸(ppi),称之为“视网膜屏幕”。
! q# J$ s- q7 a: K1 j8 V$ f3 v( c% J; w4 J7 [( u2 ~% R- \$ K
刷新原理7 B+ d7 I$ h. g' y% T
/ z, N0 r# M3 t9 _显示器刷新原理。我们看到的显示屏的区域在刷新操作里叫做“显示区域”,但刷新操作会刷新一个比这显示区域要大的区域,整个被刷新或者扫描的区域叫做“扫描区域”。
% o {' @" g1 j9 T! {/ a
2 e4 H" |' {# W* X! b, S扫描操作将整个行分成多个段,分别为水平同步段、扫描后沿、左边框(多数已经没有)、显示区域、右边框(多数已经没有)、扫描前沿,(垂直方向划分为垂直同步、扫描后沿、顶边框(多数已经没有)、显示区域、底边框(多数已经没有)、扫描前沿),这些段的长度在不同显示格式下不等,具体数值可以通过VESA的标准来查询。
$ f, ~2 r! \# Y6 E0 a) `* n; o: X" W( A2 Y
扫描操作从扫描区域的最左上角开始,一直向右扫描,遇到HSYNC为高时(也就是一行扫描完毕),扫描点回到最左边,开始新一行的扫描。这样一行一行往下扫描,当遇到VSYNC为高时(也就是一场扫描完毕),扫描点回到最开始位置。显示频率为60Hz时,每秒刷新60场。
1 d. U8 H, [1 Q; g- h' z, Y, T$ W/ Z$ B$ g
文字显示原理6 H' r, j# K+ t* [3 J
" a5 I/ Y9 E, n& e8 |1 }
文字显示原理。文字的显示,其实也是把文字当做图片,一个像素点一个像素点的来输出。
8 e' c4 F+ n$ f5 X/ g' ^* l- q2 x4 h r
如果对正方形内字符的每一个像素点进行标记,哪些点应该显示白色,哪些点应该显示黑色,那么就可以在vga输出的时候,输出对应像素点的颜色值,也就能输出这个文字。
7 d( m' K, \9 e$ a! P: V6 Z: b& ~9 N7 Z" F8 y
如何得到这个字的像素点颜色值呢?这儿我们可以使用一些工具,比如“PCtoLCD2002”这个软件。
4 L# z3 o& W/ `! v
1 Y/ g; K) c% h q' c* N# T. p7 q9 h
VGA显示
* O. ^/ K% ?5 C5 {/ J
$ I4 Y* k& L% i9 E' Z3 w# D" RVGA显示部分主要要做的是:% F0 p- m; b7 @4 t+ E2 z2 I+ \
1、取得字模,包括0-9,和“:” 共10个字符# U5 V2 \9 |% b) H) u
2、将字模按一定格式存入ROM。我在工程里使用的是128X64(高X宽)的字模,ROM中每个地址存字符的一行,也即ROM的位宽是64bit。但为了查询方便,并没有直接将字模依次存放进去,而是采用了如下的存放方法:
& s0 t4 U- t* `3 J; M1 _+ D. y% L* m1 m$ g9 k5 q3 Q. a
工程中我们取字模的时候,首先判断需要取哪个字符的字模,然后先查询到字模的首地址,再根据首地址依次加1来取出其他行的字模。这是因为VGA输出的时候,是一行行扫描的,也就是说字模需要一行行给出。这部分是整个项目的重难点,大家可以参考 《lookup_rom》模块的内容。
W! a/ E) N) r6 C0 f
, z: I1 W+ }& M" V, i$ d3、改动VGA模块,使得可以输出显示区域的坐标XY值。也就是,当VGA扫描到显示区域的时候,把显示区域,也就是显示屏,的当前坐标输出出来。' U2 e1 k2 i7 Y* a2 s8 n( C! N: {% p
9 @# ~! o4 F: m# ?
4、控制模块。控制模块要根据VGA输出的XY值,以及字符想要显示的初始位置,确定要从rom中取哪个字符哪一行的字模。代码中当扫描到需要显示字符的那一行时,依次取出8个字符的所有该行要显示的字模,(比如,要显示的时间是 23:59:59,vga显示某一行时只需取8个字模里的同一行,其他行在vga扫描其他行的时候再取)。取出的字模拼接在一起,当X坐标到达位置的时候给出颜色值。
8 T; G* ~1 K p0 r0 G* M
& j- h: d- f& ?8 }: m! r' r% }3 V7 l, B" x0 q T3 [* {- ~
|
|