設(shè)計背景:
VGA(Video Graphics Array) 即視頻圖形陣列,是IBM于1987年隨PS/2機(jī)(PersonalSystem 2)一起推出的使用模擬信號的一種視頻傳輸標(biāo)準(zhǔn)。這個標(biāo)準(zhǔn)對于現(xiàn)今的個人電腦市場已經(jīng)十分過時。但在當(dāng)時具有分辨率高、顯示速率快、顏色豐富等優(yōu)點(diǎn),在彩色顯示器領(lǐng)域取得了廣泛的應(yīng)用,是眾多制造商所共同支持的一個低標(biāo)準(zhǔn)。
設(shè)計原理:
VGA的實(shí)體圖與接口示意圖,如下圖所示,它有15個針孔:
在開發(fā)板(ZX_1)中,VGA的電路原理圖如下圖所示:
通過原理圖,我們不難發(fā)現(xiàn),VGA需要我們控制的接口只有5個:
顯示器的掃描規(guī)律是什么?本設(shè)計采用逐行掃描,逐行掃描是掃描從屏幕左上角一點(diǎn)開始,從左向右逐點(diǎn)掃描,每掃描完一行,電子束回到屏幕的左邊下一行的起始位置,在這期間,CRT對電子束進(jìn)行消隱,每行結(jié)束時,用行同步信號進(jìn)行行同步;當(dāng)掃描完所有的行,形成一幀,用場同步信號進(jìn)行場同步,并使掃描回到屏幕左上方,同時進(jìn)行場消隱,開始下一幀。通過這種掃描規(guī)律,很容易看出,在設(shè)計兩個有效范圍計數(shù)器時,場同步信號計數(shù)器是以行同步信號計數(shù)器為周期的。
VGA的顯示標(biāo)準(zhǔn)如下表所示:
對于普通的VGA顯示器都要嚴(yán)格遵循“VGA工業(yè)標(biāo)準(zhǔn)”,否則可能會損害VGA顯示器,因此我們在設(shè)計時VGA控制器時,都需要參考顯示器的顯示標(biāo)準(zhǔn),下面是VGA的行掃描時序與場掃描時序:
行掃描時序:
場掃描時序:
根據(jù)上述顯示器的掃描參數(shù)以及掃描時序,例如800*600@60的顯示模式,60指得是顯示器圖像的刷新頻率,時鐘40MHz指得是一個像素輸出的頻率。800*600為VGA的分辨率,指有效顯示區(qū)域?yàn)闀r序中的c段只有800*600,也就是行計數(shù)在[216,1016],列計數(shù)在[27,627],在這個范圍內(nèi),給RGB色值才會有效。
在VGA 工業(yè)標(biāo)準(zhǔn)顯示模式要求:行同步、場同步都為負(fù)極性,即同步脈沖要求是負(fù)脈沖。行同步信號上電拉高,在行同步計數(shù)為0時拉低a個時鐘周期,即128,之后拉高,在行同步計數(shù)到1055時,行同步計數(shù)器清零,場同步計數(shù)器加1。在行掃描時序中,掃描計數(shù)時,周期就是一個像素點(diǎn)的時間。
場同步信號上電拉高,在場同步計數(shù)為0時拉低場同步a個時鐘周期,即4,之后拉高,在場同步計數(shù)到627時,場同步計數(shù)器清零。
在VGA控制器中,還需要控制三個接口,即三種基色(R、G、B),它們共專用8位,分別是Red為3位,Green為3位,Blue為3位,所以可以顯示256種顏色,RGB數(shù)據(jù)的格式如下表所示:
設(shè)計架構(gòu)圖:
本設(shè)計選擇的VGA顯示標(biāo)準(zhǔn)為800*600@60,實(shí)現(xiàn)點(diǎn)亮整個屏幕,并顯示為全紅。通過分析設(shè)計的功能,可以得到如下的頂層架構(gòu):
頂層模塊端口列表如下:
vga_pll模塊是為了滿足分辨率800*600@60的時鐘為40MHz,而ZX_1開發(fā)板的系統(tǒng)時鐘為50MHz,通過鎖相環(huán),將50MHz轉(zhuǎn)化為40MHz。vga_control模塊是為了設(shè)定行場同步信號,并標(biāo)定出有效顯示區(qū)域,并輸出控制顏色的po_rgb信號。為了便于移植,根據(jù)800*600@60分辨率下的參數(shù),對其進(jìn)行參數(shù)化定義。
設(shè)計代碼:
VGA控制器代碼:
0modulevga_control (pi_clk,pi_rst_n,po_hs,po_vs,po_rgb);
1
2inputpi_clk,pi_rst_n;//系統(tǒng)時鐘復(fù)位
3outputregpo_vs;//VGA場同步信號
4outputregpo_hs;//VGA行同步信號
5output[7:0]po_rgb;//VGA場紅綠藍(lán)三基色
6
7//----------------VGA時序-----------------------------------
8// 顯示模式 時鐘
9// 800*600@60 40MHz
10//行/場 同步(a) 消隱后沿(b) 有效顯示(c) 消隱前沿(d) 掃描時間(e)
11//hs 128 88 800 40 1056
12//vs 4 23 600 1 628
13
14// 行(Horizontal)掃描 Parameter (像素)
15parameterH_A =128;
16parameterH_B =80;
17parameterH_C =800;
18parameterH_D =40;
19parameterH_E =1056;
20
21
22// 場(Vertical)掃描 Parameter (行數(shù))
23parameterV_A =4;
24parameterV_B =23;
25parameterV_C =600;
26parameterV_D =1;
27parameterV_E =628;
28
29//行掃描計數(shù)器,
30reg[10:0]hcnt;
31
32always@(posedgepi_clk ornegedgepi_rst_n)
33begin
34if(!pi_rst_n)
35hcnt <=11'd0;
36else
37begin
38if(hcnt ==(H_E -1'b1))//掃描完一行像素
39hcnt <=11'd0;
40else
41hcnt <=hcnt +1'b1;
42end
43end
44
45//場掃描計數(shù)器
46reg[10:0]vcnt;
47
48always@(posedgepi_clk ornegedgepi_rst_n)
49begin
50if(!pi_rst_n)
51vcnt <=11'd0;
52elseif(vcnt ==(V_E -1'b1))
53vcnt <=11'd0;
54elseif(hcnt ==(H_E -1'b1))
55vcnt <=vcnt +1;
56end
57
58//行同步輸出
59always@(posedgepi_clk ornegedgepi_rst_n)
60begin
61if(!pi_rst_n)
62po_hs <=1'b1;
63elseif(hcnt <H_A)
64po_hs <=1'b0;
65else
66po_hs <=1'b1;
67end
68
69//assign po_hs = (hcnt <= H_A - 1'b1) ? 1'b0 : 1'b1;
70
71//場同步輸出
72always@(posedgepi_clk ornegedgepi_rst_n)
73begin
74if(!pi_rst_n)
75po_vs <=1'b1;
76elseif(vcnt <V_A)
77po_vs <=1'b0;
78else
79po_vs <=1'b1;
80end
81
82//assign po_vs = (vcnt <= V_A - 1'b1) ? 1'b0 : 1'b1;
83
84wirergb_en;
85
86assignrgb_en =(hcnt >=H_A +H_B &&hcnt <H_A +H_B +H_C)&&
87(vcnt >=V_A +V_B &&vcnt <V_A +V_B +V_C)?1'b1:1'b0;
88
89assignpo_rgb =rgb_en ?8'b111_000_00:8'b0000_0000;
90
91endmodule
頂層文件如下所示:
0modulevga_display_pure (pi_clk,pi_rst_n,po_hs,po_vs,po_rgb);
1
2inputpi_clk,pi_rst_n;//系統(tǒng)時鐘復(fù)位
3outputpo_vs;//VGA場同步信號
4outputpo_hs;//VGA行同步信號
5output[7:0]po_rgb;//VGA場紅綠藍(lán)三基色
6
7//----------------VGA時序-----------------------------------
8// 顯示模式 時鐘
9// 800*600@60 40MHz
10//行/場 同步(a) 消隱后沿(b) 有效顯示(c) 消隱前沿(d) 掃描時間(e)
11//hs 128 88 800 40 1056
12//vs 4 23 600 1 628
13
14wirevga_clk;
15
16vga_pll vga_pll_dut(
17.areset(~pi_rst_n),
18.inclk0(pi_clk),
19.c0(vga_clk)
20);
21
22vga_control vga_control_dut(
23.pi_clk(vga_clk),
24.pi_rst_n(pi_rst_n),
25.po_hs(po_hs),
26.po_vs(po_vs),
27.po_rgb(po_rgb)
28);
29
30endmodule
通過編譯后生成的RTL視圖如下:
為了驗(yàn)證本設(shè)計的邏輯正確性,我們先對其進(jìn)行了仿真,在仿真時,為了減少仿真的時間,先將行、場掃描的對應(yīng)參數(shù),進(jìn)行了縮放,這樣不僅節(jié)約了仿真時間,同時由于掃描數(shù)據(jù)量變少,更加便于分析觀察。其仿真代碼所示;
0`timescale1ns/1ps//仿真時間精度時間單位
1
2modulevga_display_pure_tb;
3
4regpi_clk,pi_rst_n;//系統(tǒng)時鐘復(fù)位
5wirepo_vs;//VGA場同步信號
6wirepo_hs;//VGA行同步信號
7wire[7:0]po_rgb;//VGA場紅綠藍(lán)三基色
8
9//初始化數(shù)據(jù),并附相應(yīng)初值
10initialbegin
11pi_clk =0;
12pi_rst_n =0;
13#200.1pi_rst_n =1;
14
15end
16
17vga_display_pure vga_display_pure_inst (
18.pi_clk(pi_clk),
19.pi_rst_n(pi_rst_n),
20.po_hs(po_hs),
21.po_vs(po_vs),
22.po_rgb(po_rgb)
23);
24
25always#10pi_clk =~pi_clk;//50MHz時鐘描述
26
27endmodule
仿真圖:
rgb_en信號,只有當(dāng)po_vs和po_hs同時為高電平時,才有效,并且有po_rgb Red基色信號輸出,時序仿真細(xì)節(jié)圖如下所示:
-
crt
+關(guān)注
關(guān)注
2文章
81瀏覽量
35932 -
VGA
+關(guān)注
關(guān)注
5文章
536瀏覽量
63059 -
Green
+關(guān)注
關(guān)注
0文章
30瀏覽量
8299
原文標(biāo)題:FPGA學(xué)習(xí)系列:30. VGA驅(qū)動設(shè)計
文章出處:【微信號:FPGAer_Club,微信公眾號:FPGAer俱樂部】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論