明德扬手把手教你设计VGA显示颜色
VGA顯示顏色
一、項目背景
VGA介紹
VGA(Video Graphics Array)即視頻圖形陣列,是IBM在1987年隨PS/2(PS/2 原是“Personal System 2”的意思,“個人系統2”,是IBM公司在1987年推出的一種個人電腦。PS/2電腦上使用的鍵盤鼠標接口就是現在的PS/2接口。因為標準不開放,PS/2電腦在市場中失敗了。只有PS/2接口一直沿用到今天)一起推出的使用模擬信號的一種視頻傳輸標準,在當時具有分辨率高、顯示速率快、顏色豐富等優點,在彩色顯示器領域得到了廣泛的應用。這個標準對于現今的個人電腦市場已經十分過時。即使如此,VGA仍然是最多制造商所共同支持的一個標準,個人電腦在加載自己的獨特驅動程序之前,都必須支持VGA的標準。例如,微軟Windows系列產品的開機畫面仍然使用VGA顯示模式,這也說明其在顯示標準中的重要性和兼容性。
VGA技術的應用還主要基于VGA顯示卡的計算機、筆記本等設備。對于一些嵌入式VGA顯示系統,可以在不使用VGA顯示卡和計算機的情況下,實現VGA圖像的顯示和控制。系統具有成本低、結構簡單、應用靈活的優點,可廣泛應用于超市、車站、飛機場等公共場所的廣告宣傳和提示信息顯示,也可應用于工廠車間生產過程中的操作信息顯示,還能以多媒體形式應用于日常生活。
VGA管腳
VGA接口是一種D型接口,采用非對稱分布的15pin 連接方式,共有15針,分成3排,每排5個孔,是顯卡上應用最為廣泛的接口類型,絕大多數顯卡都帶有此種接口。它傳輸紅、綠、藍模擬信號以及同步信號(水平和垂直信號)。
tica">一般在VGA接頭上,會1,5,6,10,11,15等標明每個接口編號。如果沒有,如上圖所示編號。
VGA接口15根針,其對應接口定義如下:
1.紅基色 red
2.綠基色 green
3.藍基色 blue
4.地址碼 ID Bit(也有部分是RES,或者為ID2顯示器標示位2)
5.自測試 ( 各家定義不同 )(一般為GND)
6.紅地
7.綠地
8.藍地
9.保留 ( 各家定義不同 )
10. 數字地
11.地址碼(ID0顯示器標示位0)
12.地址碼(ID1顯示器標示位1)
13.行同步
14.場同步
15.地址碼 ( ID3或顯示器標示位3 )
對于FPGA邏輯設計來說,我們關注的信號是紅基色、綠基色、藍基色、行同步和場同步信號。其他信號都是原理圖和PCB設計時關注。
通過控制紅基色、綠基色、藍基色、行同步和場同步信號這5個接口,就能讓顯示器顯示豐富的色彩,顯示各種視頻圖像。
VGA色彩原理
在中學的物理課中我們可能做過棱鏡的試驗,白光通過棱鏡后被分解成多種顏色逐漸過渡的色譜,色依次為紅、橙、黃、綠、青、藍、紫,這就是可見光譜。其中人眼對紅、綠、藍最為敏感,人的眼睛就像一個三色接收器的體系,大多數的顏色可以通過紅、綠、藍三色按照不同的比例合成產生。同樣絕大多數單色光也可以分解成紅綠藍三種色光。這是色度學的最基本原理,即三基色原理。三種基色是相互獨立的,任何一種基色都不能由其它兩種顏色合成。紅綠藍是三基色,這三種顏色合成的顏色范圍最為廣泛。紅綠藍三基色按照不同的比例相加合成混色稱為相加混色。
三基色混色原理示意圖如下圖所示:
三基色顏色編碼:
顏色 黑 藍 紅 紫 綠 青 黃 白
R 0 0 1 1 0 0 1 1
G 0 0 0 0 1 1 1 1
B 0 1 0 1 0 1 0 1
以上RBG一共有8組合,也就是可以產生8種顏色。但顯示器顯示的色彩卻是非常豐富,遠遠多于8種顏色,這是如何做到的呢?
原因就是對于顯示器來說,RGB三個信號其實是模擬信號,其電壓的高低,可以表示顏色的深淺。利用這個原理,我們就可以產生豐富的色彩。例如,如果R=3.3V,G=0V,B=0V,則顯示器會顯示非常鮮艷的紅色。如果G和B仍然是0V,而R改為1.8V,則顯示器會顯示比較淺的紅色。R、G、B的電壓范圍從0~3.3V,任意組合就可以表示非常多的顏色了。
顯示器掃描方式
通過控制紅綠藍三基色,就可以控制1個像素的顏色。一幅圖像是由非常多的像素組成的。例如640*480分辨率的圖像,是由一行640個、一共480行,這么多像素組合起來顯示的圖像。為了讓顯示器顯示這么一幅圖像,那么就要控制顯示器的掃描槍一個一個像素地將顏色顯示起來。像素變化的時間非常快,從而使人眼誤認為所有像素是一起顯示的。
下面是CRT 顯示器的控制框圖:
顯示器采用光柵掃描方式,即轟擊熒光屏的電子束在CRT屏幕上從左到右(受水平同步信號HSYNC控制)、從上到下(受垂直同步信號VSYNC控制)做有規律的移動。電子束采用光柵掃描方式,從屏幕左上角一點開始,向右逐點進行掃描,形成一條水平線;到達最右端后,又回到下一條水平線的左端,重復上面的過程;當電子束完成右下角一點的掃描后,形成一幀。此后,電子束又回到左上方起點,開始下一幀的掃描。這種方法也就是常說的逐行掃描顯示。
VGA時序
行同步信號的時序如上圖。行同步信號周期性地產生高低電平,其一共可分成4個階段:同步脈沖a、顯示后沿b、顯示區域c和顯示前沿d。同步脈沖a表示著一行的結束,同時也是下一行的開始。顯示時序c是真正圖像顯示的區域,在此階段,像素逐個顯示出來,也就是說在此階段,我們要控制紅、綠、藍三基色信號,輸出對應像素的RGB值。在顯示后沿b和顯示前沿d這兩個階段,是消隱時刻,此時紅、綠、藍三基色信號都要求為0。
場同步信號的時序與行同步信號相似,如下圖。
場同步信號也是周期性地產生高低電平,其一共可分成4個階段:同步脈沖a、顯示后沿b、顯示區域c和顯示前沿d。但注意的是,場同步信號的變化單位是“一行”。例如,一個“場同步脈沖”時間包含多個“行脈沖周期”。
針對容易出錯的理解,這里再次強調一下VGA時序
看時序的時候,不僅要關注其變化點,還要關注持續的時間。在行場同步的四個階段,其時間分別是多少呢?下面是常見分辨率的參數。
分辨率 行/列 同步脈沖 顯示后沿 顯示區域 顯示前沿 幀長 單位
640480
/60Hz 行 96 48 640 16 800 基準時鐘
列 2 33 480 10 525 行
800600
/72Hz 行 120 64 800 56 1040 基準時鐘
列 6 23 600 37 666 行
800600
/60Hz 行 128 88 800 40 1056 基準時鐘
列 4 23 600 1 628 行
1024768
/60Hz 行 136 160 1024 24 1344 基準時鐘
列 6 29 768 3 806 行
以640480/60Hz為例,640480/60Hz是指刷新頻率為60Hz,分辨率為640X480。這個是標準VGA顯示驅動。
刷新頻率為60 Hz,是指1秒顯示60幅圖像。
從表中可以看出,該分辨率行同步信號,同步脈沖是96個基準時鐘,顯示后沿是48個基準時鐘,顯示區域是640個基準時鐘,顯示前沿是16個基準時鐘,那么一行一共有800個基準時鐘。
該分辨率場同步信號,同步脈沖是2行(2800個基準時鐘),顯示后沿是33行(33800個基準時鐘),顯示區域為480行(480800個基準時鐘),顯示前沿為10行(10800個基準時鐘),一共有525行(525800個基準時鐘)。
基準時鐘是多少呢?由于1秒顯示60幅圖像,所以一幅圖像顯示的時間是1/60秒。一幅圖像占用了525800個基準時鐘,所以基準時鐘周期 = (1/60)/(525*800)秒,約為39.6825ns。那么基準時鐘周期就約為25.175 MHz,實驗中我們取25M。
明德揚VGA原理圖
FPGA是數字芯片,管腳輸出的都是0和1的數字信號,只有高電平和低電平。為了控制RGB電壓的高低,我們就必須用到數轉換DA芯片。可以用數字信號控制數模轉換芯片的輸入端,從而讓其輸出不同幅度的電壓值。
例如下圖中,FPGA產生RGB三種信號,這時RGB都是多位的數字信號,這些信號將給DA芯片,DA會根據這個數字信號產生不同電壓的模擬信號rgb。模擬信號rgb再連到顯示器上,就可以顯示豐富的顏色了。
在這里,讀者只要記住,FPGA可以通過數字信號控制DA芯片,DA芯片就可以產生不同電平。關于DA芯片的介紹,可以參考本書的DA轉換一章內容。
明德揚的教學板,VGA接口的原理圖如下。
行同步管腳連到信號VGA_HSYNC,場同步信號連到信號VGA_VSYNC,紅基管腳連到VGA_RED,藍基管腳連到信號VGA_BLUE,綠基管腳連到信號VGA_GREEN。
再看VGA_HSYNC和VGA_VSYNC信號,另一端連到FPGA的C20和D20管腳上。
換句話說,就是FPGA控制管腳C20和D20的輸出,就能控制VGA接口的行場同步了。
再來看VGA_RED、VGA_BLUE和VGA_GREEN信號,其原理圖
由圖可見,VGA_RED是VGA_R0VGA_R4與電阻并聯產生的,VGA_GREEN是VGA_G0VGA_G5與電阻并聯產生,VGA_BLUE是VGA_B0VGA_B4與電阻并聯產生。而VGA_R0VGA_R4、VGA_G0VGA_G5、VGA_B0VGA_B4是連接到FPGA管腳的數字信號,每個信號都只有0V和3.3V兩種可能。那么FPGA通過控制這些信號,也就控制了VGA的紅基、綠基和藍基管腳的電壓。教學板使用了電阻網絡代替了DA芯片。
以VGA_RED的電壓受VGA_R0~VGA_R4的值產生為例
VGA_RED電壓 = (VGA_R0/2 + VGA_R1/4 + VGA_R2/8 + VGA_R3/16 + VGA_R4/32)*3.3V。
VGA_GREEN電壓 = (VGA_G0/2 + VGA_G1/4 + VGA_G2/8 + VGA_G3/16 + VGA_G4/32+VGA_G5/64)*3.3V。
VGA_BLUE電壓 = (VGA_B0/2 + VGA_B1/4 + VGA_B2/8 + VGA_B3/16 + VGA_B4/32)*3.3V。
電阻網絡轉換后
信號線 信號線 FPGA管腳
VGA_RED VGA_R4 E11
VGA_R3 C10
VGA_R2 D10
VGA_R1 E9
VGA_R0 E10
VGA_GREEN VGA_G5 D15
VGA_G4 C17
VGA_G3 C19
VGA_G2 E12
VGA_G1 C13
VGA_G0 E15
VGA_BLUE VGA_B4 D13
VGA_B3 E13
VGA_B2 D17
VGA_B1 E16
VGA_B0 C15
VGA_HSYNC VGA_HSYNC C20
VGA_VSYNC VGA_VSYNC D20
本教材使用的顏色 VGA_R4~R0 VGA_G5~G0 VGA_B4~B0
白色 5’b11111 6’b111111 5’b11111
黑色 5’b0 6’b0 5’b0
藍色 5’b0 6’b0 5’b11111
綠色 5’b0 6’b111111 5’b0
紅色 5’b11111 6’b0 5’b0
二、設計目標
通過VGA連接線,將顯示器和教學板的VGA接口相連。連接示意圖如下。
然后FPGA產生640480分辨率,刷新頻率為60Hz的VGA時序,讓顯示器產生顯示一幅完整的紅色圖像,即下表中的第一種參數。提示:顯示器一般都會自適應功能,無須設置就能識別不同分辨率的圖像。
分辨率 行/列 同步脈沖 顯示后沿 顯示區域 顯示前沿 幀長 單位
640480
/60Hz 行 96 48 640 16 800 基準時鐘
列 2 33 480 10 525 行
800600
/72Hz 行 120 64 800 56 1040 基準時鐘
列 6 23 600 37 666 行
800600
/60Hz 行 128 88 800 40 1056 基準時鐘
列 4 23 600 1 628 行
1024*768
/60Hz 行 136 160 1024 24 1344 基準時鐘
列 6 29 768 3 806 行
其中,行的單位為“基準時鐘”,即頻率為25MHz、周期為40ns的時鐘,注意列的單位為“行”。
上板效果圖如下圖所示,注意,不同顯示器會有差別。
上板的演示視頻,請登陸網址查看:www.mdy-edu.com/xxxx。
三、模塊設計
架構設計
我們要實現的功能,概括起來就是FPGA產生VGA時序,即控制VGA_R4R0、VGA_G5G0、VGA_B4B0、VGA_HSYNC和VGA_VSYNC,讓顯示器顯示紅色。其中,VGA_HSYNC和VGA_VSYNC,FPGA可根據時序產生高低電平。而顏色數據,由于是固定的紅色,FPGA也能自己產生,不需要外部輸入圖像的數據。那么我們的FPGA工程,可以定義輸出信號hys表示行同步,用輸出信號vys表示場同步,定義一個16位的信號lcd_rgb,其中lcd_rgb[15:11]表示VGA_R40,、lcd_rgb[10:5]表示VGA_G50,、lcd_rgb[4:0]表示VGA_B40。
我們還需要時鐘信號和復位信號來進行工程控制。
綜上所述,我們這個工程需要五個信號,時鐘clk,復位rst_n,場同步信號vys、行同步信號hys和RGB輸出信號lcd_rgb。
需要注意的是,輸入進來的時鐘clk是50MHz,而從分辨率參數表可知道,行單位的基準時鐘是25 MHz。為此我們需要根據50MHz來產生一個25 MHz的時鐘,然后再用于產生VGA時序。
為了得到這個25M時鐘,我們需要一個PLL。PLL可以認為是FPGA內的一個硬核,它的功能是根據輸入的時鐘,產生一個或多個倍頻和分頻后的輸出時鐘,同時可以調整這些輸出時鐘的相位、占空比等。
例如,輸入進來是50M時鐘,如果我需要一個100M時鐘,那么從邏輯上、代碼上是不可能產生的,我們就必須用到PLL來產生了。
整個工程的結構圖如下。
PLL的生成方式過程,請看本案例的綜合工程和上板一節的內容。
VGA驅動模塊設計
我們先分析功能。要控制顯示器,讓其產生紅色,也就是讓FPGA控制VGA_R04、VGA_G05、VGA_B04、VGA_VSYNC和VGA_HSYNC信號。那么VGA驅動模塊,可以定義輸出信號hys表示行同步,用輸出信號vys表示場同步,定義一個16位的信號lcd_rgb,其中lcd_rgb[15:11]表示VGA_R40,、lcd_rgb[10:5]表示VGA_G50,、lcd_rgb[4:0]表示VGA_B40。
同時該模塊的工作時鐘為25M,同時需要一個復位信號。
綜上所述,我們這個模塊需要五個信號,25M時鐘clk,復位rst_n,場同步信號vys、行同步信號hys和RGB輸出信號lcd_rgb。
我們先設計場同步信號hys,VGA時序中的場同步信號,其時序圖如下:
hys就是一個周期性地高低變化的脈沖。我們使用的是下表中的第一種分辨率,也就是同步脈沖a的時間是96個時鐘周期,而顯示后沿b是48個時鐘周期,顯示時序c是640個時鐘周期,顯示前沿是16個時鐘周期,一共是800個時鐘周期。
分辨率 行/列 同步脈沖 顯示后沿 顯示區域 顯示前沿 幀長 單位
640480
/60Hz 行 96 48 640 16 800 基準時鐘
列 2 33 480 10 525 行
800600
/72Hz 行 120 64 800 56 1040 基準時鐘
列 6 23 600 37 666 行
800600
/60Hz 行 128 88 800 40 1056 基準時鐘
列 4 23 600 1 628 行
1024768
/60Hz 行 136 160 1024 24 1344 基準時鐘
列 6 29 768 3 806 行
將時間信號填入圖中,更新后的時序圖如下:
很顯然,我們需要1個計數器來產生這個時序,我們將該計數器命名為h_cnt。由于hys是不停地產生的,那么h_cnt就是不停地計數,每個時鐘都要計數器,所以認為該計數器的加1條件為“1”,可寫成:assign add_h_cnt = 1。從上圖可知,該計數器的周期是800。綜上所述,該計數器的代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13 always @(posedge clk or negedge rst_n)begin
IF(!rst_n)begin
h_cnt <= 0;
end
else if(add_h_cnt)begin
if(end_h_cnt)
h_cnt <= 0;
else
h_cnt <= h_cnt + 1;
end
end
assign add_h_cnt = 1;
assign end_h_cnt = add_h_cnt && h_cnt== 800 - 1;
有了計數器h_cnt,那么hys信號就有了對齊的對象。從時序圖可以發現, hys有兩個變化點,一個是h_cnt數到96個時,由0變1;另一個是當h_cnt數到800個時,由1變0。所以,場同步信號的代碼如下:
1
2
3
4
5
6
7
8
9
10
11 always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
hys <= 0;
end
else if(add_h_cnt && h_cnt == 96 -1)begin
hys <= 1’b1;
end
else if(end_h_cnt)begin
hys <= 1’b0;
end
end
接下來設計vys信號。該信號的時序圖如下所示。
vys就是一個周期性地高低變化的脈沖。我們使用的是表中的第一種分辨率,查詢表可知,同步脈沖a的時間是2行的時間,而顯示后沿b是33行,顯示時序c是480行,顯示前沿是10行,一共是525行。其中,一“行”結束,也就是h_cnt數完了。
將時間信號填入圖中,更新后的時序圖如下:
很顯然,我們還需要1個計數器來產生這個時序,我們將該計數器命名為v_cnt。該計數器是用來數有多少行的,所以加1條件就是一行結束,即end_h_cnt,可寫成:assign add_v_cnt = end_h_cnt。從上圖可知,該計數器的周期是525。綜上所述,該計數器的代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13 always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
v_cnt <= 0;
end
else if(add_v_cnt)begin
if(end_v_cnt)
v_cnt <= 0;
else
v_cnt <= v_cnt + 1;
end
end
assign add_v_cnt = end_h_cnt;
assign end_v_cnt = add_v_cnt && v_cnt== 525 - 1;
有了計數器v_cnt,那么vys信號就有了對齊的對象。從時序圖可以發現, vys有兩個變化點,一個是v_cnt數到2個時,由0變1;另一個是當h_cnt數到525個時,由1變0。所以,場同步信號的代碼如下:
1
2
3
4
5
6
7
8
9
10
11 always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
vys <= 1’b0;
end
else if(add_v_cnt && v_cnt == 2 - 1)begin
vys <= 1’b1;
end
else if(end_v_cnt)begin
vys <= 1’b0;
end
end
最后我們還有一個信號需要設計,那就是lcd_rgb信號。我們要顯示紅色,即lcd_rgb輸出的值為“16’b11111_000000_00000”。但注意的是,要在“顯示區域”才能賦給這個值,在其他區域要將lcd_rgb的值賦值為0。“顯示區域”是什么時候?就是場同步信號vys和行同步信號都處于“顯示區域c”階段。結合時序圖可知,就是h_cnt大于(96+48)并且小于(96+48+640),v_cnt大于(2+33)并且小于(2+33+480)。為了設計方便,添加一個信號red_area,當red_area=1就表示為此區域。
1
2
3
4 always @(*)begin
red_area = (h_cnt>=(96+48) && h_cnt<(96+48+640))&& (v_cnt>=(2+33) && v_cnt<(2+33+480));
end
有了red_area,設計lcd_rgb就好辦了。當red_area=1時,lcd_rgb輸出“16’b11111_000000_00000”,否則輸出0。
1
2
3
4
5
6
7
8
9
10
11 always @(posedge clk or negedge rst_n)begin
if(rst_n==1’b0)begin
lcd_rgb <= 16’h0;
end
else if(red_area)begin
lcd_rgb <= 16’b11111_111111_00000;
end
else begin
lcd_rgb <= 0;
end
end
此次,主體程序已經完成。接下來是將module補充完整。
將module的名稱定義為color。并且我們已經知道該模塊有五個信號:clk、rst_n、hys、vys和lcd_rgb。為此,代碼如下:
1
2
3
4
5
6
7 module color(
clk ,
rst_n ,
hys ,
vys ,
lcd_rgb
);
其中clk、rst_n是輸入信號,hys、vys和lcd_rgb是輸出信號,其中clk、rst_n、hys、vys的值是0或者1,一根線即可,lcd_rgb為16位位寬的,根據這些信息,我們補充輸入輸出端口定義。代碼如下:
1
2
3
4
5 input clk ;
input rst_n ;
output hys ;
output vys ;
output [15:0] lcd_rgb ;
接下來定義信號類型。
h_cnt是用always產生的信號,因此類型為reg。h_cnt計數的最大值為800,需要用10根線表示,即位寬是10位。因此代碼如下:
1 reg [9:0] h_cnt ;
add_h_cnt和end_h_cnt都是用assign方式設計的,因此類型為wire。并且其值是0或者1,1個線表示即可。因此代碼如下:
1
2 wire add_h_cnt;
wire end_h_cnt;
v_cnt是用always產生的信號,因此類型為reg。v_cnt計數的最大值為525,需要用10根線表示,即位寬是10位。因此代碼如下:
1 reg [9:0] v_cnt ;
add_v_cnt和end_v_cnt都是用assign方式設計的,因此類型為wire。并且其值是0或者1,1根線表示即可。因此代碼如下:
1
2 wire add_v_cnt;
wire end_v_cnt;
lcd_rgb是用always方式設計的,因此類型為reg。并且它的位寬是16位,16根線表示即可。因此代碼如下:
1 reg [15:0] lcd_rgb;
hys和vys是用always方式設計的,因此類型為reg。并且其值是0或1,需要1根線表示即可。因此代碼如下:
1
2 reg hys ;
reg vys ;
red_area是用always方式設計的,因此類型為reg。并且其值是0或1,用一根線表示即可,因此代碼如下:
1 reg red_area ;
頂層模塊設計
將module的名稱定義為color_exec1。并且我們已經知道該模塊有五個信號:clk、rst_n、lcd_hs、lcd_vs和lcd_rgb。為此,代碼如下:
1
2
3
4
5
6
7 module color_exec1(
clk ,
rst_n ,
lcd_hs ,
lcd_vs ,
lcd_rgb
);
其中clk、rst_n是輸入信號,lcd_hs、lcd_vs和lcd_rgb是輸出信號,其中clk、rst_n、lcd_hs、lcd_vs的值是0或者1,一根線即可,lcd_rgb為16位位寬的,根據這些信息,我們補充輸入輸出端口定義。代碼如下:
1
2
3
4
5 input clk ;
input rst_n ;
output lcd_hs ;
output lcd_vs ;
output [15:0] lcd_rgb ;
例化PLL IP核的代碼
1
2
3
4 vga_pll module_1(
.inclk0 (clk ),
.c0 (clk_0 )
例化驅動模塊的代碼
1
2
3
4
5
6
7 color module_6(
.clk (clk_0 ),
.rst_n (rst_n ),
.hys (lcd_hs ),
.vys (lcd_vs ),
.lcd_rgb (lcd_rgb)
);
clk_0是在例化文件中,因此類型為wire。并且其值是0或1,用一根線表示即可。因此代碼如下:
1 wire clk_0 ;
lcd_sh和lcd_vs是在例化文件中,因此類型為wire。并且其值是0或1,用一根線表示即可。因此代碼如下:
1
2 wire lcd_hs ;
wire lcd_vs ;
lcd_rgb是在例化文件中,因此類型為wire。它的位寬是16位的,用16根線表示即可。因此代碼如下:
1 wire [15:0] lcd_rgb ;
lcd_xpos和lcd_ypos是在例化文件中,因此類型為wire。并且其值是0或1,用一根線表示即可。因此代碼如下:
1
2 wire [9:0] lcd_xpos ;
wire [9:0] lcd_ypos ;
至此,整個代碼的設計工作已經完成。下一步是新建工程和上板查看現象。
四、綜合工程和上板
新建工程
首先在d盤中創建名為“color_exec1”的工程文件夾,將寫的代碼命名為“color_exec1.v”,頂層模塊名為“color_exec1”,VGA驅動模塊命名為“color.v”。
然后打開Quartus ,點擊File下拉列表中的New Project Wzard…新建工程選項。
3.在出現的界面中直接點擊最下方的“Next”。
4.之后出現的是工程文件夾、工程名、頂層模塊名設置界面。按照之前的命名進行填寫,第一欄選擇工程文件夾“color_exec1”,第二欄選擇工程文件“color_exec1.v”,最后一欄選擇頂層模塊名“color_exec1”,然后點擊”Next”,在出現的界面選擇empty project。
5.之后是文件添加界面。在上方一欄中添加之前寫的”color.v和color_exec1.v”文件和生成的“my_pll”,點擊右側的“Add”按鈕,之后文件還會出現在大方框中,之后點擊“Next”。
器件型號選擇界面。在“Device family”處選擇Cyclone E,在“Available devices”處選擇EP4CE15F23C8,然后點擊“Next”。
EDA工具界面。該頁面用默認的就行,直接點擊最下方“Next”。
8.之后出現的界面是我們前面的設置的總結,確認沒有錯誤后點擊“Finish”。
PLL
PLL是FPGA芯片的一個硬核,在QUARTUS中,我們無須編寫代碼,而是用IP核生成工具產生PLL模塊,然后在頂層模塊中例化就可以使用了。下面步驟詳細說明了PLL IP核的生成過程和使用方面。
打開quartus軟件,然后選擇Tools ->IPcatalog,在右側彈出如下界面
在搜索框中,填下ALTPLL,就會出現如下界面。
ALTPLL就是我們需要使用的PLL IP核。雙擊ALTPLL,在彈出的對話框中起個文件名,如vga_pll,記得選擇verilog。然后點OK就可以開始設置參數了。
2.設置IP參數
上圖中,主要是設置輸入的時鐘頻率,明德揚開發板輸入時鐘是固定的50MHz,因此可填寫50,注意旁邊的單位是選擇MHz。其他默認,按next。
上圖的option inputs中,全部取消勾選,不需要產生復位信號。上圖中的lock output,全部取消勾選,不需要產生locked指示信號。然后選Next。
不用做任何更改,直接Next。
不用做任何更改,直接Next。
增加輸入時鐘,由于我們只有一個輸入時鐘,所以只用inclk0即可,無需增加。直接Next。
不用做任何更改,直接Next。
設置c0的輸出頻率。我們選擇Enter output clock frequest中,直接填入25,單位選擇MHz,就是表示要產生25MHz的時鐘。然后點擊Finish,彈出如下窗口。
取消my_pll_bb.v的勾選,然后選擇Finish。QUARTUS就會產生PLL IP的代碼了。
稍等片刻,到工程目錄D:/color_exec1,可以看到生成一個vga_pll.v文件,用GVIM打開后,可以看到PLL模塊的模塊輸入輸出接口。其中inclk0是50MHz輸入時鐘,c0是25MHz的輸出時鐘。頂層模塊直接例化就可以使用了。
綜合
1.新建工程步驟完成后,就會出現以下界面。在“Project Navigator”下選中要編譯的文件,點擊上方工具欄中“Start Compilation”編譯按鈕(藍色三角形)。
2.編譯成功后會出現以下界面。
配置管腳
1.點擊管腳配置按鈕“Pin Planner”,進入管腳配置界面。
2.下圖是我們要用的管腳配置表,參考“FPGA管腳”和“FPGA頂層信號”兩列來配置。
電阻網絡轉換后
信號線 信號線 FPGA管腳 FPGA頂層信號
VGA_RED VGA_R4 E11 lcd_rgb[15]
VGA_R3 C10 lcd_rgb[14]
VGA_R2 D10 lcd_rgb[13]
VGA_R1 E9 lcd_rgb[12]
VGA_R0 E10 lcd_rgb[11]
VGA_GREEN VGA_G5 D15 lcd_rgb[10]
VGA_G4 C17 lcd_rgb[9]
VGA_G3 C19 lcd_rgb[8]
VGA_G2 E12 lcd_rgb[7]
VGA_G1 C13 lcd_rgb[6]
VGA_G0 E15 lcd_rgb[5]
VGA_BLUE VGA_B4 D13 lcd_rgb[4]
VGA_B3 E13 lcd_rgb[3]
VGA_B2 D17 lcd_rgb[2]
VGA_B1 E16 lcd_rgb[1]
VGA_B0 C15 lcd_rgb[0]
VGA_HSYNC VGA_HSYNC C20 lcd_hys
VGA_VSYNC VGA_VSYNC D20 lcd_vys
SYS_CLK G1 clk
SYS_RST AB12 rst_n
3.在圖中下方“Location”下面的空格中雙擊,填上對應的管腳號,回車即可。
布局布線
管腳配置完成后,在進行一次編譯。
連接開發板
圖中,下載器接入電腦USB接口,電源接入電源,vga線連接顯示器,然后摁下電源開關,看到開發板燈亮。
上板
1.雙擊Tasks一欄中”Program Device”。
2.會出現如下界面,點擊add file添加.sof文件,在右側點擊“Start”,會在上方的“Progress”處顯示進度。
3.進度條中提示成功后,即可在顯示器上觀察到相應的現象。
吳老師QQ:1241003385 微信18022857217
明德揚培訓定位非常明確,堅持幫助學員實現兩個目標:
具備獨立項目開發能力+FPGA就業。
我們認為,只要具備了獨立開發項目能力,完成工作項目需求、導師項目要求、高薪就業這些就都不成問題。經過明德揚專業的培訓,您將完全掌握到一種科學規范的FPGA設計方法,運用這套方法可以完成所有FPGA項目設計。完全具備FPGA工程師的能力,足以滿足企業或實際項目的要求。
對于在校學生和沒有項目經驗的人而言,獨立完成一個大型復雜FPGA設計項目,似乎是遙不可及的夢想。然而,對于工作三年以上的工程師而言,絕大部分人都非常容易做到。那么,獨立設計能力有哪些呢?
1.獨立完成模塊劃分
2.獨立完成代碼編寫
3.獨立完成仿真測試
4.獨立完成上板調試
5.具備最終產品交付的能力
通過上面的要求,我們可以看出,獨立設計能力是指的完成實際應用“合格產品”的“動手能力”,也就是——技能。所學的一切包含數電、模電、語法等等“知識”,都是為了服務于“產品”這個目標。
明德揚培訓定位非常明確,堅持幫助學員實現兩個目標:
具備獨立項目開發能力+FPGA就業。
我們認為,只要具備了獨立開發項目能力,完成工作項目需求、導師項目要求、高薪就業這些就都不成問題。經過明德揚專業的培訓,您將完全掌握到一種科學規范的FPGA設計方法,運用這套方法可以完成所有FPGA項目設計。完全具備FPGA工程師的能力,足以滿足企業或實際項目的要求。
總結
以上是生活随笔為你收集整理的明德扬手把手教你设计VGA显示颜色的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQLServer2012 查询分析器的
- 下一篇: 下载站mime属性设置(让文件可下载)