杜宗展+王振河+馮迎春
摘 要: VGA(視頻圖形陣列)是一種標(biāo)準(zhǔn)的顯示接口,被廣泛應(yīng)用。根據(jù)VGA,F(xiàn)PGA(現(xiàn)場可編程門陣列)的作用原理,設(shè)計的基于FPGA的VGA接口可以直接將數(shù)據(jù)送至顯示器,同時增添了關(guān)于輸出圖像灰度等級的設(shè)計。與傳統(tǒng)設(shè)計相比,該設(shè)計沒有計算機(jī)的處理過程,可節(jié)省硬件成本,加快數(shù)據(jù)處理速度,被廣泛應(yīng)用到視頻顯示領(lǐng)域。
關(guān)鍵詞: 現(xiàn)場可編程門陣列; 視頻圖形陣列; 顯示接口; 灰度
中圖分類號: TN919?34; TP391.8 文獻(xiàn)標(biāo)識碼: A 文章編號: 1004?373X(2015)16?0095?05
Design of VGA image display system based on FPGA
DU Zongzhan1, WANG Zhenhe2, FENG Yingchun2
(1. School of Electrical Engineering, Shandong University, Jinan 250061, China;
2. Maintenance Company, Shandong Electric Power Group Co., Jinan 250061, China)
Abstract: As a standard display interface, VGA (video graphics array) has been widely used. According to the principles of VGA and FPGA (field programmable gate array), the designed VGA interface based on FPGA can send the data to the display directly, and grayscale of the output image was added to this design. Compared to the traditional design, there is no computer processing procedure in the design, which can save the expense of hardware and enhance the speed of data processing. It is widely used to the domain of video display.
Keywords: field programmable gate array; video graphics array; display interface; grayscale
在傳統(tǒng)的圖像處理系統(tǒng)中,要將圖像顯示出來,采取的方法是先將圖像數(shù)據(jù)傳入電腦,然后經(jīng)過顯示器顯示。在這個傳輸過程中,對圖像的控制需要經(jīng)過CPU,這樣既造成資源浪費(fèi),一直通過電腦處理還會降低系統(tǒng)的靈活性[1]。利用FPGA(現(xiàn)場可編程門陣列)對VGA(視頻圖形陣列)顯示接口進(jìn)行設(shè)計,數(shù)據(jù)不需要經(jīng)過計算機(jī),只在整個系統(tǒng)內(nèi)部傳輸。這種設(shè)計使得系統(tǒng)的組成規(guī)模和硬件設(shè)備成本減少,系統(tǒng)的穩(wěn)定性、擴(kuò)展性和可靠性得到增強(qiáng)[2?3]。VGA自從推出以來,作為一種標(biāo)準(zhǔn)顯示接口在視頻、計算機(jī)等顯示器領(lǐng)域有較廣泛的應(yīng)用[4]。FPGA的特點(diǎn)是容量大、投資少、周期短、靈活性等,F(xiàn)PGA強(qiáng)大的處理功能使其在視頻領(lǐng)域得到廣泛應(yīng)用[5?8],成為硬件設(shè)計的首選方式之一[9?10]。
1 VGA概述
1.1 VGA接口定義
VGA(Video Graphic Array)視頻圖形陣列是一種顯示標(biāo)準(zhǔn)[11],VGA接口就是顯示器經(jīng)過VGA標(biāo)準(zhǔn)數(shù)據(jù)輸出的接口。VGA視頻輸出接口一共有15個管腳,如圖1所示。在VGA輸出接口的15個管腳里面,3條基本色彩線(紅、綠、藍(lán))以及水平、垂直2條控制線是其中最重要的。這5條控制線可以組成8種組合,顯示8種色彩。
圖1 VGA接口
1.2 VGA顯示原理
VGA顯示器在顯示屏幕上的彩色是由R,G,B(紅、綠、藍(lán))三個基本色組成的,陰極射線管(CRT)發(fā)出電子束,打在熒光屏上產(chǎn)生三基色。VGA圖像顯示器的顯示是通過CRT逐行掃描或隔行掃描的方式實現(xiàn)的[12?13],即輸入信號在顯示器屏幕上方開始從左到右,從上到下逐行掃描。行掃描信號HS控制從左到右掃描、場掃描信號VS控制從上到下的掃描。電子束在掃描完一行后會回到下一行的起始位置,CRT對電子束消隱,用行同步信號HS進(jìn)行行同步;等所有行掃描結(jié)束,場同步信號VS進(jìn)行場同步,同時進(jìn)行場消隱,使電子束回到屏幕左上方[14]。
1.3 VGA時序分析
計算機(jī)業(yè)界根據(jù)不同的顯示接口制定了多種顯示接口協(xié)議,VGA是其中的一種[15]。在VGA的顯示接口協(xié)議中,顯示模式的不同是因為分辨率和刷新率不同,因而時序也不同[16]。不同顯示模式的時序都由VGA工業(yè)標(biāo)準(zhǔn)來控制。設(shè)計VGA圖像顯示時需要注意的是時序的驅(qū)動和VGA信號的電平驅(qū)動[17]。時序的驅(qū)動是設(shè)計的關(guān)鍵點(diǎn),時序若有偏差,顯示肯定會不正常,嚴(yán)重情況會損壞彩色顯示器。圖2為VGA的掃描時序圖。
圖2 VGA行(場)掃描時序圖
水平掃描時間是指完成一行掃描所需要的時間,其倒數(shù)代表行頻率;垂直掃描時間是指完成整個屏幕掃描需要的時間,倒數(shù)為場頻率,即一屏刷新一次的頻率。常見的有60 Hz,75 Hz等。在本文中,時鐘頻率以700×480@59.94 Hz(60 Hz)為例,每場對應(yīng)著525個行周期(信號是N制式,525=10+2+480+33),其中480是圖像顯示行。每一場都有場同步信號,脈沖的寬度是2個行周期的脈沖,每顯示行有860點(diǎn)時鐘,其中700點(diǎn)是有效顯示區(qū),每一行有行同步信號,該脈沖寬度為96個脈沖。由此可以算出:行頻為525×59.94=31 469 Hz;需要的時鐘頻率為:525×860×59.94≈27 MHz。VGA的行時序、場時序分別包括4個參數(shù):顯示前沿、同步脈沖、顯示后沿和顯示有效時序段,參數(shù)值見表1。
2 VGA驅(qū)動程序的FPGA實現(xiàn)
FPGA(Field?Programmable Gate Array)現(xiàn)場可編程門陣列,是整個系統(tǒng)的核心。FPGA擁有廣泛的硬件資源,功能強(qiáng)大,可重配置能力強(qiáng),保密性好,系統(tǒng)硬件規(guī)模小、投資少等特點(diǎn),是嵌入式設(shè)計的主流平臺之一[18?19],利用FPGA編程器件實現(xiàn)VGA顯示,實際應(yīng)用廣泛。系統(tǒng)組成框架圖如圖3所示。
表1 參數(shù)值
圖3 系統(tǒng)框架圖
(1) 系統(tǒng)通過CCD紅外攝像頭采集紅外圖像LVDS數(shù)據(jù)傳輸給FPGA芯片,F(xiàn)PGA內(nèi)部實現(xiàn)的功能包括:圖像采集模塊、亮度值轉(zhuǎn)換為灰度值模塊、SRAM控制模塊、VGA控制模塊。
(2) 圖像采集模塊獲取紅外圖像LVDS數(shù)據(jù),根據(jù)紅外圖像的時鐘信號及同步信號劃分出一塊存儲地址及一幀圖像的大小。
(3) 亮度值轉(zhuǎn)換為灰度值模塊是對紅外圖像亮度值映射到灰度值的轉(zhuǎn)換,也就說獲得紅外圖像亮度范圍為0~65 535映射到灰度范圍0~255上。
(4) SRAM控制模塊是對外圍SRAM芯片的讀/寫操作,也就是說通過SRAM控制模塊可以把轉(zhuǎn)換好的紅外圖像數(shù)據(jù)存儲到SRAM芯片,新數(shù)據(jù)來到更新SRAM芯片中數(shù)據(jù),讀信號來到讀取SRAM芯片中數(shù)據(jù),是一種乒乓讀寫操作的實現(xiàn)。
(5) VGA控制模塊實現(xiàn)了使用27 MHz時鐘輸出700×480@60 Hz VGA信號,同時控制ADV7125芯片輸出到VGA顯示屏幕上。
VGA驅(qū)動程序需要完成的任務(wù)是:行同步信號和列同步信號根據(jù)VGA時序產(chǎn)生,在有效像素期間內(nèi)將顯示顏色的數(shù)據(jù)傳輸?shù)絉GB;顯示模式和刷新頻率不同時,同步信號的前、后、同步信號、有效像素數(shù)也不同,需要通過像素時鐘率來進(jìn)行設(shè)置;例如表1中數(shù)據(jù),以700×480,60 Hz為例,像素時鐘為27 MHz,像素時鐘=(16+96+48+700)×(10+2+33+480)×60=27 MHz。
以下是本設(shè)計中VGA實現(xiàn)顯示的Verilog代碼:
/*
vga(700*480, 60hz)
dclk=27M hs:Horizontal vs:Vertical
every Vertical has 525 Horizontals
every Horizontal has 860 point
IDEA BY XIAYANG
*/
module vga_drive(
//vga port////////////////////////////////////////////
hs, //vga hs
vs, //vga vs
reset, //reset
clk, //vga clk input 27M
rgb_r, //vga red output[9:0]
rgb_b, //
rgb_g, //
blank, //blank=hs&&vs
vga_sync, //tvsync=0
vga_clk, //clk to ad7125 27M
//sram port////////////////////////////////////////////
sram_addr, //sram address output[17:0]
sram_data, //sram data input[15:0]
ce_n,
we_n,
lb_n,
ub_n,
oe_n
);
////////////////////////////////////////////////////////
input clk,reset;
input[15:0] sram_data;
output[17:0] sram_addr;
output hs,vs,blank,vga_sync,vga_clk,ce_n,we_n,lb_n,ub_n,oe_n;
reg vga_clk;
//output[9:0] rgb_r,rgb_g,rgb_b;
output[7:0] rgb_r,rgb_g,rgb_b;
reg hs,vs,ce_n,we_n,lb_n,ub_n,oe_n;
//reg[9:0] rgb_r,rgb_b,rgb_g;
reg[7:0] rgb_r,rgb_b,rgb_g;
reg[17:0] sram_addr;
reg[9:0] h_cnt,v_cnt;
reg[1:0] h_state;
reg[1:0] v_state;
reg flage; //control sram upper data or lower data
reg [1:0] clk_count=0;
//reg lcd_dclk;
parameter video=0,front=1,sync=2,back=3;
assign blank=hs&&vs; //blank
assign vga_sync=0; //tvsync
//assign vga_clk=lcd_dclk; //vga clk 27M
//////////////////////hs&vs(clk)///////////////////////////
always @ (posedge clk)
begin
clk_count<=clk_count+2′d1;
if(clk_count[0])
vga_clk<=1′b0;
else
vga_clk<=1′b1;
end
always@(posedge vga_clk or negedge reset)
begin
if(~reset)
begin
h_cnt<=0;
v_cnt<=0;
end
else if(h_cnt==859)
begin
h_cnt<=0;
if(v_cnt==524)
begin
v_cnt<=0;
end
else v_cnt<=v_cnt+1;
end
else h_cnt<=h_cnt+1;
end
///////////////////////h_state////////////////////////
always @ (posedge vga_clk or negedge reset)
begin
if(~reset)
begin
sram_addr<=0;
flage<=0;
end
else
begin
case(h_state)
video: //video state
begin
hs<=1;
/////////////////control display//////////////////////
we_n<=1;
ce_n<=0;
oe_n<=0;
lb_n<=0;
ub_n<=0;
if(h_cnt%2)
begin
rgb_r[7:0]<=8′b11110000;
rgb_g[7:0]<=8′b11110000;
rgb_b[7:0]<=8′b11110000;
end
else
begin
rgb_r[7:0]<=8′b11110000;
rgb_g[7:0]<=8′b11110000;
rgb_b[7:0]<=8′b11110000;
end
//////////////////////////////////////////////////////
if(h_cnt==639) h_state<=front;
else h_state<= video;
end
front: // front porch
begin
hs<=1;
rgb_r<=0;
rgb_g<=0;
rgb_b<=0;
if(h_cnt==715) h_state<=sync;
else h_state<= front;
end
sync: //sync pulse
begin
hs<=0;
rgb_r<=0;
rgb_g<=0;
rgb_b<=0;
if(h_cnt==811) h_state<=back;
else h_state<= sync;
end
back: //back porch
begin
hs<=1;
rgb_r<=0;
rgb_g<=0;
rgb_b<=0;
if(h_cnt==859) h_state<=video;
else h_state<= back;
end
default: h_state<=video;
endcase
end
end
//////////////////////v_state/////////////////////
always@(posedge vga_clk)
begin
case(v_state)
video: //video state
begin
vs<=1;
if(v_cnt==479) v_state<=front;
else v_state<= video;
end
front: //front proch
begin
vs<=1;endprint
if(v_cnt==489) v_state<=sync;
else v_state<= front;
end
sync: //sync pulse
begin
vs<=0;
if(v_cnt==491) v_state<=back;
else v_state<= sync;
end
back: //back porch
begin
vs<=1;
if(v_cnt==524) v_state<=video;
else v_state<= back;
end
default: v_state<=video;
endcase
end
endmodule
VGA時序控制模塊控制產(chǎn)生700×480的顯示范圍,另外,消隱范圍、水平同步時序信號HS以及垂直同步時序信號VS的值也受VGA時序控制模塊控制[20]。通常情況下,時序計數(shù)器是通過像素時鐘來控制水平同步時序信號HS,譯碼計數(shù)器的值產(chǎn)生HS信號。當(dāng)前像素顯示的位置由計數(shù)器在指定的某一行處產(chǎn)生。一個獨(dú)立的計數(shù)器產(chǎn)生垂直時序信號VS,垂直同步計數(shù)器在每個HS脈沖信號來臨時自動加1,譯碼值產(chǎn)生VS信號,計數(shù)器產(chǎn)生當(dāng)前顯示行。這2個計數(shù)器從地址到顯示緩沖器連續(xù)計數(shù)。
3 灰度圖像的實現(xiàn)
這里把能真實地反映自然物本來顏色的圖像稱之為真彩色圖像,真彩色圖像占用的存儲空間大、耗時多[21]。只含有亮度信息,而無色彩信息的圖像稱為灰度圖,例如平時生活中見到的黑白照片:照片的亮度有明暗的變化,但是沒有彩色。在顯示器上要想顯示灰度圖,需要把亮度的值進(jìn)行量化。亮度值通常包括從0~255的范圍,一共256個級別,其中0是代表最暗即全黑,255代表最亮即全白。在.bmp格式的文件中是沒有灰度圖這一概念的,但是可以通過在.bmp文件中表示出灰度圖。通過利用每一項的 RGB 值都是相同的256色的調(diào)色板來實現(xiàn),也就是說 RGB 值從(0,0,0),(1,1,1)一直到(255,255,255)這樣的方式。其中(0,0,0)是全黑色,(255,255,255)是全白色,中間的代表灰色。這樣,灰度圖就可以用256色圖來表示,同理灰度級別也可以用256級別來表示。本文中VGA顯示系統(tǒng)中灰度圖的研究和添加,使得顯示器不僅能顯示彩色,同時可以有不同灰度等級的圖像輸出。
4 結(jié) 語
本文在基于FPGA的VGA圖像顯示系統(tǒng)的研究中,通過基于FPGA進(jìn)行的設(shè)計以及VGA顯示接口的使用,使系統(tǒng)的成本大大降低,數(shù)據(jù)傳輸速度增強(qiáng)。在應(yīng)用上可以根據(jù)時鐘頻率大小設(shè)置分辨頻率大小,相比專用IP模塊減少了不必要的電路配置,增加了模塊的靈活性。另外,添加了顯示彩色圖像可以轉(zhuǎn)化為灰度圖的設(shè)計,完善了輸出圖像多為彩色圖的不足,使輸出圖像的色彩變化更具選擇性。
參考文獻(xiàn)
[1] 董兵,朱齊丹,文睿.基于FPGA的VGA圖像控制器的設(shè)計與實現(xiàn)[J].應(yīng)用科技,2006,33(10):42?45.
[2] 朱奕丹,方怡冰.基于FPGA的圖像采集與VGA顯示系統(tǒng)[J].計算機(jī)應(yīng)用,2011,31(5):1258?1264.
[3] 劉威,石彥杰,高博.基于FPGA的VGA顯示模式和像素頻率的識別[J].電子工程師,2008,34(1):50?52.
[4] 蔣艷紅.基于FPGA的VGA圖像信號發(fā)生器設(shè)計[J].電子測量技術(shù),2008,31(3):78?81.
[5] 楊欽,周云飛,胡永兵.基于FPGA的視頻圖像采集與顯示系統(tǒng)設(shè)計[J].計算機(jī)工程與設(shè)計,2013,34(6):1988?1992.
[6] 邵忠俊,程光偉.基于FPGA的視頻采集與顯示模塊設(shè)計[J].電子元器件應(yīng)用,2010,12(12):24?25.
[7] 劉文英.基于FPGA的視頻圖像預(yù)處理系統(tǒng)的設(shè)計與實現(xiàn)[D].天津:天津師范大學(xué),2010.
[8] 祝長鋒,肖鐵軍.基于FPGA的視頻圖像采集系統(tǒng)的設(shè)計[J].計算機(jī)工程與設(shè)計,2008,29(17):4404?4407.
[9] 張亞平,賀占莊.基于FPGA的VGA顯示模塊設(shè)計[J].計算機(jī)技術(shù)與發(fā)展,2007,17(6):242?245.
[10] 鄭爭兵.基于FPGA的VGA波形顯示系統(tǒng)設(shè)計與實現(xiàn)[J].液晶與顯示,2014,29(1):88?93.
[11] 周卓然,徐道連,呂鳳飛,等.基于FPGA的VGA圖像顯示系統(tǒng)的設(shè)計與實現(xiàn)[J].儀表技術(shù)與傳感器,2012(7):90?92.
[12] 袁堂青,張玉璘.基于FPGA的VGA漢字顯示系統(tǒng)設(shè)計與實現(xiàn)[J].濟(jì)南大學(xué)學(xué)報:自然科學(xué)版,2011,25(1):37?38.
[13] 熊文彬,蔣泉,曲建軍,等.基于FPGA實現(xiàn)的視頻顯示系統(tǒng)[J].液晶與顯示,2011,26(1):92?93.
[14] 陳姚節(jié),盧建華.基于FPGA的VGA顯示接口的研究與設(shè)計[J].交通與計算機(jī),2005,23(2):47?49.
[15] Video Electronics Standards Association. VESA and industry standards and guidelines for computer display monitor timing (DMT) [S]. San Jose, USA: VESA, 1998.
[16] 朱文偉,許忠仁.基于FPGA的VGA圖像控制器的設(shè)計與實現(xiàn)[J].貴州大學(xué)學(xué)報:自然科學(xué)版,2009,26(2):109?111.
[17] 劉樂善.微型計算機(jī)接口技術(shù)及應(yīng)用[M].武漢:華中科技大學(xué)出版社,1999.
[18] 鄭爭兵.一種基于FPGA的UART電路設(shè)計[J].國外電子測量技術(shù),2010,29(7):85?87.
[19] 鄭爭兵.基于DSP Builder的FIR數(shù)字濾波器設(shè)計與驗證[J].陜西理工學(xué)院學(xué)報:自然科學(xué)版,2013,29(2):34?38.
[20] 郭永彩,蘇渝維,高潮.基于FPGA的紅外圖像實時采集系統(tǒng)設(shè)計與實現(xiàn)[J].儀器儀表學(xué)報,2011,32(3):514?519.
[21] 周雪芹,劉曉紅.利用VC實現(xiàn)真彩色位圖到灰度圖的轉(zhuǎn)換[J].模式識別與仿真技術(shù),2005,24(3):25?27.endprint