電子設(shè)計(jì)自動(dòng)化課程設(shè)計(jì)報(bào)告.doc
《電子設(shè)計(jì)自動(dòng)化課程設(shè)計(jì)報(bào)告.doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《電子設(shè)計(jì)自動(dòng)化課程設(shè)計(jì)報(bào)告.doc(17頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
電子設(shè)計(jì)自動(dòng)化 課程設(shè)計(jì)報(bào)告 學(xué)生姓名: 學(xué) 號(hào): 課設(shè)題目: VGA彩條信號(hào)顯示控制器設(shè)計(jì) 同組人: 電子設(shè)計(jì)自動(dòng)化課程設(shè)計(jì)報(bào)告 郝欣欣 一、課程設(shè)計(jì)內(nèi)容 1、 使用Verilog語(yǔ)言和Modelsim仿真器完成可顯示橫彩條、豎彩條、棋盤格相間的VGA控制器的設(shè)計(jì)和驗(yàn)證 2、 設(shè)計(jì)并驗(yàn)證可顯示英語(yǔ)單詞”HIT”的VGA控制器 3、 使用Quartus II和SOPC實(shí)驗(yàn)箱驗(yàn)證設(shè)計(jì)的正確性 4、 Verilog代碼要符合微電子中心編碼標(biāo)準(zhǔn) 二、FPGA原理 CPLD、FPGA是在PAL、GAL等基礎(chǔ)上發(fā)展起來(lái)的一種具有豐富的可編程I/O引腳、邏輯宏單元、門電路以及RAM空間的可編程邏輯器件,幾乎所有應(yīng)用門陣列、PLD和中小規(guī)模通用數(shù)字集成電路的場(chǎng)合均可應(yīng)用FPGA和CPLD器件。CPLD的設(shè)計(jì)是基于乘積項(xiàng)選擇矩陣來(lái)實(shí)現(xiàn)的,而FPGA基于查找表來(lái)設(shè)計(jì)的。查找表就是實(shí)現(xiàn)將輸入信號(hào)的各種組合功能以一定的次序?qū)懭隦AM中,然后在輸入信號(hào)的作用下,輸出特定的函數(shù)運(yùn)算結(jié)果。其結(jié)構(gòu)圖如圖1所示: 圖1. FPGA查找表單元 一個(gè)N輸入查找表 (LUT,Look Up Table)可以實(shí)現(xiàn)N個(gè)輸入變量的任何邏輯功能,如 N輸入“與”、 N輸入“異或”等。 輸入多于N個(gè)的函數(shù)、方程必須分開(kāi)用幾個(gè)查找表( LUT)實(shí)現(xiàn)(如圖2 所示)。 圖2 FPGA查找表單元內(nèi)部結(jié)構(gòu) 該系統(tǒng)設(shè)計(jì)中,F(xiàn)PGA芯片用的是ALTERA公司的EP1K30QC208-2,它的系統(tǒng)結(jié)構(gòu)如圖3所示。它由若干個(gè)邏輯單元和中央布線池加I/O端口構(gòu)成 圖3 EP1K30QC208內(nèi)部結(jié)構(gòu) 三、VGA接口 VGA的全稱為Video Graphic Array,即顯示繪圖陣列。在PC行業(yè)發(fā)展的初期,VGA以其支持在640X480的較高分辨率下同時(shí)顯示16種色彩或256種灰度,同時(shí)在320X240分辨率下可以同時(shí)顯示256種顏色的良好特性得到廣泛支持。后來(lái),廠商們紛紛在VGA基礎(chǔ)上加以擴(kuò)充,如將顯存提高至1M并使其支持更高分辨率如800X600或1024X768,這些擴(kuò)充的模式就稱之為VESA(Video Electronics Standards Association,視頻電子標(biāo)準(zhǔn)協(xié)會(huì))的Super VGA模式,簡(jiǎn)稱SVGA,現(xiàn)在的顯卡和顯示器都支持SVGA模式。 圖4 VGA接口 VGA接口就是顯卡上輸出模擬信號(hào)的接口,也叫D-Sub接口。VGA接口是一種D型接口,上面共有15針空,分成三排,每排五個(gè)。VGA接口是顯卡上應(yīng)用最為廣泛的接口類型,絕大多數(shù)的顯卡都帶有此種接口。 表1 VGA管腳定義 管腳 定義 1 紅基色 red 2 綠基色 green 3 藍(lán)基色 blue 4 地址碼 ID Bit 5 自測(cè)試 (各家定義不同) 6 紅地 7 綠地 8 藍(lán)地 9 保留(各家定義不同) 10 數(shù)字地 11 地址碼 12 地址碼 13 行同步 14 場(chǎng)同步 15 地址碼 (各家定義不同) 通過(guò)模擬VGA接口和計(jì)算機(jī)連接的顯示器的工作原理,是計(jì)算機(jī)內(nèi)部以數(shù)字方式生成的顯示圖像信息,被顯卡中的數(shù)字/模擬轉(zhuǎn)換器轉(zhuǎn)變?yōu)镽、G、B三原色信號(hào)和行、場(chǎng)同步信號(hào),信號(hào)通過(guò)電纜傳輸?shù)斤@示設(shè)備中。對(duì)于模擬顯示設(shè)備,如模擬CRT顯示器,信號(hào)被直接送到相應(yīng)的處理電路,驅(qū)動(dòng)控制顯像管生成圖像。而對(duì)于LCD、DLP等數(shù)字顯示設(shè)備,顯示設(shè)備中需配置相應(yīng)的A/D(模擬/數(shù)字)轉(zhuǎn)換器,將模擬信號(hào)轉(zhuǎn)變?yōu)閿?shù)字信號(hào)。在經(jīng)過(guò)D/A和A/D2次轉(zhuǎn)換后,不可避免地造成了一些圖像細(xì)節(jié)的損失。VGA接口應(yīng)用于CRT顯示器無(wú)可厚非,但用于連接液晶之類的顯示設(shè)備,則轉(zhuǎn)換過(guò)程的圖像損失會(huì)使顯示效果略微下降。CRT顯示器因?yàn)樵O(shè)計(jì)制造上的原因,只能接受模擬信號(hào)輸入,也就是我們?yōu)槭裁丛贑RT顯示器上只看到VGA接口的原因。 四、VGA顯示接口原理 計(jì)算機(jī)顯示器的顯示有許多標(biāo)準(zhǔn),常見(jiàn)的有VGA、SVGA等。本系統(tǒng)采用FPGA來(lái)實(shí)現(xiàn)圖像顯示控制器,這在產(chǎn)品開(kāi)發(fā)設(shè)計(jì)中有許多實(shí)際應(yīng)用。 常見(jiàn)的彩色顯示器,一般由CRT(陰極射線管)構(gòu)成,彩色是由G、R、B(綠:Green,紅:Red,藍(lán):Blue)三基色組成。顯示是用逐行掃描的方式解決,陰極射線槍發(fā)出電子束打在涂有熒光粉的熒光屏上,產(chǎn)生GRB三基色,合成一個(gè)彩色像素。掃描從屏幕的左上方開(kāi)始,從左到右,從上到下,進(jìn)行掃描,每掃完一行,電子束回到屏幕的左邊下一行的起始位置,在這期間,CRT對(duì)電子束進(jìn)行消隱,每行結(jié)束時(shí),用行同步信號(hào)進(jìn)行行同步;掃描完所有行,用場(chǎng)同步信號(hào)進(jìn)行場(chǎng)同步,并使掃描回到屏幕的左上方,同時(shí)進(jìn)行場(chǎng)消隱,預(yù)備下一場(chǎng)的掃描。 對(duì)于普通的VGA顯示器,其引出線共含5個(gè)信號(hào):G、R、B:三基色信號(hào);HS:行同步信號(hào);VS:場(chǎng)同步信號(hào)。 對(duì)于5個(gè)信號(hào)的時(shí)序驅(qū)動(dòng),對(duì)于VGA顯示器要嚴(yán)格遵循“VGA工業(yè)標(biāo)準(zhǔn)”,即64048060Hz模式。通常我們用的顯示器都滿足工業(yè)標(biāo)準(zhǔn),因此我們?cè)O(shè)計(jì)VGA控制器時(shí)要參考顯示器的技術(shù)規(guī)格。 圖5是VGA行掃描、場(chǎng)掃描的時(shí)序圖: 圖5 VGA行掃描、場(chǎng)掃描時(shí)序圖 表2 VGA參考時(shí)序設(shè)計(jì) VGA工業(yè)標(biāo)準(zhǔn)所要求的頻率: 時(shí)鐘頻率(Clock frequency):25.175MHz(像素輸出的頻率); 行頻(Line frequency):31469Hz; 場(chǎng)頻(Field frequency):59.94Hz(每秒圖像刷新頻率)。 五、FPGA的設(shè)計(jì)實(shí)現(xiàn) 設(shè)計(jì)VGA圖像顯示控制需要注意兩個(gè)問(wèn)題:一個(gè)是時(shí)序的驅(qū)動(dòng),這是完成設(shè)計(jì)的關(guān)鍵,時(shí)序稍有偏差,顯示必然不正常,甚至?xí)p壞彩色顯示器;另一個(gè)是VGA信號(hào)的電平驅(qū)動(dòng)。 顯示控制器設(shè)計(jì)提示:顯示器的技術(shù)規(guī)格提供的行頻一般都滿足在30-45KHz(保守?cái)?shù)據(jù)),場(chǎng)頻一般滿足在50-75Hz(保守?cái)?shù)據(jù)),針對(duì)以上保守?cái)?shù)據(jù),我們以30KHz的行頻進(jìn)行掃描時(shí)所需時(shí)鐘頻率為:30KHz800(行周期)=24MHz,則場(chǎng)頻為:30KHz525(場(chǎng)周期)=57.14Hz,針對(duì)實(shí)驗(yàn)箱的條件,可以用12MHz的信號(hào)經(jīng)過(guò)倍頻(EP1K30QC208-2芯片特有的功能,在MaxPlusII軟件中調(diào)用參數(shù)可設(shè)置兆功能元件庫(kù)mega_lpm的CLKLOCK元件來(lái)倍頻)來(lái)產(chǎn)生24MHz的時(shí)鐘頻率,參考設(shè)計(jì)的頂層文件如下圖所示: 圖6.VGA接口實(shí)現(xiàn)頂視圖 VGACORE模塊包含了掃描時(shí)序產(chǎn)生模塊、圖像描述模塊。時(shí)序產(chǎn)生模塊的設(shè)計(jì)可參考圖5所示來(lái)設(shè)計(jì),圖像描述模塊主要通過(guò)640480個(gè)像素點(diǎn)來(lái)描述圖像。如本項(xiàng)設(shè)計(jì)的彩條信號(hào)發(fā)生器可通過(guò)圖像描述模塊產(chǎn)生如下表所示的3種顯示模式,共6種顯示變化的圖像。 表3 VGA圖形編碼 1 行彩條 1:白黃青綠品紅藍(lán)黑 2:黑藍(lán)紅品綠青黃白 2 豎彩條 1:白黃青綠品紅藍(lán)黑 2:黑藍(lán)紅品綠青黃白 3 棋盤格 1:棋盤格顯示模式1 2:棋盤格顯示模式2 上表顏色對(duì)應(yīng)的編碼為: 表4 VGA顏色編碼 顏 色 黑 藍(lán) 紅 品 綠 青 黃 白 G 0 0 0 0 1 1 1 1 R 0 0 1 1 0 0 1 1 B 0 1 0 1 0 1 0 1 在設(shè)計(jì)完彩條信號(hào)發(fā)生器的基礎(chǔ)上很容易完成漢字/圖像的設(shè)計(jì)。由于本設(shè)計(jì)是對(duì)視頻數(shù)據(jù)進(jìn)行處理,用普通的設(shè)計(jì)方法(不使用專用芯片),在單芯片上實(shí)現(xiàn)是不可思議的,而在此用FPGA設(shè)計(jì),輕松地達(dá)到了面積和速度上的要求。 六、程序及仿真 (一)、管腳分配 本設(shè)計(jì)采用主板上的VGA接口 實(shí)驗(yàn)?zāi)J剑耗J? 時(shí)鐘及控制 clk----->pin_29 clock9 實(shí)驗(yàn)要求采用12M的時(shí)鐘 rst----->pin_240 鍵8,低電平有效,作為使能信號(hào) MD ----->pin_233 鍵1,模式選擇信號(hào),共有6種模式 顯示器輸出 R ----->pin_180 PIO29 G ----->pin_181 PIO30 B ----->pin_182 PIO31 HS ----->pin_183 PIO32 VS ----->pin_185 PIO34 (二)、彩條發(fā)生器程序?qū)崿F(xiàn)及仿真 1、主程序 module vga( clk_25m,rst_n, //系統(tǒng)控制 hsync,vsync,vga_rgb,MD // VGA控制 ); input clk_25m; // 25MHz input rst_n; //低電平復(fù)位 input MD; // FPGA與VGA接口信號(hào) output hsync; //行同步信號(hào) output vsync; //場(chǎng)同步信號(hào) output[2:0] vga_rgb; //-------------------------------------------------- // 坐標(biāo)計(jì)數(shù) reg[9:0] x_cnt; //行坐標(biāo) reg[9:0] y_cnt; //列坐標(biāo) always @ (posedge clk_25m or negedge rst_n) if(!rst_n) x_cnt <= 10d0; else if(x_cnt == 10d799) x_cnt <= 10d0; else x_cnt <= x_cnt+1b1; always @ (posedge clk_25m or negedge rst_n) if(!rst_n) y_cnt <= 10d0; else if(y_cnt == 10d524) y_cnt <= 10d0; else if(x_cnt == 10d799) y_cnt <= y_cnt+1b1; //-------------------------------------------------- // 產(chǎn)生VGA場(chǎng)同步,行同步信號(hào) reg hsync_r,vsync_r; always @ (posedge clk_25m or negedge rst_n) if(!rst_n) hsync_r <= 1b1; else if(x_cnt == 10d0) hsync_r <= 1b0; //產(chǎn)生hsync信號(hào) else if(x_cnt == 10d96) hsync_r <= 1b1; always @ (posedge clk_25m or negedge rst_n) if(!rst_n) vsync_r <= 1b1; else if(y_cnt == 10d0) vsync_r <= 1b0; //產(chǎn)生vsync信號(hào) else if(y_cnt == 10d2) vsync_r <= 1b1; assign hsync = hsync_r; assign vsync = vsync_r; //-------------------------------------------------- //有效顯示標(biāo)志位產(chǎn)生 reg valid_yr; //行顯示有效信號(hào) always @ (posedge clk_25m or negedge rst_n) if(!rst_n) valid_yr <= 1b0; else if(y_cnt == 10d32) valid_yr <= 1b1; else if(y_cnt == 10d512) valid_yr <= 1b0; wire valid_y = valid_yr; reg valid_r; // VGA有效顯示區(qū)標(biāo)志位 always @ (posedge clk_25m or negedge rst_n) if(!rst_n) valid_r <= 1b0; else if((x_cnt == 10d141) && valid_y) valid_r <= 1b1; else if((x_cnt == 10d781) && valid_y) valid_r <= 1b0; wire valid = valid_r; wire[9:0] x_dis; //橫坐標(biāo)顯示有效區(qū)域相對(duì)坐標(biāo)值0-639 wire[9:0] y_dis; //豎坐標(biāo)顯示有效區(qū)域相對(duì)坐標(biāo)值0-479 assign x_dis = x_cnt - 10d142; assign y_dis = y_cnt - 10d33; //-------------------------------------------------- //--------------------------------------------- reg[2:0] cnt; always @ (posedge MD or negedge rst_n) begin if(!rst_n) cnt <= 3d0; else if(cnt==3d5) cnt<=3d0; else cnt<=cnt+3d1; end //-------------------------------------------------- // VGA色彩信號(hào)產(chǎn)生 /* RGB = 000 黑色 RGB = 100 紅色 = 001 藍(lán)色 = 101 紫色 = 010 綠色 = 110 黃色 = 011 青色 = 111 白色 */ //---------------------------------------------------- reg[2:0] vga_rgb; always@( posedge clk_25m)begin if(!valid) vga_rgb <= 3d0; else begin if (cnt==3d0)begin //豎彩條模式 if(x_dis >= 10d0 && x_dis < 10d80) vga_rgb <= 3d0; else if(x_dis >= 10d80 && x_dis < 10d160) vga_rgb <= 3d1; else if(x_dis >= 10d160 && x_dis < 10d240) vga_rgb <= 3d2; else if(x_dis >= 10d240 && x_dis < 10d320) vga_rgb <= 3d3; else if(x_dis >= 10d320 && x_dis < 10d400) vga_rgb <= 3d4; else if(x_dis >= 10d400 && x_dis < 10d480) vga_rgb <=3d5; else if(x_dis >= 10d480 && x_dis < 10d560) vga_rgb <= 3d6; else if(x_dis >= 10d560 && x_dis < 10d640) vga_rgb <= 3d7; end if (cnt==3d1)begin //豎彩條模式 if(x_dis >= 10d0 && x_dis < 10d80) vga_rgb <= 3d7; else if(x_dis >= 10d80 && x_dis < 10d160) vga_rgb <= 3d6; else if(x_dis >= 10d160 && x_dis < 10d240) vga_rgb <= 3d5; else if(x_dis >= 10d240 && x_dis < 10d320) vga_rgb <= 3d4; else if(x_dis >= 10d320 && x_dis < 10d400) vga_rgb <= 3d3; else if(x_dis >= 10d400 && x_dis < 10d480) vga_rgb <=3d2; else if(x_dis >= 10d480 && x_dis < 10d560) vga_rgb <= 3d1; else if(x_dis >= 10d560 && x_dis < 10d640) vga_rgb <= 3d0; end if(cnt==3d2)begin //橫彩條模式 if(y_dis >= 10d0 && y_dis < 10d60) vga_rgb <= 3d0; else if(y_dis >= 10d60 && y_dis < 10d120) vga_rgb <= 3d1; else if(y_dis >= 10d120 && y_dis < 10d180) vga_rgb <= 3d2; else if(y_dis >= 10d180 && y_dis < 10d240) vga_rgb <= 3d3; else if(y_dis >= 10d240 && y_dis < 10d300) vga_rgb <= 3d4; else if(y_dis >= 10d300 && y_dis < 10d360) vga_rgb <= 3d5; else if(y_dis >= 10d360 && y_dis < 10d420) vga_rgb <= 3d6; else if(y_dis >= 10d420 && y_dis < 10d480) vga_rgb <=3d7; end if(cnt==3d3)begin //橫彩條模式 if(y_dis >= 10d0 && y_dis < 10d60) vga_rgb <= 3d7; else if(y_dis >= 10d60 && y_dis < 10d120) vga_rgb <= 3d6; else if(y_dis >= 10d120 && y_dis < 10d180) vga_rgb <= 3d5; else if(y_dis >= 10d180 && y_dis < 10d240) vga_rgb <= 3d4; else if(y_dis >= 10d240 && y_dis < 10d300) vga_rgb <= 3d3; else if(y_dis >= 10d300 && y_dis < 10d360) vga_rgb <= 3d2; else if(y_dis >= 10d360 && y_dis < 10d420) vga_rgb <= 3d1; else if(y_dis >= 10d420 && y_dis < 10d480) vga_rgb <=3d0; end if(cnt==3d4)begin //棋盤格模式 case(x_dis) 10d0: begin if(y_dis >= 10d0 && y_dis < 10d60) vga_rgb <= 3d0; else if(y_dis >= 10d60 && y_dis < 10d120) vga_rgb <= 3d1; else if(y_dis >= 10d120 && y_dis < 10d180) vga_rgb <= 3d2; else if(y_dis >= 10d180 && y_dis < 10d240) vga_rgb <= 3d3; else if(y_dis >= 10d240 && y_dis < 10d300) vga_rgb <= 3d4; else if(y_dis >= 10d300 && y_dis < 10d360) vga_rgb <= 3d5; else if(y_dis >= 10d360 && y_dis < 10d420) vga_rgb <= 3d6; else if(y_dis >= 10d420 && y_dis < 10d480) vga_rgb <= 3d7; end 10d80,10d160,10d240,10d320,10d400,10d480,10d560,10d640: vga_rgb <= vga_rgb+3d1; //每80個(gè)橫坐標(biāo)像素點(diǎn)后顯示色彩數(shù)據(jù)增1變化 default: ; endcase end if(cnt==3d5)begin //棋盤格模式 case(x_dis) 10d0: begin if(y_dis >= 10d0 && y_dis < 10d60) vga_rgb <= 3d7; else if(y_dis >= 10d60 && y_dis < 10d120) vga_rgb <= 3d6; else if(y_dis >= 10d120 && y_dis < 10d180) vga_rgb <= 3d5; else if(y_dis >= 10d180 && y_dis < 10d240) vga_rgb <= 3d4; else if(y_dis >= 10d240 && y_dis < 10d300) vga_rgb <= 3d3; else if(y_dis >= 10d300 && y_dis < 10d360) vga_rgb <= 3d2; else if(y_dis >= 10d360 && y_dis < 10d420) vga_rgb <= 3d1; else if(y_dis >= 10d420 && y_dis < 10d480) vga_rgb <= 3d0; end 10d80,10d160,10d240,10d320,10d400,10d480,10d560,10d640: vga_rgb <= vga_rgb+3d1; //每80個(gè)橫坐標(biāo)像素點(diǎn)后顯示色彩數(shù)據(jù)增1變化 default: ; endcase end end end endmodule 2、驗(yàn)證程序 `timescale 1 ns/ 1 ps module tb_vga (); reg t_clk_25m; reg t_rst_n; wire t_hsync; wire [2:0] t_vga_rgb; wire t_vsync; wire t_MD; vgahct dut( .clk_25m(t_clk_25m), .hsync(t_hsync), .rst_n(t_rst_n), .vga_rgb(t_vga_rgb), .vsync(t_vsync), .MD(t_MD) ); initial begin t_clk_25m=0; t_rst_n=1; t)MD=0; #20; t_rst_n=0; #50; t_rst_n=1; $display("Running testbench"); #10000000000 $stop; end always #0.04 t_clk_25m=~t_clk_25m; always #200 t_MD=~t_MD; endmodule 3、仿真波形 (三)、字符顯示程序及仿真 1、主程序 `timescale 1ns / 1ps module vga_char( clk_25m,rst_n, //系統(tǒng)控制 hsync,vsync,vga_rgb // VGA控制 ); input clk_25m; // 25MHz input rst_n; //低電平復(fù)位 // FPGA與VGA接口信號(hào) output hsync; //行同步信號(hào) output vsync; //場(chǎng)同步信號(hào) output[2:0] vga_rgb; //-------------------------------------------------- // 坐標(biāo)計(jì)數(shù) reg[9:0] x_cnt; //行坐標(biāo) reg[9:0] y_cnt; //列坐標(biāo) always @ (posedge clk_25m or negedge rst_n) if(!rst_n) x_cnt <= 10d0; else if(x_cnt == 10d799) x_cnt <= 10d0; else x_cnt <= x_cnt+1b1; always @ (posedge clk_25m or negedge rst_n) if(!rst_n) y_cnt <= 10d0; else if(y_cnt == 10d524) y_cnt <= 10d0; else if(x_cnt == 10d799) y_cnt <= y_cnt+1b1; //-------------------------------------------------- // VGA場(chǎng)同步,行同步信號(hào) reg hsync_r,vsync_r; //同步信號(hào) always @ (posedge clk_25m or negedge rst_n) if(!rst_n) hsync_r <= 1b1; else if(x_cnt == 10d0) hsync_r <= 1b0; //產(chǎn)生hsync信號(hào) else if(x_cnt == 10d96) hsync_r <= 1b1; always @ (posedge clk_25m or negedge rst_n) if(!rst_n) vsync_r <= 1b1; else if(y_cnt == 10d0) vsync_r <= 1b0; //產(chǎn)生vsync信號(hào) else if(y_cnt == 10d2) vsync_r <= 1b1; assign hsync = hsync_r; assign vsync = vsync_r; //-------------------------------------------------- //有效顯示標(biāo)志位產(chǎn)生 reg valid_yr; //行顯示有效信號(hào) always @ (posedge clk_25m or negedge rst_n) if(!rst_n) valid_yr <= 1b0; else if(y_cnt == 10d32) valid_yr <= 1b1; else if(y_cnt == 10d512) valid_yr <= 1b0; wire valid_y = valid_yr; reg valid_r; // VGA有效顯示區(qū)標(biāo)志位 always @ (posedge clk_25m or negedge rst_n) if(!rst_n) valid_r <= 1b0; else if((x_cnt == 10d141) && valid_y) valid_r <= 1b1; else if((x_cnt == 10d781) && valid_y) valid_r <= 1b0; wire valid = valid_r; //wire[9:0] x_dis; //橫坐標(biāo)顯示有效區(qū)域相對(duì)坐標(biāo)值0-639 wire[9:0] y_dis; //豎坐標(biāo)顯示有效區(qū)域相對(duì)坐標(biāo)值0-479 //assign x_dis = x_cnt - 10d142; assign y_dis = y_cnt - 10d33; //-------------------------------------------------- //-------------------------------------------------- // VGA色彩信號(hào)產(chǎn)生 /* RGB = 000 黑色 RGB = 100 紅色 = 001 藍(lán)色 = 101 紫色 = 010 綠色 = 110 黃色 = 011 青色 = 111 白色 */ /*HIT字模參數(shù)*/ parameter char_line0=24h000000, char_line1=24h000000, char_line2=24h000000, char_line3=24he77cfe, char_line4=24h421092, char_line5=24h421010, char_line6=24h421010, char_line7=24h421010, char_line8=24h7e1010, char_line9=24h421010, char_linea=24h421010, char_lineb=24h421010, char_linec=24h421010, char_lined=24he77c38, char_linee=24h000000, char_linef=24h000000; reg[4:0] char_bit; //顯示位計(jì)算 always @(posedge clk_25m or negedge rst_n) if(!rst_n) char_bit <= 5h1f; else if(x_cnt == 10d442) char_bit <= 5d23; //顯示最高位數(shù)據(jù) else if(x_cnt > 10d442 && x_cnt < 10d466) char_bit <= char_bit-1b1; //依次顯示后面的數(shù)據(jù) reg[2:0] vga_rgb; // VGA色彩顯示寄存器 always @ (posedge clk_25m) if(!valid) vga_rgb <= 3d0; else if(x_cnt > 10d442 && x_cnt < 10d467) begin case(y_dis) 10d231: if(char_line0[char_bit]) vga_rgb <= 3b100; //紅色 else vga_rgb <= 3b010; //綠色 10d232: if(char_line1[char_bit]) vga_rgb <= 3b100; //紅色 else vga_rgb <= 3b010; //綠色 10d233: if(char_line2[char_bit]) vga_rgb <= 3b100; //紅色 else vga_rgb <= 3b010; //綠色 10d234: if(char_line3[char_bit]) vga_rgb <= 3b100; //紅色 else vga_rgb <= 3b010; //綠色 10d235: if(char_line4[char_bit]) vga_rgb <= 3b100; //紅色 else vga_rgb <= 3b010; //綠色 10d236: if(char_line5[char_bit]) vga_rgb <= 3b100; //紅色 else vga_rgb <= 3b010; //綠色 10d237: if(char_line6[char_bit]) vga_rgb <= 3b100; //紅色 else vga_rgb <= 3b010; //綠色 10d238: if(char_line7[char_bit]) vga_rgb <= 3b100; //紅色 else vga_rgb <= 3b010; //綠色 10d239: if(char_line8[char_bit]) vga_rgb <= 3b100; //紅色 else vga_rgb <= 3b010; //綠色 10d240: if(char_line9[char_bit]) vga_rgb <= 3b100; //紅色 else vga_rgb <= 3b010; //綠色 10d241: if(char_linea[char_bit]) vga_rgb <= 3b100; //紅色 else vga_rgb <= 3b010; //綠色 10d242: if(char_lineb[char_bit])vga_rgb <= 3b100; //紅色 else vga_rgb <= 3b010; //綠色 10d243: if(char_linec[char_bit])vga_rgb <= 3b100; //紅色 else vga_rgb <= 3b010; //綠色 10d244: if(char_lined[char_bit])vga_rgb <= 3b100; //紅色 else vga_rgb <= 3b010; //綠色 10d245: if(char_linee[char_bit])vga_rgb <= 3b100; //紅色 else vga_rgb <= 3b010; //綠色 10d246: if(char_linef[char_bit])vga_rgb <= 3b100; //紅色 else vga_rgb <= 3b010; //綠色 default: vga_rgb <= 3b000; endcase end else vga_rgb <=3b000 ; endmodule 2、驗(yàn)證程序 `timescale 1 ns/ 1 ps module tb_vga_char(); reg t_clk_25m; reg t_rst_n; wire t_hsync; wire [1:0] t_vga_b; wire [2:0] t_vga_g; wire [2:0] t_vga_r; wire t_vsync; vga_char dut( .clk_25m(t_clk_25m), .hsync(t_hsync), .rst_n(t_rst_n), .vga_b(t_vga_b), .vga_g(t_vga_g), .vga_r(t_vga_r), .vsync(t_vsync) ); initial begin t_clk_25m=0; t_rst_n=1; #20; t_rst_n=0; #50; t_rst_n=1; $display("Running testbench"); #1000 $stop; end always #0.04 t_clk_25m=~t_clk_25m; endmodule 3、仿真波形 六、總結(jié) 在本次課程設(shè)計(jì)中,對(duì)VGA顯示的原理有了一定的了解,在團(tuán)隊(duì)的分工合作下使用Verilog語(yǔ)言和Modelsim仿真器完成了可顯示橫彩條、豎彩條、棋盤格相間的VGA控制器的設(shè)計(jì)和驗(yàn)證,設(shè)計(jì)并驗(yàn)證了可顯示英語(yǔ)單詞”HIT”的VGA控制器,并掌握了Quartus II軟件和SOPC實(shí)驗(yàn)箱的使用。 本次課程設(shè)計(jì)讓我受益匪淺,讓我提高了研究、解決問(wèn)題的能力,和團(tuán)隊(duì)合作的意識(shí)。對(duì)我今后的學(xué)習(xí)有一定的啟迪作用,使我對(duì)FPGA設(shè)計(jì)產(chǎn)生了新的認(rèn)識(shí),并產(chǎn)生了很濃厚的興趣。- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開(kāi)word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 電子設(shè)計(jì) 自動(dòng)化 課程設(shè)計(jì) 報(bào)告
鏈接地址:http://www.820124.com/p-6524710.html