VGA(Video Graphics Array)是IBM在1987年隨PS/2機(jī)一起推出的一種視頻傳輸標(biāo)準(zhǔn),當(dāng)時(shí)具有分辨率高、顯示速率快、顏色豐富等優(yōu)點(diǎn),在彩色顯示器領(lǐng)域得到了廣泛的應(yīng)用。
VGA接口就是顯卡上輸出模擬信號(hào)的接口,也叫D-Sub接口。VGA接口是一種D型口,上面共有15針空,分成三排,每排五個(gè)。VGA接口是目前中低端電腦配置上的主流口。
VGA顯示中,FPGA需要產(chǎn)生5個(gè)信號(hào):R、G、B三基色信號(hào),行同步信號(hào)HS,場同步信號(hào)VS。信號(hào)列表如表2-5。
表2.5 VGA信號(hào)列表
信號(hào)線 |
定義 |
HS |
行同步信號(hào) (3.3V電平) |
VS |
場/幀同步信號(hào)(3.3V電平) |
R |
紅基色(0-0.714V模擬信號(hào)) |
G |
綠基色(0-0.714V模擬信號(hào)) |
B |
藍(lán)基色(0-0.714V模擬信號(hào)) |
VGA接口圖如下:
圖2-26 VGA接口實(shí)物圖
以上接口的5個(gè)孔對(duì)應(yīng)著我們FPGA中產(chǎn)生的5個(gè)重要的信號(hào),其中R、G、B是數(shù)據(jù)信號(hào);HS、VS是控制信號(hào)。
1. VGA色彩原理
像素是產(chǎn)生各種顏色的基本單元。根據(jù)物理學(xué)中的混色原理,三色發(fā)光的亮度比例適當(dāng),可呈現(xiàn)白色。適當(dāng)?shù)恼{(diào)整發(fā)光比例可以出現(xiàn)不同的顏色。
表2.6 三基色顏色編碼表
顏色 |
黑 |
藍(lán) |
紅 |
紫 |
綠 |
青 |
黃 |
白 |
R |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
G |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
B |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
以上RBG一共有8組合,也就是可以產(chǎn)生8種顏色。但顯示器顯示的色彩卻是非常豐富,遠(yuǎn)遠(yuǎn)多于8種顏色,這是如何做到的呢?
原因就是對(duì)于顯示器來說,RGB三個(gè)信號(hào)其實(shí)是模擬信號(hào),其電平的高低,可以表示顏色的深淺。利用這個(gè)原理,我們就可以產(chǎn)生豐富的色彩。為了控制電壓的高低,我們就必須用到DA芯片。例如下圖中,FPGA產(chǎn)生RGB三種信號(hào),這時(shí)RGB都是多位的數(shù)字信號(hào)。DA芯片根據(jù)數(shù)字信號(hào)的值,產(chǎn)生不同電壓的模擬信號(hào)rgb。連接框圖如圖2-27
圖2-27 FPGA與顯示器的結(jié)構(gòu)圖
明德?lián)P的第二代開發(fā)板,R由3位數(shù)字信號(hào)組成(VGA_R0,VGA_R1,VGA_R2);G由3位數(shù)字信號(hào)組成(VGA_G0,VGA_G1,VGA_G2);B由2位數(shù)字信號(hào)組成(VGA_B0,VGA_B1)。并通過電壓進(jìn)行分壓,而得到不同的電平。實(shí)際電路如圖2-28。
圖2-28開發(fā)板RGB數(shù)模轉(zhuǎn)換電路圖
2. VGA顯示
(1)顯示原理
通用VGA顯示卡系統(tǒng)主要由控制電路、顯示緩存區(qū)和視頻BIOS程序三個(gè)部分組成。控制電路主要完成時(shí)序發(fā)生、顯示緩沖區(qū)數(shù)據(jù)操作、主時(shí)鐘選擇和D/A轉(zhuǎn)換等功能;顯示緩沖區(qū)提供顯示數(shù)據(jù)緩存空間;視頻BIOS作為控制程序固化在顯示卡的ROM中。
實(shí)現(xiàn)VGA顯示,除了實(shí)現(xiàn)時(shí)序控制,還必須有其他功能單元的支持才能實(shí)現(xiàn)完整的圖像顯示。
1)控制器:VGA顯示有多種模式,需要通過控制器實(shí)現(xiàn)模式間切換,還需要對(duì)顯示的內(nèi)容進(jìn)行接收、處理和顯示。所以控制器的性能越高,數(shù)據(jù)更新和顯示效果就越好。顯示數(shù)據(jù)緩存區(qū):VGA顯示要求顯存速度快、容量大。讀速度要達(dá)到65MHz以下,存儲(chǔ)容量至少要2MB。可采用高速SRAM或SDRAM作為顯示數(shù)據(jù)緩存。
2)數(shù)模轉(zhuǎn)換器DAC:VGA顯示對(duì)數(shù)模轉(zhuǎn)換DAC有如下要求:一是高速轉(zhuǎn)換,轉(zhuǎn)換的速度應(yīng)該在80MHz或以上;二是同步性好,能保證 R、G、B三路信號(hào)的同步性;三是有相應(yīng)的精度。可選擇一種包括3路8位高速D/A的專用視頻芯片。
3)數(shù)據(jù)源及其接口:要提高VGA顯示的效率,就要不斷更新數(shù)據(jù),同時(shí)還要保證實(shí)時(shí)性,因此需要非常高的接口速度。VGA顯示卡雖可達(dá)到100Mbps的數(shù)據(jù)更新速度,但是一般設(shè)備、特別是嵌入式設(shè)備達(dá)不到這么高的速度,而且大多數(shù)情況下也不需要這么高的數(shù)據(jù)更新率。目前常用接口為EPP接口、USB接口、 TCP/IP、RS232C/485等。其中TCP/IP、EPP接口和USB接口是基于計(jì)算機(jī)的,速度較快;TCP/IP、RS232C/485是基于網(wǎng)絡(luò)通信的接口,其中RS485速度雖慢,但應(yīng)用廣泛且容易實(shí)現(xiàn)遠(yuǎn)程控制。
(2)掃描方式
顯示器采用光柵掃描方式,即轟擊熒光屏的電子束在CRT屏幕上從左到右(受水平同步信號(hào) HSYNC 控制)、從上到下(受垂直同步信號(hào) VSYNC 控制)做有規(guī)律的移動(dòng)。電子束采用光柵掃描方式,從屏幕左上角一點(diǎn)開始,向右逐點(diǎn)進(jìn)行掃描,形成一條水平線;到達(dá)最右端后,又回到下一條水平線的左端,重復(fù)上面的過程;當(dāng)電子束完成右下角一點(diǎn)的掃描后,形成一幀。此后,電子束又回到左上方起點(diǎn),開始下一幀的掃描。這種方法也就是常說的逐行掃描顯示。
(3)掃描頻率
完成一行掃描的時(shí)間稱為水平掃描時(shí)間,其倒數(shù)稱為行頻率;完成一幀(整屏)掃描的時(shí)間稱為垂直掃描時(shí)間,其倒數(shù)稱為場頻率,即刷新一屏的頻率,常見的有60Hz,75Hz等等。標(biāo)準(zhǔn)的VGA顯示的場頻60Hz。
(4)數(shù)據(jù)寬度和格式
如果VGA顯示真彩色BMP圖像,則需要R、G、B三個(gè)分量各8位,即24位表示一個(gè)像素值,很多情況下還采用32位表示一個(gè)像素值。為了節(jié)省顯存的存儲(chǔ)空間,可采用高彩色圖像,即每個(gè)像素值由16位表示,R、G、B三個(gè)分量分別使用5位、6位、5位,比真彩色圖像數(shù)據(jù)量減少一半,同時(shí)又能滿足顯示效果。
(5)讀SRAM地址的產(chǎn)生方法
主時(shí)鐘作為像素點(diǎn)計(jì)數(shù)脈沖信號(hào),同時(shí)提供顯存SRAM的讀信號(hào)和D/A轉(zhuǎn)換時(shí)鐘,它所驅(qū)動(dòng)的計(jì)數(shù)器的輸出端作為讀SRAM的低位地址。行同步信號(hào)作為行數(shù)計(jì)數(shù)脈沖信號(hào),它所驅(qū)動(dòng)的計(jì)數(shù)器的輸出端作為讀SRAM的高位地址。由于采用兩片SRAM,所以最高位地址作為SRAM的片選使用。由于信號(hào)經(jīng)過CPLD內(nèi)部邏輯器件時(shí)存在一定的時(shí)間延遲,在CPLD產(chǎn)生地址和讀信號(hào)讀取數(shù)據(jù)時(shí),讀信號(hào)、地址信號(hào)和數(shù)據(jù)信號(hào)不能滿足SRAM讀數(shù)據(jù)的時(shí)序要求。可以利用硬件電路對(duì)讀信號(hào)進(jìn)行一定的時(shí)序調(diào)整,使各信號(hào)之間能夠滿足讀SRAM和為DAC輸入數(shù)據(jù)的時(shí)序要求。
3. VGA支持的規(guī)格
我們以第一個(gè)分辨率640/480來分析,其刷新速率是60Hz,每幅圖像有525行,每行有800個(gè)值。也就是說完成一幅圖像約是1s/60=16.6ms,完成一行約為16.6ms/525=31.75us,完成一個(gè)像素傳送約來31.75us/800=40ns。因此為了方便設(shè)計(jì),接口的時(shí)候設(shè)為25MHz最方便,每個(gè)時(shí)鐘送一個(gè)數(shù)據(jù)。
![]() |
![]() |
4. VGA接口項(xiàng)目
屏幕分辨率為640/480,刷新速率為60Hz,要求在屏幕中間顯示一個(gè)200*200的綠色方塊,屏幕其他地方均為黑色。
圖2-29 顯示效果圖
(1)明確功能
明確VGA接口的行信號(hào)時(shí)序圖。
明確VGA接口的場信號(hào)時(shí)序圖:
圖2-30 VGA接口時(shí)序圖
從時(shí)序圖我們可以知道,在第33~516個(gè)行周期中的第142~787個(gè)時(shí)鐘周期間,VGA輸入數(shù)據(jù)有效。另外,根據(jù)屏幕分辨率和刷新速率,我們可以得出使用25MHz系統(tǒng)時(shí)鐘最適合。
表2.7 信號(hào)列表
信號(hào)名 |
I/O |
位寬 |
說明 |
clk |
I |
1 |
系統(tǒng)工作時(shí)鐘25MHz |
rst_n |
I |
1 |
系統(tǒng)復(fù)位信號(hào),低電平有效 |
hys |
O |
1 |
行同步信號(hào) |
vys |
O |
1 |
場同步信號(hào) |
rgb_data |
O |
8 |
輸出顯示的RGB數(shù)據(jù) |
(2)功能波形
本項(xiàng)目的功能波形在上一步已經(jīng)給出,只需要在VGA輸入數(shù)據(jù)有效期間,根據(jù)題目要求把rgb_data變?yōu)榫G色或黑色即可。
(3)計(jì)數(shù)結(jié)構(gòu)
圖2-31 計(jì)數(shù)結(jié)構(gòu)圖
因?yàn)閺膹?fù)位后開始,hys與vys不斷循環(huán)產(chǎn)生波形,其順序?yàn)橥矫}沖、顯示后沿、顯示時(shí)序段和顯示前沿,所以使用計(jì)數(shù)器hs_cnt與vs_cnt,分別用于計(jì)數(shù)clk個(gè)數(shù)和行周期個(gè)數(shù)。
(4)加一結(jié)束條件
hs_cnt的加一條件:由于hs_cnt在模塊開始工作后不斷計(jì)數(shù),因此其加1條件為1;
vs_cnt的加一條件:在hs_cnt計(jì)數(shù)結(jié)束時(shí)加1,因此其加1條件為end_hs_cnt;
hs_cnt的結(jié)束條件:hs_cnt==800 – 1;
vs_cnt的結(jié)束條件:vs_cnt==525 – 1;
(5)定義特殊點(diǎn)
按要求,本題是黑色區(qū)域和綠色區(qū)域的組合,因此我們要定義好兩個(gè)區(qū)域的邊界。
圖2-32 特殊點(diǎn)示意圖
圖2-32有幾個(gè)特殊點(diǎn),需要我們記住。
hs_cnt的結(jié)束條件:hs_cnt==800-1,定為end_hs_cnt。
vs_cnt的結(jié)束條件:vs_cnt==525-1,定為end_vs_cnt。
首先我們從時(shí)序圖可知有效區(qū)域,為第33~516個(gè)行周期中的第142~787個(gè)時(shí)鐘周期。由于
要在中間顯示綠色,因此先計(jì)算屏幕中點(diǎn)位置:
由于綠色方框像素為200*200,即有
除此之外的有效區(qū)域其他部分均為黑色。
(6)完整性檢查
1.計(jì)數(shù)器hs_cnt
hs_cnt的初值:0;
hs_cnt的加1條件:1;
hs_cnt的結(jié)束值:計(jì)數(shù)至hs_cnt==800 - 1;
2.計(jì)數(shù)器vs_cnt
vs_cnt的初值:0;
vs_cnt的加1條件:end_hs_cnt;
vs_cnt的結(jié)束值:計(jì)數(shù)至vs_cnt==525 - 1;
3.行信號(hào)hys
hys的初值:0;
hys由0變1:hs_cnt==10’d95 && add_hs_cnt;
hys由1變0:end_hs_cnt;
4.場信號(hào)vys
vys的初值:0;
vys由0變1:vs_cnt==1’d1 && add_vs_cnt;
vys由1變0:end_vs_cnt;
5.RGB數(shù)據(jù)信號(hào)rgb_data
rgb_data的初值:0;
rgb_data有效區(qū)域:hs_cnt_add && hs_cnt>=141 && hs_cnt<787 && vs_cnt>=32 && vs_cnt<516;
rgb_data為綠色:在有效區(qū)域且hs_cnt>=364 && hs_cnt<564 && vs_cnt>=174 && vs_cnt<374;
rgb_data為黑色:有效區(qū)域的其他部分;
(7)至簡設(shè)計(jì)法計(jì)數(shù)器代碼
2 if(rst_n==1'b0)begin
3 hs_cnt <= 0;
4 end
5 else if(add_hs_cnt)begin
6 if(end_hs_cnt) begin
7 hs_cnt <= 0;
8 end
9 else begin
10 hs_cnt <= hs_cnt+1;
11 end
12 end
13 end
14
15 assign add_hs_cnt = 1;
16 assign end_hs_cnt = add_hs_cnt&& hs_cnt==800-1;
17
18 always @(posedge clk or negedge rst_n)begin
19 if(rst_n==1'b0)begin
20 vs_cnt <= 0;
21 end
22 else if(add_vs_cnt)begin
23 if(end_vs_cnt) begin
24 vs_cnt <= 0;
25 end
26 else begin
27 vs_cnt <= vs_cnt+1;
28 end
29 end
30 end
31
32 assign add_vs_cnt = end_hs_cnt;
33 assign end_vs_cnt = add_vs_cnt&&vs_cnt==525-1;
34
完整代碼:
2 assign hs_rise = add_hs_cnt && hs_cnt == 10'd95;
3
4 always @(posedge clk or negedge rst_n)begin
5 if(rst_n==1'b0)begin
6 hys <= 1;
7 end
8 else if(hs_rise)begin
9 hys <= 1;
10 end
11 else if(end_hs_cnt)begin
12 hys <= 0;
13 end
14 end
15
16 //按照第六步第4點(diǎn),寫出vys的代碼
17 assign vs_rise = add_vs_cnt && vs_cnt == 1'd1;
18
19 always @(posedge clk or negedge rst_n)begin
20 if(rst_n==1'b0)begin
21 vys <= 1;
22 end
23 else if(vs_rise)begin
24 vys <= 1;
25 end
26 else if(end_vs_cnt)begin
27 vys <= 0;
28 end
29 end
30
31 //有效區(qū)域與顯示綠色區(qū)域定義
32 parameter X0 = 141;
33 parameter X1 = 787;
34 parameter Y0 = 32 ;
35 parameter Y1 = 516;
36 parameter X_CENT = 464;
37 parameter Y_CENT = 274;
38 parameter GREEN = 8'b000_111_00;
39 parameter BLACK = 8'b000_000_00;
40
41 assign valid_area = add_hs_cnt&&hs_cnt>=X0 &&hs_cnt<X1&&vs_cnt>=Y0
42 && vs_cnt<Y1;
43 assign green_area = valid_area&&(hs_cnt>=X_CENT-100
44 && hs_cnt<X_CENT+100 && vs_cnt>=Y_CENT-100
45 &&vs_cnt<Y_CENT+100);
46
47 //按照第六步第5點(diǎn),寫出rgb_data的代碼
48 always @(posedge clk or negedge rst_n)begin
49 if(rst_n==1'b0)begin
50 rgb_data <= 8'h00;
51 end
52 else if(valid_area)begin
53 if(green_area)begin
54 rgb_data <= GREEN;
55 end
56 else begin
57 rgb_data <= BLACK;
58 end
59 end
60 else begin
61 rgb_data <= 8'h00;
62 end
63 end
64
技術(shù)交流QQ群:544453837
更多FPGA技術(shù)資訊:明德?lián)P科教
了解>>至簡設(shè)計(jì)法