什么是VGA:
VGA, Video Graphics Array。即視頻圖形陣列,具有分辨率高、顯示速率快、顏色豐富等優點。VGA接口不但是CRT顯示設備的標準接口,同樣也是LCD液晶顯示設備的標準接口,具有廣泛的應用范圍。在FGPA中,常廣泛用于圖像處理等領域。
VGA 顯示器成像原理
在 VGA 標準剛興起的時候,常見的 VGA 接口彩色顯示器一般基于 CRT(陰極射線管) 實現,色彩由 RGB 三基色組成,顯示是用逐行掃描的方式。下圖為基于 CRT 的顯示器實物圖。
陰極射線槍發出的電子束打在涂有熒光粉的熒光屏上,產生 RGB 三基色,合成一個彩 色像素,掃描從屏幕的左上方開始,從左到右,從上到下進行掃描,每掃完一行,電子束都 回到屏幕的下一行左邊的起始位置。
在回掃的過程中,電子槍不能發射電子,否則會影響熒光屏上既有圖像的顏色,所以 回掃期間,需要進行行消隱,簡單來說就是關閉電子槍。每行結束時,用行同步信號進行行 同步,圖中從右上方向左下方的斜向虛線就是其回行掃示意圖。
當整個屏幕的所有行都掃描完后,使用場同步信號進行場同步,并使掃描回到屏幕的 左上方。同樣的,為了避免電子槍在回到左上方的過程中發出的電子破壞熒光屏上既有的圖 像內容,這個回掃的過程也需要關閉電子槍,即場消隱。
隨著顯示技術的發展,出現了液晶顯示器,液晶顯示器讓顯示設備徹底擺脫了厚重的 機身,也為便攜式計算機的出現創造了可能。
液晶顯示器的成像原理與 CRT 不同。液晶顯示器是通過改變對液晶像素點單元施加電 壓的電壓大小,來改變液晶單元的透光性。在液晶單元背后發射白光,并添加三色濾光片, 分別使 R、G、B 這 3 種光線透過濾光片,最后通過 3 個像素點合成一個彩色像素點,從而 實現彩色顯示。
由于液晶技術晚于 CRT 顯示技術誕生,在液晶顯示器出現的時候,計算機顯示接口已 經確定,很難再突然改變。所以為了能夠兼容傳統的顯示接口,液晶顯示器通過內部電路實 現了對 VGA 接口的完全兼容。因此,在使用顯示器時,只要該顯示器帶有標準的 VGA 接口, 就不用去關注其成像原理,直接使用標準的 VGA 時序即可驅動。
當使用 VGA 接口傳輸圖像時,顯示驅動芯片(如顯卡)輸出的 RGB 數據先要經過 DAC 轉換為 3 路分別代表 R、G、B 顏色分量的模擬信號,送到 VGA 接口,這些模擬信號經由 VGA 線纜到達顯示器的 VGA 接口,對于模擬的 CRT 顯示器,這些信號會直接被放大后用于驅動 電子槍發射電子,而對于液晶顯示器,則需要顯示器使用專門的模擬數字轉換芯片將模擬信 號再轉換為數字信號后,去驅動 RGB 接口的液晶顯示屏顯示圖像。
VGA 時序
CRT 行掃描過程
對于 CRT 顯示器,雖然掃描的時候是按照一行一行的方式進行的,但不是掃描完一行 有效數據段之后就立馬返回,而是會繼續向右掃描一段區域,這個區域稱為右邊界區域 (horizontal right border),該區域已經不在有效的顯示范圍內,如果從物理結構的角度來說, 這一段對應的熒光屏玻璃上就不再有熒光粉了,但是電子槍還在繼續向右走,可以形象理解為顯示器右邊的黑邊。同樣的,顯示器左邊也有這樣一段黑邊,在開始顯示有效數據之 前,電子槍掃描到的這段區域同樣也是沒有熒光粉的,不會顯示圖像, 這個區域稱為左邊界區域(horizontal left border)。
那么,電子槍什么時候會到最左側準備開始新一行圖像的掃描呢?當電子槍掃描一行 圖像到達熒光屏的最右端后,其并不會自動回到最左邊準備下一行,而是需要有一個通知信 號,通知其回去,這個通知信號就是行同步信號脈沖(horizontal sync pulse)。行同步信號是 一個脈沖,當該脈沖出現后,電子槍的指向會在一定時間內從最右側回到顯示屏的最左側。 而這個回去的過程需要耗費一定的時間,這個時間就稱為 horizontal back porch。這也是這個名詞中 back 的意義所在,即出現行同步信號后,電子槍從顯示屏最右側回到最左側的時間。?
當電子槍掃描過了右側沒有熒光粉的區域后,還沒有收到回到最左側的命令(行同步信號脈沖)之前,電子槍需要關閉以實現消隱,這個消隱的時間段就稱為 horizontal front porch, 直觀一點理解就是完成了一行圖像的掃描,但還沒收到回到最左側命令之前的一段時間。這也是這個名詞中 front 的意義所在。
CRT 場掃描過程
一幅完整的圖像可以看作是多行圖像平鋪構成的,所以理解了行掃描的過程中每個時間段對應的時間參數名稱之后,再來理解場掃描中的名詞就非常簡單了。
首先來講,CRT 在掃描一行圖像的時候,電子槍的水平位置是保持穩定不變的,而當一 行圖像掃描完成,開始掃描下一行圖像的時候,電子槍的水平位置會向下調整一定的值。因此,我們可以認為,場時序就是在垂直方向上從上往下依次掃描。
其次來說,對于 CRT 顯示器來說,其不是掃描完所有行的圖像后就立馬返回最上方, 而是會繼續向下掃描一段區域,這個區域稱為下邊界區域(vertical bottom border),該區域 已經不在有效的顯示范圍內,如果從物理結構的角度來說,這一段對應的熒光屏玻璃上就不 再有熒光粉了,但是電子槍還在繼續向下走,大家可以形象理解為顯示器下邊的黑邊。同樣 的,顯示器上邊也有這樣一段黑邊,在開始顯示有效數據之前,電子槍掃描到的這段區域同 樣也是沒有熒光粉的,不會顯示圖像, 這個區域稱為上邊界區域(vertical top border)。
再來說說,電子槍什么時候會到最上方準備開始新一場圖像的掃描。當電子槍掃描一場圖像到達熒光屏的最下方后,其并不會自動回到最上邊準備下一場,而是需要有一個通知 信號,通知其回去,這個通知信號就是場同步信號脈沖(vertical sync pulse)。場同步信號是 一個脈沖,當該脈沖出現后,電子槍的指向會在一定時間內從最下方回到顯示屏的最上方。 而這個回去的過程需要耗費一定的時間,這個時間就稱為 vertical back porch。即出現場同步信號后,電子槍從顯示屏最下方回到最上方的時間。
當電子槍掃描過了下方沒有熒光粉的區域后,還沒有收到回到最上方的命令(場同步信號脈沖)之前,電子槍需要關閉以實現消隱,這個消隱的時間段就稱為 vertical front porch, 直觀一點理解就是完成了一場圖像的掃描,但還沒收到回到最上方命令之前的一段時間。、
行掃描時序圖?
場掃描時序圖
上述兩幅圖中,都只給出了時序參數的名稱,并沒有給出每個參數具體的值是多少。 而每個參數具體的值是多少,并不是固定的,而是根據需要掃描的有效圖像區域的大小確定 的。需要掃描的有效圖像區域的大小,一般用分辨率來表示。
?下表給出了若干個常見分辨率對應的行場時序中各個參數的具體數值,注意,這些參 數值中,行相關的參數都是以像素的更新頻率,也就是像素時鐘作為單位,而場相關的參數, 則是以行作為單位。
分析
以800x480為例? 行同步信號分析
場同步信號分析
編寫邏輯代碼:
`timescale 1ns / 1ps
//800x480
//H_Right_Borde = 0 V_Bottom_Bord = 8
//H_Front_Porch = 40 V_Front_Porch = 2
//H_Sync_Time = 128 V_Sync_Time = 2
//H_Back_Porch = 88 V_Back_Porch = 25
//H_Left_Border = 0 V_Top_Border = 8
//H_Data_Time = 800 V_Data_Time = 480
//H_Total_Time = 1056 V_Total_Time = 525module VGA_CTRL(Clk_33M ,Reset_n ,Data_in ,hcount , //行掃描位置(顯示圖像行掃描地址)vcount , //場掃描位置(顯示圖像場掃描地址)VGA_HS , //行同步信號VGA_VS , //場同步信號VGA_BLK , //有效數據輸出 VGA_CLK , VGA_DATA //紅綠藍三色 分別8位量化 R[7:0]G[7:0]B[7:0] );input Clk_33M;input Reset_n;input [23:0] Data_in;output [10:0] hcount;output [10:0] vcount;output VGA_HS;output VGA_VS;output VGA_BLK;output VGA_CLK;output [23:0] VGA_DATA; //紅綠藍三色 分別8位量化 R[7:0]G[7:0]B[7:0] parameter VGA_HS_end = 11'd127 ,hdat_begin = 11'd216 ,hdat_end = 11'd1016 ,hpixel_end = 11'd1055 ,VGA_VS_end = 11'd1 , vdat_begin = 11'd35 ,vdat_end = 11'd515 ,vline_end = 11'd524 ;reg [10:0] hcount_r;reg [10:0] vcount_r;always@(posedge Clk_33M or negedge Reset_n)if(!Reset_n)hcount_r <= 0; else if(hcount_r == hpixel_end )hcount_r <= 0;elsehcount_r <= hcount_r + 1'b1;always@(posedge Clk_33M or negedge Reset_n)if(!Reset_n)vcount_r <= 0; else if(hcount_r == hpixel_end) if(vcount_r == vline_end )vcount_r <= 0;elsevcount_r <= vcount_r + 1'b1;elsevcount_r <= vcount_r;assign VGA_BLK = ((hcount_r >= hdat_begin) && (hcount_r < hdat_end)&&(vcount_r >= vdat_begin) && (vcount_r < vdat_end)) ? 1'b1 : 1'b0; assign hcount = VGA_BLK ? (hcount_r - hdat_begin) : 10'd0; assign vcount = VGA_BLK ? (vcount_r - vdat_begin) : 10'd0; assign VGA_HS = (hcount_r > VGA_HS_end)? 1'b1 :1'b0; assign VGA_VS = (vcount_r > VGA_VS_end)? 1'b1 :1'b0; assign VGA_DATA = (VGA_BLK) ? Data_in : 24'h000000;assign VGA_CLK = ~Clk_33M;
endmodule
編寫測試程序:
`timescale 1ns / 1ps
module VGA_CTRL_tb;reg Clk_33M;reg Reset_n;reg [23:0] Data_in;wire [10:0] hcount;wire [10:0] vcount;wire VGA_HS;wire VGA_VS;wire VGA_BLK;wire VGA_CLK;wire [23:0] VGA_DATA; //紅綠藍三色 分別8位量化 R[7:0]G[7:0]B[7:0] VGA_CTRL VGA_CTRL(.Clk_33M (Clk_33M ) ,.Reset_n (Reset_n ) ,.Data_in (Data_in ) ,.hcount (hcount ) , //行掃描位置(顯示圖像行掃描地址).vcount (vcount ) , //場掃描位置(顯示圖像場掃描地址).VGA_HS (VGA_HS ) , //行同步信號.VGA_VS (VGA_VS ) , //場同步信號.VGA_BLK (VGA_BLK ) , //有效數據輸出 .VGA_CLK (VGA_CLK ) , .VGA_DATA (VGA_DATA) //紅綠藍三色 分別8位量化 R[7:0]G[7:0]B[7:0] );initial Clk_33M = 1;always #15 Clk_33M = ~ Clk_33M;initial beginReset_n = 0;#201;Reset_n = 1;#200000000;$stop; endalways@(posedge Clk_33M or negedge Reset_n)if(!Reset_n)Data_in <= 1'b0;else if(!VGA_BLK)Data_in <= Data_in;elseData_in <= Data_in + 1'b1;
endmodule
仿真波形:
第一行開始時波形:
第一行結束時波形:
具體分析波形還需要從行同步脈沖時間,場同步脈沖時間,行消隱時間,場消隱時間,行數據傳輸時間,場數據傳輸結束時間等等,分析波形驗證邏輯代碼的正確性。