• 正文
    • 01、VGA硬件接口介紹
    • 02、VGA接口時序及顯示原理
    • 03、VGA接口時序關(guān)鍵代碼編寫
    • 04、FPGA工程實現(xiàn)框架
    • 05、Modelsim軟件仿真與測試
    • 06、硬件測試與驗證
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

基于FPGA的VGA圖像顯示

2022/05/05
1894
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

引言:本文我們介紹利用FPGA實現(xiàn)VGA圖像顯示,主要介紹VGA硬件接口、VGA接口時序原理以及FPGA代碼實現(xiàn)VGA接口時序、仿真等內(nèi)容。

01、VGA硬件接口介紹

VGA(Video Graphics Array)視頻圖形陣列是IBM于1987年提出的一個使用模擬信號的電腦顯示標(biāo)準(zhǔn)。VGA接口即電腦采用VGA標(biāo)準(zhǔn)輸出數(shù)據(jù)的專用接口。VGA接口共有15針,分成3排,每排5個孔,顯卡上應(yīng)用最為廣泛的接口類型,絕大多數(shù)顯卡都帶有此種接口。它傳輸紅、綠、藍(lán)模擬信號以及同步信號(水平和垂直信號)。

圖1、VGA接口

管腳 信號 信號描述
1 RED 紅基色
2 GREEN 綠基色
3 BLUE 藍(lán)基色
4 ADDR_CODE 地址碼
5 RES 自測試(各家定義不同)
6 RED_GND 紅地
7 GREEN_GND 綠地
8 BLUE_GND 藍(lán)地
9 RES 保留(各家定義不同)
10 DIG_GND 數(shù)字地
11 ADDR_CODE 地址碼
12 ADDR_CODE 地址碼
13 HS 行同步信號
14 VS 場同步信號
15 ADDR_CODE 地址碼

常見的VGA分辨率如圖2所示。

圖2、常見的VGA分辨率

02、VGA接口時序及顯示原理

VGA顯示主要取決于R、G、B三基色,也即三原色。根據(jù)R、G、B位寬的不同,VGA顯示的效果也不同,常見有24bit(R/G/B各8bit)、16bit(R 5bit、G 6bit、B 6bit)、12bit(R/G/B各4bit)。

對于分辨率600×400@60Hz,該參數(shù)顯示的是VGA有效數(shù)據(jù)參數(shù),即VGA顯示刷新率60幀,每幀600×400個像素點。VGA接口實際傳輸?shù)臄?shù)據(jù)比此數(shù)值要大。

VGA顯示器逐行掃描原理:逐行掃描是掃描從屏幕左上角一點開始,從左至右逐點掃描,每掃描完一行,電子束回到屏幕的左邊下一行的起始位置。在這期間,CRT對電子束進行消隱,每行結(jié)束時,用行同步信號HS進行同步;當(dāng)掃描完所有的行,形成一幀,用場同步信號VS進行幀同步,并使掃描回到屏幕左上方,同時進行場消隱,開始下一幀。

從逐行掃描的原理中,我們可以了解,當(dāng)一行掃描完成后,切換到下一行時,需要行同步信號及行消隱時間;當(dāng)一幀掃描完成后,切換到下一幀時,需要場同步信號及場消隱時間,這樣就形成了VGA掃描時序,如圖3所示。

圖3、VGA行場時序圖

 

如圖3所示,Sync為同步信號,Back Porch為顯示后肩時間,Active Video為有效視頻,F(xiàn)ront Porch為顯示前肩時間。Sync+Back Porch+Active Video+Front Porch構(gòu)成一個完整行周期。

圖4、VGA圖像幀定義

 

圖4定義了一幀圖像的時序定義。圖中場信號的定義與行信號定義類似。行信號以像素點為單位,場信號以行為單位。VGA圖像時序的編寫即是對圖4中各個時序段進行定時。

03、VGA接口時序關(guān)鍵代碼編寫

下面以1920×1080@60Hz分辨率介紹VGA時序定義。在VESA表準(zhǔn)中給出了該分辨率的參數(shù)定義,如圖5所示。

圖5、1920×1080@60Hz分辨率圖像參數(shù)

 

在圖5中,需要注意藍(lán)色標(biāo)記的HS/VS信號極性,這在VESA標(biāo)準(zhǔn)中有規(guī)定要求,圖3只是給出了其中一種HS/VS信號極性,其他3種請參考VESA標(biāo)準(zhǔn)。

根據(jù)圖5所示,我們需要關(guān)注的參數(shù)如圖中各個顏色標(biāo)記所示。

`ifdef  VIDEO_1920_1080   //一幀圖像參數(shù)定義//行周期參數(shù)定義parameter  H_ACTIVE        = 1920;// 行數(shù)據(jù)有效像素點數(shù)parameter  H_FRONT_PORCH   = 88;  // 行消隱前肩像素點數(shù)parameter  H_SYNC_TIME     = 44;  // 行同步信號像素點數(shù)parameter  H_BACK_PORCH    = 148; // 行消隱后肩像素點數(shù) //場周期參數(shù)定義                parameter  V_ACTIVE        = 1080;// 場數(shù)據(jù)有效像素點數(shù)parameter  V_FRONT_PORCH   = 4;   // 場消隱前肩像素點數(shù)parameter  V_SYNC_TIME     = 5;   // 場同步信號像素點數(shù)parameter  V_BACK_PORCH    = 36;  // 場消隱后肩像素點數(shù)`endif

根據(jù)一幀圖像參數(shù)定義,進一步定義行、場掃描計數(shù)器,這兩個計數(shù)器可以用來產(chǎn)生HS行同步信號、VS場同步信號、圖像有效數(shù)據(jù)使能信號DE以及圖像有效數(shù)據(jù)坐標(biāo)。

parameter  H_TOTAL_TIME   = H_ACTIVE + H_FRONT_PORCH + H_SYNC_TIME + H_BACK_PORCH; parameter  V_TOTAL_TIME   = V_ACTIVE + V_FRONT_PORCH + V_SYNC_TIME + V_BACK_PORCH;
//行掃描計數(shù)器always@(posedge i_clk) begin  if(h_syn_cnt >= H_TOTAL_TIME-1)  h_syn_cnt <= 0;  else h_syn_cnt <= h_syn_cnt + 1;end
// 場掃描計數(shù)器always@(posedge i_clk) begin  if(h_syn_cnt >= H_TOTAL_TIME-1) begin        if(v_syn_cnt >= V_TOTAL_TIME-1)            v_syn_cnt <= 0;        else            v_syn_cnt <= v_syn_cnt + 1;  endend

HS行同步信號、VS場同步信號Verilog代碼。

// 行同步信號always@(posedge i_clk) begin    if(h_syn_cnt < H_SYNC_TIME)        o_hsyn <= 0;    else        o_hsyn <= 1;end
// 場同步信號always@(posedge i_clk) begin    if(v_syn_cnt < V_SYNC_TIME)        o_vsyn <= 0;    else        o_vsyn <= 1;end

圖像有效數(shù)據(jù)使能信號DE。

//有效數(shù)據(jù)使能信號DEalways@(posedge i_clk) begin    if(v_syn_cnt >= V_SYNC_TIME + V_BACK_PORCH && v_syn_cnt < V_SYNC_TIME + V_BACK_PORCH + V_ACTIVE)    begin        if(h_syn_cnt >= H_SYNC_TIME + H_BACK_PORCH && h_syn_cnt < H_SYNC_TIME + H_BACK_PORCH + H_ACTIVE)            o_en_pos <= 1;        else            o_en_pos <= 0;    end    else        o_en_pos <= 0;end

圖像有效數(shù)據(jù)坐標(biāo)產(chǎn)生x_pose、y_pose。

//x坐標(biāo)數(shù)據(jù)always@(posedge i_clk) begin    if(v_syn_cnt >= V_SYNC_TIME + V_BACK_PORCH && v_syn_cnt < V_SYNC_TIME + V_BACK_PORCH + V_ACTIVE)    begin        if(h_syn_cnt >= H_SYNC_TIME + H_BACK_PORCH && h_syn_cnt < H_SYNC_TIME + H_BACK_PORCH + H_ACTIVE)            o_x_pos <= h_syn_cnt - (H_SYNC_TIME + H_BACK_PORCH);        else            o_x_pos <= 0;    end    else        o_x_pos <= 0;end
//y坐標(biāo)數(shù)據(jù)always@(posedge i_clk) begin    if(v_syn_cnt >= V_SYNC_TIME + V_BACK_PORCH && v_syn_cnt < V_SYNC_TIME + V_BACK_PORCH + V_ACTIVE)        o_y_pos <= v_syn_cnt - (V_SYNC_TIME + V_BACK_PORCH);    else        o_y_pos <= 0;end

04、FPGA工程實現(xiàn)框架

FPGA實現(xiàn)VGA顯示功能框架如圖6所示。

圖6、FPGA實現(xiàn)VGA顯示功能框圖

 

如圖6所示,整個工程由四個模塊組成:PLL模塊、vga_timing_ctrl模塊、video_source模塊和hdmi_interface_dir模塊。由于實驗電路板上沒有VGA接口,因此采用HDMI接口實現(xiàn)最終圖像顯示。圖中video_source輸出的信號可以直接送入視頻DAC芯片,如ADV7123實現(xiàn)VGA圖像顯示。

PLL模塊:產(chǎn)生VGA圖像像素時鐘pixclk和pixclk_x5時鐘(HDMI接口串行時鐘);

vga_timing_ctrl模塊:實現(xiàn)VGA時序產(chǎn)生和控制;

video_source模塊:產(chǎn)生VGA圖像數(shù)據(jù);

hdmi_interface_dir模塊:實現(xiàn)HDMI接口驅(qū)動功能。

05、Modelsim軟件仿真與測試

編寫Testbench測試文件,功能仿真如圖7所示。

圖7、VGA時序Modelsim仿真

 

06、硬件測試與驗證

硬件平臺:XC7Z035FFG676-2

Vivado軟件:2017.4

工程編譯完成后,下載bit文件到電路板,測試結(jié)果如圖所示。

圖、VGA時序圖像顯示

歡迎關(guān)注FPGA技術(shù)實戰(zhàn)公眾號,喜歡就多多轉(zhuǎn)發(fā)吧!

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

專注FPGA技術(shù)開發(fā),涉及Intel FPGA、Xilinx FPGA技術(shù)開發(fā),開發(fā)環(huán)境使用,代碼風(fēng)格、時序收斂、器件架構(gòu)以及軟硬件項目實戰(zhàn)開發(fā),個人公眾號:FPGA技術(shù)實戰(zhàn)。