VGA(Video Graphics Array)視頻圖形陣列是IBM于1987年提出的一個(gè)使用模擬信號(hào)的電腦顯示標(biāo)準(zhǔn)。VGA接口即電腦采用VGA標(biāo)準(zhǔn)輸出數(shù)據(jù)的專用接口。VGA接口共有15針,分成3排,每排5個(gè)孔,顯卡上應(yīng)用最為廣泛的接口類型,絕大多數(shù)顯卡都帶有此種接口。它傳輸紅、綠、藍(lán)模擬信號(hào)以及同步信號(hào)(水平和垂直信號(hào))。
vga接口原理
常見接口之色差VGA接口(D-Sub接口)
說到VGA接口,相信很多朋友都不會(huì)陌生,因?yàn)檫@種接口是電腦顯示器上最主要的接口,從塊頭巨大的CRT顯示器時(shí)代開始,VGA接口就被使用,并且一直沿用至今,另外VGA接口還被稱為D-Sub接口。
很多人覺得只有HDMI接口才能進(jìn)行高清信號(hào)的傳輸,但這是一個(gè)大家很容易進(jìn)入的誤區(qū),因?yàn)橥ㄟ^VGA的連接同樣可以顯示1080P的圖像,甚至分辨率可以達(dá)到更高,所以用它連接顯示設(shè)備觀看高清視頻是沒有問題的,而且雖然它是種模擬接口,但是由于VGA將視頻信號(hào)分解為R、G、B三原色和HV行場信號(hào)進(jìn)行傳輸,所以在傳輸中的損耗還是相當(dāng)小的。
15針VGA接口引腳(4張)
VGA接口產(chǎn)生原因: 顯卡所處理的信息最終都要輸出到顯示器上,顯卡的輸出接口就是電腦與顯示器之間的橋梁,它負(fù)責(zé)向顯示器輸出相應(yīng)的圖像信號(hào)。CRT顯示器因?yàn)?a target="_blank">設(shè)計(jì)制造上的原因,只能接受模擬信號(hào)輸入,這就需要顯卡能輸出模擬信號(hào)。VGA接口就是顯卡上輸出模擬信號(hào)的接口,VGA(Video Graphics Array)接口,也叫D-Sub接口。雖然液晶顯示器可以直接接收數(shù)字信號(hào),但很多低端產(chǎn)品為了與VGA接口顯卡相匹配,因而采用VGA接口。
vga接口設(shè)計(jì)原理
基于CRT的VGA顯示使用了幅度調(diào)制的方式來移動(dòng)電子束(陰極射線)在涂有熒光粉層的屏幕上顯示信息。彩色CRT顯示使用了三個(gè)電子束(紅、藍(lán)、綠)對陰極射線管頂端顯示屏內(nèi)部的熒光圖層施加能量。電子槍產(chǎn)生電子束,其工作原理是由燈絲加熱陰極,陰極發(fā)射電子,然后在加速極電場的作用下,經(jīng)聚焦極聚成很細(xì)的電子束,在陽極高壓作用下,獲得巨大的能量,以極高的速度去轟擊熒光粉層。
這些電子束轟擊的目標(biāo)就是熒光屏上的三原色。為此,電子槍發(fā)射的電子束不是一束,而是三束,它們分別受電腦顯卡R、 G、 B三個(gè)基色視頻信號(hào)電壓的控制,去轟擊各自的熒光粉單元。受到高速電子束的激發(fā),這些熒光粉單元分別發(fā)出強(qiáng)弱不同的紅、綠、藍(lán)三種光。根據(jù)空間混色法(將三個(gè)基色光同時(shí)照射同一表面相鄰很近的三個(gè)點(diǎn)上進(jìn)行混色的方法)產(chǎn)生豐富的色彩,這種方法利用人們眼睛在超過一定距離后分辨力不高的特性,產(chǎn)生與直接混色法相同的效果。用這種方法可以產(chǎn)生不同色彩的像素,而大量的不同色彩的像素可以組成一張漂亮的畫面,而不斷變換的畫面就成為可動(dòng)的圖像。
利用了人們眼睛的視覺殘留特性和熒光粉的余輝作用,這就是即使只有一支電子槍,只要三支電子束可以足夠快地向所有排列整齊的像素進(jìn)行激發(fā),人們還是可以看到一幅完整的圖像的?,F(xiàn)在的CRT顯示器中的電子槍能發(fā)射這三支電子束,然后以非常非常快的速度對所有的像素進(jìn)行掃描激發(fā)。
要形成非常高速的掃描動(dòng)作,還需要偏轉(zhuǎn)線圈(Deflection coils)的幫助,通過它可以使顯像管內(nèi)的電子束以一定的順序,周期性地轟擊每個(gè)像素,使每個(gè)像素都發(fā)光,而且只要這個(gè)周期足夠短,也就是說對某個(gè)像素而言電子束的轟擊頻率足夠高,人們就會(huì)看到一幅完整的圖像。把這種電子束有規(guī)律的周期性運(yùn)動(dòng)叫掃描運(yùn)動(dòng)。
因?yàn)橛写罅颗帕姓R的像素需要激發(fā),必然要求有規(guī)律的電子槍掃描運(yùn)動(dòng)才顯得高效,通常實(shí)現(xiàn)掃描的方式很多,如直線式掃描,圓形掃描,螺旋掃描等等。其中,直線式掃描又可分為逐行掃描和隔行掃描兩種,事實(shí)上,在CRT顯示系統(tǒng)中兩種都有采用。逐行掃描是電子束在屏幕上一行緊接一行從左到右的掃描方式,是比較先進(jìn)的一種方式。而隔行掃描中,一張圖像的掃描不是在一個(gè)場周期中完成的,而是由兩個(gè)場周期完成的。在前一個(gè)場周期掃描所有奇數(shù)行,稱為奇數(shù)場掃描,在后一個(gè)場周期掃描所有偶數(shù)行,稱為偶數(shù)場掃描。無論是逐行掃描還是隔行掃描,為了完成對整個(gè)屏幕的掃描,掃描線并不是完全水平的,而是稍微傾斜的,為此電子束既要作水平方向的運(yùn)動(dòng),又要作垂直方向的運(yùn)動(dòng)。前者形成一行的掃描,稱為行掃描,后者形成一幅畫面的掃描,稱為場掃描。
典型的,視頻數(shù)據(jù)是來源于視頻刷新存儲(chǔ)器,給每個(gè)像素位置分配一個(gè)或多個(gè)字節(jié)(Nexys2板子一個(gè)像素使用了3比特)。當(dāng)電子束穿過顯示屏?xí)r,控制器必須索引視頻存儲(chǔ)器,并且恢復(fù)和應(yīng)用視頻數(shù)據(jù)在準(zhǔn)確的時(shí)間來顯示。
基于像素時(shí)鐘,VGA控制器必須產(chǎn)生HS和VS時(shí)序信號(hào),并配合視頻數(shù)據(jù)的傳輸。像素時(shí)鐘定義了用于顯示一個(gè)像素信息的時(shí)間。VS信號(hào)定義了顯示的刷新頻率。刷新頻率是顯示圖層和電子束密度的函數(shù),實(shí)際上的刷新頻率在50Hz到120Hz范圍。在給定的刷新頻率下的顯示的行定義了水平“折回”頻率。對于640像素和480行的顯示模式使用了25MHz的像素時(shí)鐘和60+/-1Hz的刷新頻率。圖6.1給出了信號(hào)的時(shí)序圖,表6.1給出了VGA相對應(yīng)的時(shí)序參數(shù)
VGA顯示設(shè)計(jì)原理
1.圖像存儲(chǔ)原理
該設(shè)計(jì)將使用核產(chǎn)生器生成的塊ROM存儲(chǔ)器來存儲(chǔ)圖片,并在VGA顯示器上進(jìn)行顯示。圖片的大小為240x160像素,圖片的名字為loons240x160.jpg。
為了顯示圖片,必須先將JPAG格式的圖片轉(zhuǎn)換為相應(yīng)的loons240x160.coe文件,這個(gè)轉(zhuǎn)換過程是使用matlab函數(shù)IMG2coe8(imgfile,outfile)實(shí)現(xiàn)的。注意這個(gè)函數(shù)產(chǎn)生的.coe文件為每個(gè)圖形像素包含8位的字節(jié)信息,其格式為:
?。跼2,R1,R0,G2,G1,G0,B1,B0]
讀入Matlab函數(shù)的原始圖像包含8位的紅色,8位的綠色,8位的藍(lán)色,存儲(chǔ)在.coe文件的圖像包含3位的紅色,3位綠色和2位的藍(lán)色。這種轉(zhuǎn)換是和Nexys2板子的8位VGA顏色的硬件設(shè)計(jì)是相對應(yīng)的,其圖像質(zhì)量必然降低。
2.設(shè)計(jì)結(jié)構(gòu)
圖6.2給出了設(shè)計(jì)的結(jié)構(gòu)圖,從圖中可以看出該設(shè)計(jì)由clkdiv模塊,vga_640x480模塊,loons240x160模塊和VGA_bsprite模塊構(gòu)成。
設(shè)計(jì)的輸入信號(hào)包含:
1)btn(3):板上的按鍵輸入信號(hào),系統(tǒng)清除信號(hào); 2)mclk:板上50MHz的輸入信號(hào),系統(tǒng)時(shí)鐘輸入信號(hào); 3)sw(7:0):板上的撥碼開關(guān)輸入信號(hào), 設(shè)計(jì)的輸出信號(hào)包含:
1)hsync:行同步信號(hào),提供給VGA顯示器接口; 2)vsync:垂直同步信號(hào),提供給VGA顯示器接口;
3)red(2:0):3位***信號(hào),經(jīng)電阻網(wǎng)絡(luò)變換后提供給VGA顯示器接口; 4)green(2:0):3位綠色輸出信號(hào),經(jīng)電阻網(wǎng)絡(luò)變換后提供給VGA顯示器接口; 5)blue(1:0):2位藍(lán)色輸出信號(hào),經(jīng)電阻網(wǎng)絡(luò)變換后提供給VGA顯示器接口; 3.圖像存儲(chǔ)和尋址原理
產(chǎn)生的.coe文件將包含240x160=38,400個(gè)字節(jié)。ROM地址的計(jì)算: rom_addr16=ypix*240+xpix
其中xpix和ypix是圖像本地像素的位置,在實(shí)現(xiàn)該乘法時(shí),使用移位相加的算法: ypix*240=ypix*(128+64+32+16);
紅,綠和藍(lán)輸出從loon240x160ROM M[7:0]輸出,其地址是根據(jù)上面的等式計(jì)算得到。
設(shè)計(jì)實(shí)現(xiàn)和驗(yàn)證
1.打開ISE10.1,新建工程vga,設(shè)計(jì)參數(shù)選擇:芯片選擇Spartan3E XC3S1200E-4FG320,頂層設(shè)計(jì)選擇HDL,仿真器選項(xiàng)選擇Xilinx ISE Simulator。
2.新建名字為vga_bsprite,類型為VHDL module的設(shè)計(jì)文件,完成設(shè)計(jì)代碼輸入。 3.新建名字為clkdiv,類型為VHDL module的設(shè)計(jì)文件,完成設(shè)計(jì)代碼輸入。 4.新建名字為vga640x480,類型為VHDL module的設(shè)計(jì)文件,完成設(shè)計(jì)代碼輸入。 5.使用IMG2coe8.m(matlab程序),將圖片轉(zhuǎn)換為.coe文件(ROM核需要的保存象素信息的XILINX的存儲(chǔ)文件格式)。
6.新建名字為loons240x160,類型為IP(Core Generator & Architecture Wiazrd)的設(shè)計(jì)文件,在RAM & ROM中選擇ROM,寬度為8,深度為38400。
7.在處理窗口中,選擇并點(diǎn)擊Synthesis,工程進(jìn)行語言檢查和綜合,確認(rèn)設(shè)計(jì)正確。 8.新建文件名為vga_bsprite_top,類型為Implementation Constraints File用戶約束文件vga_bsprite_top.ucf。使用Nexys2板卡上的50MHz時(shí)鐘作為mclk輸入,撥碼開關(guān)SW(7:0)作為sw(7:0)的輸入,hsync,vsync,red,green,blue分別和VGA接口的行同步、垂直同步、紅色、綠色和藍(lán)色信號(hào)連接。按照板子設(shè)計(jì)在vga_bsprite.ucf文件完成引腳位置約束,保存并關(guān)閉該文件。
9.在管理窗口中雙擊Implement Design選項(xiàng),完成設(shè)計(jì)實(shí)現(xiàn);
10.在管理窗口中右鍵點(diǎn)擊Generate Programming File,選擇屬性Properities,在Startup Option標(biāo)簽欄中的FPGA Startup Clock選擇JTAG。
11.在管理窗口中雙擊Generate Programming File,生成比特流文件;
12.將Nexys2板卡和VGA顯示器連接,并上電后,在管理窗口中雙擊Configure Target Device,出現(xiàn)配置界面,選擇配置文件并下載到芯片中,確認(rèn)下載成功。
13.對設(shè)計(jì)進(jìn)行調(diào)試和驗(yàn)證。
設(shè)計(jì)代碼
1.vga_bsprite.vhd代碼 library IEEE;
use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity vga_bsprite is port (
vidon : in std_logic;
hc : in std_logic_vector(9 downto 0); vc : in std_logic_vector(9 downto 0); M : in std_logic_vector(7 downto 0); sw : in std_logic_vector(7 downto 0); rom_addr16 : out std_logic_vector(15 downto 0);
red : out std_logic_vector(2 downto 0); green : out std_logic_vector(2 downto 0); blue : out std_logic_vector(1 downto 0) );
end vga_bsprite;
architecture Behavioral of vga_bsprite is
constant hbp: std_logic_vector(9 downto 0) := “0010010000”; --Horizontal back porch = 144 (128+16) (96+48) constant vbp: std_logic_vector(9 downto 0) := “0000011111”; --Vertical back porch = 31 (2+29) constant w: integer := 240; constant h: integer := 160;
signal xpix, ypix: std_logic_vector(9 downto 0); signal rom_addr : std_logic_vector(16 downto 0); signal C1, R1: std_logic_vector(9 downto 0); signal spriteon, R, G, B: std_logic; begin
--set C1 and R1 using switches
C1 《= ‘0’ & SW(3 downto 0) & “00001”; R1 《= ‘0’ & SW(7 downto 4) & “00001”; ypix 《= vc-R1 when vc》=R1 and vc《R1+h xpix 《= hc-C1 when hc》=C1 and hc《C1+w
spriteon 《= ‘1’ when (((hc 》= C1 ) and (hc 《 C1 + w)) and ((vc 》= R1 ) and (vc 《 R1 + h))) else ‘0’;
process(xpix, ypix)
variable rom_addr1, rom_addr2: STD_LOGIC_VECTOR (16 downto 0); begin
rom_addr1 := (ypix & “0000000”) + (‘0’ & ypix & “000000”) + (“00” & ypix & “00000”) + (“000” & ypix & “0000”); -- y*(128+64+32+16) = y*240
rom_addr2 := rom_addr1 + (“00000000” & xpix); -- y*240+x rom_addr16 《= rom_addr2(15 downto 0);
end process;
process(spriteon, vidon, M) begin
if (spriteon = ‘1’ ) then
red 《= M(7 downto 5); green 《= M(4 downto 2); blue 《= M(1 downto 0); end if; end process; end Behavioral;
評(píng)論