使用FPGA 控制VGA 顯示
顯示器因?yàn)槠漭敵鲂畔⒘看螅敵鲂问蕉鄻拥忍攸c(diǎn)已經(jīng)成為現(xiàn)在大多數(shù)設(shè)計(jì)的常用輸出設(shè)備。在 FPGA 的設(shè)計(jì)中可以使用很少的資源,就產(chǎn)生 VGA 各種控制信號(hào)。這個(gè)示例在 RHicSP2200B FPGA 開(kāi)發(fā)板/學(xué)習(xí)板上使用 VGA 接口在顯示器上顯示了文字以及簡(jiǎn)單的圖形,可以作為VGA 顯示設(shè)計(jì)的參考,如果在使用這個(gè)例子的過(guò)程中有任何問(wèn)題都可以通過(guò)郵件
說(shuō)明:有效時(shí)間包括 6 列過(guò)掃描邊界列,有些時(shí)序表將這幾列加在后沿和前沿中
表 2 垂直時(shí)序
說(shuō)明:有效時(shí)間包括 4 行過(guò)掃描邊界行,有些時(shí)序表中將這幾行加在后沿和前沿中。
*當(dāng)有效時(shí)間增加時(shí),它超過(guò)了 vsync 信號(hào)的上升沿,因此前沿為-1
在實(shí)際設(shè)計(jì)中如何通過(guò)不同的系統(tǒng)頻率確定適當(dāng)?shù)娘@示模式 ? 例如在 RhicSP2200 開(kāi)發(fā)板中FPGA 的系統(tǒng)時(shí)鐘頻率為 50MHz。這個(gè)時(shí)鐘頻率可以用來(lái)設(shè)計(jì) 顯示 800X600 模式,為了顯示器顯示效果好,采用場(chǎng)頻(刷新頻率)75Hz,那么幀長(zhǎng)可以確定為 666,而行總長(zhǎng)設(shè)計(jì)為 1000 像素。
根據(jù)以上所述,我們可以設(shè)計(jì)如Examples1類似HDL代碼,使用這段代碼在Valid 有效期間對(duì)RGB 中 Blue 兩位賦值1,得到一個(gè)藍(lán)色屏幕顯示邊界如圖1 所示。
色彩原理
RGB 色彩模式是工業(yè)界的一種顏色標(biāo)準(zhǔn),是通過(guò)對(duì)紅(R)、綠(G)、藍(lán)(B)三個(gè)顏色 通道的變化以及它們相互之間的疊加來(lái)得到各式各樣的顏色的,RGB 即是代表紅、 綠、藍(lán)三個(gè)通道的顏色,通過(guò)三種基本顏色亮度值從 0~255 不同產(chǎn)生出其他各種顏色,這種模式叫加色模式。為什么叫加色模式呢,舉個(gè)例子,通常使用的電視屏幕和電腦 屏幕上的顯示就是這樣的模式,在沒(méi)有圖象時(shí),屏幕是黑的,若R,G,B 三色亮度都為255 時(shí)混合疊加打在屏幕上時(shí)則顯示成白色。就是加起來(lái)是白色的意思,叫加色模式。這個(gè)標(biāo)準(zhǔn)幾乎包括了人類視力所能感知的所有顏色,是目前運(yùn)用最廣的顏色系統(tǒng)之 一。
而與我們電腦相關(guān)的地方,就是目前的顯示器大都是采用了 RGB 顏色標(biāo)準(zhǔn),這就是為什么它對(duì)我們來(lái)說(shuō)這么重要了。
在顯示器上,是通過(guò)電子槍打在屏幕的紅、綠、藍(lán)三色發(fā)光極上來(lái)產(chǎn)生色彩的,目前的電腦一般都能顯示 32 位顏色,約有一百萬(wàn)種以上的顏色。如果說(shuō)它所顯示的顏色 還不能完全吻合自然界中的某種色彩的話,那已經(jīng)幾乎是我們?nèi)庋鬯荒芊洲q出來(lái)的了。
而 RhicSP2200 開(kāi)發(fā)板系統(tǒng)中每一個(gè)色 彩都是使 用 2bit 來(lái) 表示的,因 此可見(jiàn) RhicSP2200 系統(tǒng)可以出現(xiàn)64 種不同的顏 色。其他色彩的使用請(qǐng)?jiān)趯?shí)際工作中更多的加以體會(huì)。
顯示
通過(guò)以上的講述,已經(jīng)可以在計(jì)算機(jī)顯示器上顯示一個(gè)有顏色的區(qū)域了,在這個(gè)小節(jié)中我們?cè)倥e一個(gè)簡(jiǎn)單的例子,在顯示器中顯示兩個(gè)鑲嵌的正方形,字符等顯示與其類似,可以參考瑞芯科技其他設(shè)計(jì)示例。 例如我們可以在 xpos 與 ypos 的某一區(qū)間給 RGB 信號(hào)賦不同的值將得到如圖2 所示的顯示效果。
例子 1:使用 50MHz 時(shí)鐘頻率產(chǎn)生的 VGA 同步脈沖以及視頻有效信號(hào)
module sync_gen_50m(
rst_n,// synthesis attribute clock_buffer of rst_n is ibufg;
clk,
hsync,
vsync,
valid,
x_cnt,
y_cnt
);
input rst_n ;
input clk ;
output hsync ;
output vsync ;
output valid ;
output [9:0] x_cnt ;
output [9:0] y_cnt ;
reg hsync ;
reg vsync ;
reg valid ;
reg [9:0] x_cnt ;
reg [9:0] y_cnt ;
always @ ( posedge clk or negedge rst_n )
if ( !rst_n )
x_cnt = 10'd0;
else if ( x_cnt == 10'd1000 )
x_cnt = 10'd0;
else
x_cnt = x_cnt + 1'b1;
always @ ( posedge clk or negedge rst_n )
if ( !rst_n )
y_cnt = 10'd0;
else if ( y_cnt == 10'd665 )
y_cnt = 10'd0;
else if ( x_cnt == 10'd1000 )
y_cnt = y_cnt + 1'b1;
always @ ( posedge clk or negedge rst_n )
if ( !rst_n )
begin
hsync = 1'b0;
vsync = 1'b0;
end
else
begin
hsync = x_cnt = 10'd50;
vsync = y_cnt = 10'd6;
end
always @ ( posedge clk or negedge rst_n )
if ( !rst_n )
valid = 1'b0;
else
valid = ( ( x_cnt > 10'd180 ) ( x_cnt 10'd980)
( y_cnt > 10'd35) ( y_cnt 10'd635) );
endmodule
評(píng)論