版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 電子信息工程專業(yè)綜合設(shè)計(jì)(報(bào)告)</p><p><b> (課 程 設(shè) 計(jì))</b></p><p> 題目 基于FPGA的VGA圖像漢字顯示及PS/2鍵盤控制設(shè)計(jì)與應(yīng)用</p><p> 二級學(xué)院 </p><p> 專 業(yè) </p
2、><p> 班 級 </p><p> 學(xué)生姓名 </p><p> 學(xué) 號(hào) </p><p> 指導(dǎo)教師 </p><p> 時(shí) 間 </p><p> 基于FP
3、GA的VGA圖像漢字顯示及PS/2鍵盤控制設(shè)計(jì)與應(yīng)用</p><p> 摘 要:現(xiàn)在社會(huì),以計(jì)算機(jī)技術(shù)為核心的信息技術(shù)迅速發(fā)展,以及信息的爆炸式增長,人類獲得視覺信息的很大一部分是從各種各樣的電子顯示器件上獲得的,對這些電子顯示器件的要求也越來越高,在這些諸多因素的驅(qū)動(dòng)下,顯示技術(shù)也取得了飛速的發(fā)展。VGA(Video Graphics Array)是IBM在1987年隨PS/2機(jī)一起推出的一種視頻傳輸標(biāo)準(zhǔn),具
4、有分辨率高、顯示速率快、顏色豐富等優(yōu)點(diǎn),在彩色顯示器領(lǐng)域得到了廣泛的應(yīng)用。使用FPGA設(shè)計(jì)的VGA顯示控制器具有很高的靈活性,可以根據(jù)其不同的類型、尺寸、適用場合特別是不同的工業(yè)產(chǎn)品,做一些特殊的設(shè)計(jì),以最小的代價(jià)滿足系統(tǒng)的要求,而且可以解決通用的顯示控制器本身固有的一些缺點(diǎn)。VGA(視頻圖形陣列)作為一種標(biāo)準(zhǔn)的顯示接口得到廣泛的應(yīng)用。本文依據(jù)VGA顯示原理,介紹了利用 FPGA 實(shí)現(xiàn)對VGA圖形控制器VHDL設(shè)計(jì)及PS/2鍵盤與按鍵對
5、顯示圖象控制的方法。詳細(xì)描述了各硬件模塊的工作原理及實(shí)現(xiàn)途徑,并給出了軟件設(shè)計(jì)思路及部分代碼。 </p><p> 關(guān)鍵詞:VGA;FPGA;VHDL;PS/2</p><p> 0. 引言 隨著可編程邏輯器件的不斷發(fā)展及其價(jià)格的不斷下降,EDA 開發(fā)軟件的不斷完善,可編程邏輯設(shè)計(jì)的應(yīng)用優(yōu)勢逐漸顯示出來, 特別是大規(guī)??删幊唐骷?而 FPGA 具有功能強(qiáng)大,開發(fā)過程投資小、周期短等特
6、點(diǎn),成為當(dāng)今硬件設(shè)計(jì)的首選方式之一。VGA(視頻圖形陣列)作為一種標(biāo)準(zhǔn)的顯示接口得到廣泛地應(yīng)用。利用 FPGA 芯片和 EDA設(shè)計(jì)方法,可以靈活地根據(jù)用戶需求,設(shè)計(jì)出針對性強(qiáng)的 VGA 顯示控制器,不僅降低了生產(chǎn)成本也可以快速地對產(chǎn)品進(jìn)行升級換代。 本文設(shè)計(jì)采用 Quartus II 9.0軟件工具,并以 Altera公司的 Cyclone 系列 FPGA 的器件EP1C12F324C8為主實(shí)現(xiàn)硬件平臺(tái)的設(shè)計(jì)。</p>&
7、lt;p> 1. 方案設(shè)計(jì)及工作原理</p><p> 1.1 VGA模塊方案設(shè)計(jì) </p><p> 采用模塊化設(shè)計(jì)方法,我們對 VGA 圖形控制器按功能進(jìn)行層次劃分。本設(shè)計(jì)的VGA控制器主要由以下模塊組成:VGA 時(shí)序控制模塊、ROM 內(nèi)存地址控制模塊、ROM內(nèi)存模塊、按鍵掃描控制模塊。如圖 1 所示。 </p><p><b>
8、 圖1.方案模塊框圖</b></p><p><b> 1.2工作原理 </b></p><p> VGA時(shí)序控制 模塊 ROM內(nèi)存地址控制模塊 ROM 按鍵掃描 控制模塊 50MHz 5Hz addr data 首坐標(biāo)xx、yy VGA 接口 RGB HS、VS D/A CRT </p><p> 根
9、據(jù)VGA的顯示協(xié)議,可以選擇不同的顯示分辨率。本設(shè)計(jì)選擇的是800*600的分辨率。根據(jù)相應(yīng)協(xié)議,在“VGA時(shí)序控制模塊”對行掃描信號(hào)HS和場掃描信號(hào)VS進(jìn)行相應(yīng)的時(shí)序控制(具體控制詳細(xì)信息見“VGA驅(qū)動(dòng)原理”資料文檔)。 “ROM內(nèi)存地址控制模塊”根據(jù)“按鍵掃描控制模塊”獲得的圖片顯示首坐標(biāo)xx、yy信息和“VGA時(shí)序控制模塊”傳送過來的hcnt(列計(jì)數(shù)器值)、vcnt(行計(jì)數(shù)器值)及相關(guān)控制信號(hào)計(jì)算出正確的內(nèi)存地址,從rom中取出
10、所需要的像素點(diǎn)的三基色數(shù)據(jù)。</p><p> 1.3 PS/2接口電路的工作原理</p><p> PS/2協(xié)議和接口最初是IBM公司開發(fā)并推廣使用的一種應(yīng)用于鍵盤/鼠標(biāo)的協(xié)議和接口,PS/2鍵盤按鍵接口是6芯的插頭與PC機(jī)的鍵盤相連接,插頭、插座定義如圖所示。</p><p> 鍵盤/鼠標(biāo)接口的數(shù)據(jù)線和時(shí)鐘線采用集電極開路結(jié)構(gòu),平時(shí)都是高電平當(dāng)這些設(shè)備等待
11、發(fā)送數(shù)據(jù)時(shí),它首先檢查clock是否為高。如果為低,則認(rèn)為PC抑制了通訊,此時(shí)它緩沖數(shù)據(jù)直到獲得總線的控制權(quán)。如果clock為高電平,設(shè)備則開始向PC發(fā)送數(shù)據(jù)。一般都是由ps2設(shè)備產(chǎn)生時(shí)鐘信號(hào)。發(fā)送按幀格式。數(shù)據(jù)位在clock為高電平時(shí)準(zhǔn)備好,在clock下降沿被PC讀入。圖3所示是按下Q鍵的時(shí)序圖“Q”鍵的掃描碼從鍵盤發(fā)送到計(jì)算機(jī)(通道A是時(shí)鐘信號(hào),通道B是數(shù)據(jù)信號(hào))。因本設(shè)計(jì)只需進(jìn)行控制,所以PS/2模塊并未設(shè)計(jì)轉(zhuǎn)碼功能。</
12、p><p> 2. 模塊設(shè)計(jì)及仿真 </p><p> 2.1 VGA顯示模塊 </p><p> 圖片想要在顯示器上顯示出來,它主要需要5個(gè)信號(hào),行同步信號(hào)(HS)、場同步信號(hào)(VS)和RGB三基色信號(hào)。 VGA時(shí)序控制模塊是須嚴(yán)格按照VGA時(shí)序標(biāo)準(zhǔn)產(chǎn)生相應(yīng)的脈沖信號(hào)。對這5個(gè)信號(hào)的時(shí)序驅(qū)動(dòng),VGA顯示器要嚴(yán)格遵守“VGA工業(yè)標(biāo)準(zhǔn)”,即640*4
13、80*60Hz模式,否則會(huì)損壞VGA顯示器。VGA工業(yè)標(biāo)準(zhǔn)要求的頻率是:時(shí)鐘頻率為25.175MHz,行頻為31469Hz,場頻為59.94Hz。圖為行HS、場VS時(shí)序圖</p><p> 圖 行HS、場VS時(shí)序圖</p><p> 顯示模塊是整個(gè)顯示控制器的重要組成部分,各個(gè)模塊的輸出數(shù)據(jù)都要經(jīng)過模塊處理后送到顯示器。顯示模塊在VGA顯示控制器中起至關(guān)重要的作用。顯示模塊的輸出信號(hào)通
14、過D/A轉(zhuǎn)換器的轉(zhuǎn)換連到VGA接口,它是控制器和顯示器進(jìn)行通信的橋梁。該模塊以可以VHDL語言實(shí)現(xiàn)。</p><p> 2.2 ROM內(nèi)存地址控制模塊 </p><p> 整個(gè)顯示思路是在640*480分辨率的顯示器上開辟一128*128的顯示區(qū)域來 顯示圖片,因?yàn)轱@示的圖片的大小為128*128。在此區(qū)域以外顯示指定顏色,例如黑色、藍(lán)色等,作為一個(gè)背景色顯示。在本模塊中,通過在對R
15、OM內(nèi)存地址的控制,實(shí)現(xiàn)了圖片顯示功能。以下通過一段關(guān)鍵代碼詳細(xì)講解其實(shí)現(xiàn)原理。</p><p> 2.2.1romaddr_control的計(jì)算原理:</p><p> romaddr_control <= (vcnt(6 downto 0)-count_tempv(6 downto 0)) & (hcnt(6 downto 0)-count_temph(6 downt
16、o 0));</p><p> 注:romaddr_control為從rom中取數(shù)據(jù)時(shí)所需要的地址,它對應(yīng)著圖片的沒一個(gè)像素點(diǎn)的三基色數(shù)據(jù);vcnt(5 downto 0)和hcnt(7 downto 0)分別表示取vcnt(9 downto 0)、hcnt(10 downto 0)的后6、后8 個(gè)二進(jìn)制位來做運(yùn)算。count_tempv(5 downto 0)和count_temph(7 downto 0)同
17、理可以理解其含義。Vcnt、hcnt實(shí)際上可以分別理解為屏幕顯示的行和列計(jì)數(shù)器,count_tempv和count_temph可以分別理解為圖片在屏幕上顯示的起始行和列坐標(biāo)。 拋開以上等式,按照正常思路,我們可以得到圖片控制地址: addr_control=( vcnt - count_tempv ) * 256 + ( hcnt – count_temph ) 通過分析整個(gè)mid.vhdl文件,會(huì)發(fā)現(xiàn)其實(shí)上面代碼是該等式的高效等效
18、實(shí)現(xiàn)。</p><p> 2.2.2 ROM內(nèi)存模塊</p><p> ROM內(nèi)存中存儲(chǔ)的是圖片的依次行掃描三基色數(shù)據(jù),作為顯示時(shí)送給VGA顯 示器的RGB數(shù)據(jù)。本設(shè)計(jì)存儲(chǔ)的是一幅128*128的圖片,所以定義了一輸出為3位,大小為128*128=16384 byte的rom內(nèi)存。</p><p> 2.3 鍵盤控制模塊</p><p>
19、; 本模塊主要實(shí)現(xiàn)由鍵盤上的WASD控制圖片上下左右移動(dòng)以及速度調(diào)節(jié)的功能。因此僅僅只需要對鍵盤的按鍵進(jìn)行通碼讀取并進(jìn)行相應(yīng)操作即可。即由ROM內(nèi)存地址控制模塊讀取鍵盤DATA端口數(shù)據(jù)。然后由ROM內(nèi)存地址控制模塊產(chǎn)生相應(yīng)操作。</p><p> 在實(shí)際操作中,我加入了兩個(gè)中間變量對數(shù)據(jù)進(jìn)行處理。即</p><p> code:in std_logic_vector(7 downto
20、 0);</p><p> flag:in std_logic;</p><p> flag用于對鍵盤按下彈起進(jìn)行判斷以避免誤操作。Code用與對鍵盤DATA口數(shù)據(jù)進(jìn)行傳輸以及函數(shù)運(yùn)算。(FLAG按下為0,彈起為1。加入與運(yùn)算實(shí)現(xiàn)功能)</p><p><b> 具體語句為 </b></p><p> case
21、 "000"& flag & code is </p><p> when x"01D" => o:=o+1;j:=0;--w </p><p> when x"01B" => o:=d-1;j:=0;--s </p><p> when x"01C"
22、 => o:=0;j:=j-1;--a </p><p> when x"023" => o:=0;j:=j+1;--d </p><p> (其中O為圖片縱坐標(biāo)控制變量,J為橫坐標(biāo)控制變量)</p><p> 即可完成WASD對圖片移動(dòng)的控制。對應(yīng)操作為:</p><p><b> W:
23、圖片上移。</b></p><p><b> S:圖片下移。</b></p><p><b> A:圖片右移。</b></p><p><b> D:圖片左移。</b></p><p> 2.4 按鍵控制模塊 </p><p>
24、按鍵控制采用的電平觸發(fā)機(jī)制,1Hz左右的掃描頻率,適合于人們的使用習(xí)慣。其中按鍵的功能里包括了:a.上下、左右的移動(dòng);b.移動(dòng)中的加速減速停止啟動(dòng);c.屏保模式自由移動(dòng)和停止選擇按鈕。</p><p><b> 具體語句為</b></p><p> if(clkm'event and clkm='1') then </p>
25、<p> if(key1='0')then d:=d+1;e:=e+1;end if;</p><p> if(key2='0')then d:=d-1;e:=e-1;end if;</p><p> if(key3='0')then d:=d+1;e:=0;end if;</p><p> if(k
26、ey4='0')then d:=0;e:=e+1;end if;</p><p> (其中D為圖片縱坐標(biāo)控制變量,E為橫坐標(biāo)控制變量)</p><p> 即可完成由開發(fā)板上的S1~S4按鍵對圖片的控制。對應(yīng)操作為:</p><p> KEY1(S1):圖片自動(dòng)移動(dòng)開始與加速。</p><p> KEY2(S2):圖片自
27、動(dòng)移動(dòng)減速與停止。</p><p> KEY3(S3):圖片左移與加速。</p><p> KEY4(S4):圖片右移與加速。</p><p> 2.5.漢字顯示模塊</p><p> 本模塊實(shí)現(xiàn)方法為對特定區(qū)域進(jìn)行黑白兩色點(diǎn)陣顯示漢字。顯示區(qū)域?yàn)槠聊?4*16。點(diǎn)陣數(shù)據(jù)程序直接編寫,不額外添加ROM存儲(chǔ)。</p>&l
28、t;p> 本模塊設(shè)置了兩個(gè)變量對顯示區(qū)域橫縱軸進(jìn)行函數(shù)運(yùn)算。即line1,Pixel :integer range 0 to 15;</p><p><b> 3.結(jié)果分析和調(diào)試</b></p><p> 因?yàn)槟K較多,調(diào)試過程中出現(xiàn)中出現(xiàn)了不少問題。</p><p> 按預(yù)想情況,圖片在觸及屏幕邊沿是反彈,實(shí)際情況是直接消失,一
29、段時(shí)間后重新出現(xiàn)在初始位置開始運(yùn)動(dòng)。在進(jìn)行思考測試后,發(fā)現(xiàn)是原來的由HITCASE代表圖片撞擊屏幕位置,然后編寫CASE語句對XY進(jìn)行改變的運(yùn)算有所欠缺且十分復(fù)雜,難以尋找錯(cuò)誤。后改用對圖片坐標(biāo)判斷,然后進(jìn)行XY運(yùn)算后功能正常,同時(shí)使得程序更加簡單易讀。</p><p> 在測試圖片顯示的過程中,由于對VGA顯示原理沒有完全理解。出現(xiàn)了圖片顯示紊亂的錯(cuò)誤。在對行場時(shí)序掃描部分查閱資料后,對程序語句進(jìn)行了重新編寫
30、后,圖片即顯示正常。</p><p> 編寫程序時(shí),出現(xiàn)過模塊無效的錯(cuò)誤。檢查后發(fā)現(xiàn)為自己對模塊調(diào)用方法的陌生。查閱資料后在程序中加入了中間量進(jìn)行中轉(zhuǎn)后,實(shí)現(xiàn)了模塊間的調(diào)用連接。</p><p> 測試中,出現(xiàn)過鍵盤無法正常識(shí)別彈起狀態(tài)的錯(cuò)誤。后檢查發(fā)現(xiàn)并沒有編寫彈起標(biāo)志位,加入FLAG變量與通碼一起進(jìn)行運(yùn)算后成功解決。</p><p> 經(jīng)過多次調(diào)試以及同學(xué)
31、、老師的幫助下,解決了上訴遇到的問題 ,由于時(shí)間有限 ,實(shí)現(xiàn)初步功能,沒有達(dá)到完美效果,基本符合本次設(shè)計(jì)要求。</p><p><b> 4.體會(huì)與感受</b></p><p> 在為期三周的課程設(shè)計(jì)中,進(jìn)一步鞏固了曾經(jīng)所學(xué)的EDA相關(guān)知識(shí),并且第一次了解學(xué)習(xí)了VGA相關(guān)原理。經(jīng)過本次課程設(shè)計(jì),對VHDL語言有了更進(jìn)一步了解,也豐富了一個(gè)電子信息工程學(xué)生的專業(yè)知識(shí)
32、,鍛煉了動(dòng)手能力和思辨能力 。此次課程設(shè)計(jì)師對我們理論的一次大檢驗(yàn)也是理論運(yùn)用與實(shí)際的完美展現(xiàn)。</p><p><b> 5. 參考文獻(xiàn)</b></p><p> [1] 侯伯亨.VHDL硬件描述語言與數(shù)字邏輯電路設(shè)計(jì)[M].西安:西安 電子科技大學(xué) 出版社,1999. </p><p> [2] 李國洪、沈明山。可編程器件EDA技術(shù)
33、與實(shí)踐 機(jī)械工業(yè)出版社,2004</p><p> [3] 趙世霞、楊豐、劉揭生。 VHDL與微機(jī)接口設(shè)計(jì) 北京:清華大學(xué)出版社 2004 </p><p> [4] 林敏.VHDL數(shù)字系統(tǒng)設(shè)計(jì)與高層次綜合[M].北京:電子工業(yè)出版社,2001. [5] 盧毅.VHDL與數(shù)字電路設(shè)計(jì)[M].北京:科學(xué)出版社,2001. </p><p> [6] 張琴
34、.向先波.徐國率 PS/2鍵盤在基于PIC單片機(jī)的遠(yuǎn)程多溫度點(diǎn)巡檢系統(tǒng)中的應(yīng) 用 [期刊論文] -機(jī)械與電子2006(08) </p><p> [7] 苗新法.王秀隼 PS/2鍵盤在嵌入式系統(tǒng)中的應(yīng)用研究 [期刊論文] -蘭州交通大學(xué)學(xué) 報(bào)2007(01) </p><p> [8] 徐曉.汪道輝 標(biāo)準(zhǔn)PS/2鍵盤與單片機(jī)的接口設(shè)計(jì) [期刊論文] -中國測試技術(shù) 2005(01
35、) </p><p> [9]、 鄭煒.須文波.胡晉 單片機(jī)系統(tǒng)中PS/2鍵盤驅(qū)動(dòng)程序設(shè)計(jì) [期刊論文] -單片機(jī)與嵌 入式系統(tǒng)2005</p><p> [10] 北京理工大學(xué)ASIC研究所,《VHDL語言100例詳解》,清華大學(xué)出版社 ,北京,1999 :302-310 </p><p> [11] altera 公司 ,datasheet of
36、ep1k30,美國,1999:40-100</p><p> 6. 附錄(程序、元件清單和制作效果)</p><p> 1、頂層文件IMG.VHD</p><p> LIBRARY ieee; --圖象顯示頂層程序 </p><p> USE ieee.std_logic_1164.all; </p><p>
37、; use ieee.std_logic_unsigned.all;</p><p> ENTITY img IS </p><p><b> port </b></p><p> ( clk50MHz ,clk1,clk2,data: IN STD_LOGIC; </p><p> key1,key2,ke
38、y3,key4: in std_logic;</p><p> hs, vs : OUT STD_LOGIC;</p><p> r,g: OUT STD_LOGIC;</p><p> b: out STD_LOGIC); </p><p><b> END img; </b></p
39、><p> ARCHITECTURE modelstru OF img IS </p><p> component vga640480 --VGA顯示控制模塊 </p><p> PORT(clk : IN STD_LOGIC; </p><p> rgbin ,rgbin1: IN STD_LOGIC_VECTOR(2 downto
40、0); </p><p> hs, vs : OUT STD_LOGIC;</p><p> r, g, b: OUT STD_LOGIC;</p><p> hcntout, vcntout : OUT STD_LOGIC_VECTOR(9 downto 0) ); </p><p> end component;</p&g
41、t;<p> component keyboard --VGA顯示控制模塊 </p><p> port ( clk: in std_logic; --系統(tǒng)時(shí)鐘輸入</p><p> kb_clk: in std_logic; --ps/2鍵盤時(shí)鐘輸入</p><p
42、> kb_data: in std_logic; --ps/2鍵盤數(shù)據(jù)輸入 </p><p> keycode: out std_logic_vector(7 downto 0); --ps/鍵盤鍵值輸出 </p><p> flag: out std_logic</p><p><b> );
43、 </b></p><p> end component;</p><p> component imgrom --圖象數(shù)據(jù)ROM,數(shù)據(jù)線12位;地址線14位 </p><p> PORT(clock : IN STD_LOGIC; </p><p> address : IN STD_LOGIC_VECTOR(13 do
44、wnto 0); </p><p> q : OUT STD_LOGIC_VECTOR(2 downto 0) ); </p><p> end component;</p><p> component rom2 --圖象數(shù)據(jù)ROM,數(shù)據(jù)線12位;地址線14位 </p><p> PORT(clock : IN STD_LOGIC;
45、 </p><p> address : IN STD_LOGIC_VECTOR(13 downto 0); </p><p> q : OUT STD_LOGIC_VECTOR(2 downto 0) ); </p><p> end component;</p><p> component mid1</p><
46、;p><b> port ( </b></p><p> clk : in std_logic;</p><p> qin1 : in std_logic_vector(2 downto 0);</p><p> xx: in std_logic_vector(8 downto 0);</p><p>
47、yy: in std_logic_vector(8 downto 0); </p><p> hcntin : in std_logic_vector(9 downto 0); </p><p> vcntin : in std_logic_vector(9 downto 0);</p><p> qout : out std_logic_vector(2 d
48、ownto 0);</p><p> romaddr_control : out std_logic_vector(13 downto 0)</p><p><b> ); </b></p><p> end component;</p><p> component mid</p><p&g
49、t;<b> port ( </b></p><p> clk : in std_logic;</p><p> qin : in std_logic_vector(2 downto 0);</p><p> key1,key2,key3,key4: in std_logic;</p><p> hcnt
50、in : in std_logic_vector(9 downto 0); </p><p> vcntin : in std_logic_vector(9 downto 0);</p><p> qout : out std_logic_vector(2 downto 0);</p><p> code:in std_logic_vector(7 downt
51、o 0);</p><p> flag:in std_logic;</p><p> romaddr_control : out std_logic_vector(13 downto 0)</p><p><b> ); </b></p><p> end component;</p><p&
52、gt; signal rgb : STD_LOGIC_VECTOR(2 downto 0); </p><p> signal rgb1 : STD_LOGIC_VECTOR(2 downto 0); </p><p> signal rgb2 : STD_LOGIC_VECTOR(2 downto 0); </p><p> signal rgb3 : S
53、TD_LOGIC_VECTOR(2 downto 0); </p><p> signal clk25MHz : std_logic; </p><p> signal clk1Hz : std_logic; </p><p> signal romaddr : STD_LOGIC_VECTOR(13 downto 0);</p><p&g
54、t; signal romaddr1 : STD_LOGIC_VECTOR(13 downto 0); </p><p> signal romaddr2 : STD_LOGIC_VECTOR(13 downto 0); </p><p> signal hpos, vpos : std_logic_vector(9 downto 0);</p><p>
55、signal txx :std_logic_vector(8 downto 0);</p><p> signal tyy :std_logic_vector(8 downto 0);</p><p> signal code1:std_logic_vector(7 downto 0);</p><p> signal flag1: std_logic
56、;</p><p><b> BEGIN</b></p><p> process(clk50MHz) </p><p><b> begin </b></p><p> if clk50MHz'event and clk50MHz = '1' then clk25M
57、Hz <= not clk25MHz ; end if; </p><p> end process; </p><p> i_vga640480 : vga640480 PORT MAP(clk => clk25MHz, rgbin => rgb1, rgbin1 => rgb3,hs => hs, </p><p> vs =
58、> vs, r=>r, g=>g, b=>b, hcntout => hpos, vcntout => vpos); </p><p> i_rom2: rom2 PORT MAP(clock => clk25MHz, address => romaddr1, q =>rgb2);</p><p> i_rom : imgrom P
59、ORT MAP(clock => clk25MHz, address => romaddr, q => rgb);</p><p> i_mid : mid PORT MAP(clk => clk25MHz, qin => rgb, hcntin => hpos, vcntin => vpos,</p><p> qout =>rgb1,
60、romaddr_control => romaddr,code=>code1,flag=>flag1,key1=>key1,key2=>key2,key3=>key3,key4=>key4); </p><p> i_mid1 : mid1 PORT MAP(clk => clk25MHz, xx => txx, yy=> tyy ,qin1 =>
61、; rgb2, hcntin => hpos, </p><p> vcntin => vpos, qout =>rgb3,romaddr_control => romaddr1); </p><p> i_keyboard :keyboard port map(clk=>clk50MHz,kb_clk=>clk2, kb_data=>data
62、,keycode=>code1,flag=>flag1);</p><p><b> end;</b></p><p><b> 2、VGA顯示模塊</b></p><p> library IEEE; </p><p> use IEEE.std_logic_1164.all;
63、 </p><p> use IEEE.STD_LOGIC_UNSIGNED.ALL; </p><p> entity vga640480 is </p><p><b> port ( </b></p><p> clk : in STD_LOGIC; </p><p> hs :
64、out STD_LOGIc; </p><p> vs : out STD_LOGIc; </p><p> r : out STD_LOGIC; </p><p> g : out STD_LOGIC; </p><p> b : out STD_LOGIC; </p><p> rgbin,rgbin1:
65、 in std_logic_vector(2 downto 0); </p><p> hcntout : out std_logic_vector(9 downto 0); </p><p> vcntout : out std_logic_vector(9 downto 0) </p><p><b> ); </b></p&g
66、t;<p> end vga640480; </p><p> architecture ONE of vga640480 is </p><p> signal hcnt : std_logic_vector(9 downto 0); </p><p> signal vcnt : std_logic_vector(9 downto 0);
67、</p><p><b> begin </b></p><p> -- Assign pin </p><p> hcntout <= hcnt; </p><p> vcntout <= vcnt; </p><p> --this is Horizonal counte
68、r </p><p> process(clk) begin </p><p> if (rising_edge(clk)) then </p><p> if(hcnt < 800) then </p><p> hcnt <= hcnt + 1; </p><p><b> else
69、 </b></p><p> hcnt <= (others => '0'); </p><p><b> end if; </b></p><p><b> end if; </b></p><p> end process; </p>
70、<p> --this is Vertical counter </p><p> process(clk) begin </p><p> if (rising_edge(clk)) then </p><p> if (hcnt = 640+8 ) then </p><p> if(vcnt < 525) t
71、hen </p><p> vcnt <= vcnt + 1; </p><p><b> else </b></p><p> vcnt <= (others => '0'); </p><p><b> end if; </b></p>&
72、lt;p><b> end if; </b></p><p><b> end if; </b></p><p> end process; </p><p> --this is hs pulse </p><p> process(clk) begin </p>&
73、lt;p> if (rising_edge(clk)) then </p><p> if((hcnt>= 640+8+8) and (hcnt<640+8+8+96 )) then </p><p> hs <= '0'; </p><p><b> else </b></p>&
74、lt;p> hs <= '1'; </p><p><b> end if; </b></p><p><b> end if; </b></p><p> end process; </p><p> --this is vs pulse </p>
75、<p> process(vcnt) begin </p><p> if ((vcnt >= 480+8+2) and (vcnt < 480+8+2+2)) then </p><p> vs <= '0'; </p><p><b> else </b></p><
76、;p> vs <= '1'; </p><p><b> end if; </b></p><p> end process; </p><p> process(clk) begin </p><p> if (rising_edge(clk)) then </p>
77、<p> if(hcnt<=640 and vcnt<=480)then</p><p> r<=rgbin(2)or rgbin1(2);</p><p> g<=rgbin(1)or rgbin1(1);</p><p> b<=rgbin(0)or rgbin1(0);</p><p>&
78、lt;b> else</b></p><p><b> r<='0'; </b></p><p><b> g<='0'; </b></p><p><b> b<='0'; </b></p>&
79、lt;p><b> end if; </b></p><p><b> end if;</b></p><p> end process;</p><p><b> end ONE;</b></p><p> 3、ROM地址及圖片運(yùn)動(dòng)控制模塊</p>
80、<p> library ieee; </p><p> use ieee.std_logic_1164.all; </p><p> use ieee.std_logic_unsigned.all; </p><p> use ieee.std_logic_arith.all; </p><p> entity mi
81、d is </p><p><b> port (</b></p><p> clk : in std_logic;</p><p> key1,key2,key3,key4: in std_logic;</p><p> qin : in std_logic_vector(2 downto 0); <
82、;/p><p> --xx: in std_logic_vector(9 downto 0);</p><p> --yy: in std_logic_vector(8 downto 0);</p><p> hcntin : in std_logic_vector(9 downto 0); </p><p> vcntin : in s
83、td_logic_vector(9 downto 0);</p><p> qout : out std_logic_vector(2 downto 0);</p><p> code:in std_logic_vector(7 downto 0);</p><p> flag:in std_logic;</p><p> romad
84、dr_control : out std_logic_vector(13 downto 0)</p><p><b> ); </b></p><p><b> end mid;</b></p><p> architecture one of mid is</p><p> signal
85、hcnt : std_logic_vector(9 downto 0); </p><p> signal vcnt : std_logic_vector(9 downto 0); </p><p> signal qout_temp : std_logic_vector(2 downto 0);</p><p> -- signal romaddr_temp
86、 : std_logic_vector(13 downto 0);</p><p> signal count_temph : std_logic_vector(9 downto 0);</p><p> signal count_tempv : std_logic_vector(9 downto 0);</p><p> signalclk_count:
87、std_logic_vector(24 downto 0);</p><p> signal tx: std_logic_vector(9 downto 0);</p><p> signal ty: std_logic_vector(8 downto 0);</p><p> signal m,t: std_logic ;</p><
88、;p> signalclkm:std_logic;</p><p> --signal tempxx: integer range 0 to 640;</p><p> --signal tempyy: integer range 0 to 480;</p><p> constant wide: integer:=128;</p>
89、<p> constant long: integer:=128;</p><p><b> begin</b></p><p> -- Assign pin </p><p> hcnt <= hcntin; </p><p> vcnt <= vcntin;</p>&l
90、t;p> qout <= qout_temp;</p><p> romaddr_control <= (vcnt(6 downto 0)-count_tempv(6 downto 0)) </p><p> & (hcnt(6 downto 0)-count_temph(6 downto 0));</p><p> process
91、(clk) begin </p><p> if (rising_edge(clk)) then</p><p> if((vcnt = ty) and( hcnt=tx ) )then </p><p> count_temph<=hcnt;</p><p> count_tempv<=vcnt;</p>
92、<p><b> end if;</b></p><p> if((vcnt < ty) or (vcnt > ty+long)) then qout_temp<="000";</p><p> elsif((hcnt>tx)and (hcnt<tx + wide )) then --</
93、p><p> qout_temp<=qin;---------input logo.hex</p><p><b> else</b></p><p> qout_temp<="000";</p><p><b> end if;</b></p>&
94、lt;p> ---------------- </p><p> if((hcnt>tx) and (hcnt<tx + wide)) then </p><p> if ((vcnt >ty-1)and (vcnt <ty+2))or (( vcnt >ty+long-1 ) and ( vcnt < ty+long+2 )
95、) </p><p> then qout_temp<="100"; </p><p> end if;end if;</p><p> if (( vcnt >ty)and ( vcnt < ty+long))then </p><p> if((hcnt>tx-1)and (hc
96、nt<tx+2)) or ((hcnt>tx + wide-2 )and (hcnt<tx + wide+1 ))</p><p> then qout_temp<="100"; </p><p> end if;end if;</p><p> ---------------------------<
97、;/p><p> end if; </p><p> end process;</p><p> div: process(clk)</p><p><b> begin</b></p><p> if (clk'event and clk='1') then&
98、lt;/p><p> if(clk_count < "1100110111111110011000000")then</p><p> clk_count <= clk_count + 1;</p><p> clkm <= '0';</p><p><b> else<
99、;/b></p><p> clk_count <="0000000000000000000000001";</p><p> clkm <= '1';</p><p><b> end if;</b></p><p><b> end if;<
100、;/b></p><p> end process;</p><p> ------------------------move-------------</p><p> process(clk)</p><p> variable y : std_logic_vector(8 downto 0);</p>&l
101、t;p> variable z,d,e: integer;</p><p> variable o,j:integer range 0 to 1:=0;</p><p> variable x : std_logic_vector(9 downto 0) ;</p><p><b> begin</b></p>
102、<p> if(clkm'event and clkm='1' ) then </p><p> case "000"& flag & code is </p><p> when x"01D" => o:=o+1;j:=0;--w 119</p><p>
103、when x"01B" => o:=d-1;j:=0;--s 115</p><p> when x"01C" => o:=0;j:=j-1;--a 973</p><p> when x"023" => o:=0;j:=j+1;--d 100</p><p> when ot
104、hers => null;</p><p><b> end case;</b></p><p><b> end if;</b></p><p> if(clkm'event and clkm='1') then </p><p> if(key1='
105、;0')then d:=d+1;e:=e+1;end if;</p><p> if(key2='0')then d:=d-1;e:=e-1;end if;</p><p> if(key3='0')then d:=d+1;e:=0;end if;</p><p> if(key4='0')then d:
106、=0;e:=e+1;end if;</p><p><b> end if;</b></p><p> if (rising_edge(clk)) then</p><p><b> z:=z+1;</b></p><p> if(z>=111110) then </p>
107、<p><b> z:=0;</b></p><p> if(m<='0')then y:=y+d; else y:=y-d; end if;</p><p> if(t<='0')then x:=x+e; else x:=x-e; end if;</p><p> if(x&g
108、t;=640-wide)then t<='1'; end if;</p><p> if(x<=1) then t<='0'; end if;</p><p> if(y>=480-long)then m<='1'; end if;</p><p> if(y<=1) then
109、 m<='0';end if;</p><p><b> end if;</b></p><p><b> end if;</b></p><p> tx<=x; ty<=y;</p><p> end process; end one;</p>
110、<p><b> 4、鍵盤控制模塊</b></p><p> library ieee;</p><p> use ieee.std_logic_1164.all;</p><p> use ieee.std_logic_arith.all;</p><p> use ieee.std_logic
111、_unsigned.all;</p><p> ----------------------------------------</p><p> entity keyboard is</p><p> port ( clk: in std_logic; --系統(tǒng)時(shí)鐘輸入</p><p>
112、 kb_clk: in std_logic; --ps/2鍵盤時(shí)鐘輸入</p><p> kb_data: in std_logic; --ps/2鍵盤數(shù)據(jù)輸入 </p><p> keycode: out std_logic_vector(7 downto 0);--ps/鍵盤鍵值輸出</p
113、><p> flag: out std_logic</p><p><b> ); </b></p><p> end keyboard;</p><p> ----------------------------------------</p><p> architecture beha
114、ve of keyboard is</p><p> signal dataerror :std_logic; --數(shù)據(jù)幀出錯(cuò)信號(hào)</p><p> signal shiftdata :std_logic_vector(7 downto 0);</p><p> signal kbcodereg :std_logic
115、_vector(7 downto 0);</p><p> signal datacoming :std_logic;</p><p> signal kbclkfall :std_logic;</p><p> signal kbclkreg :std_logic;</p><p> signal cnt
116、 :std_logic_vector(3 downto 0);</p><p> signal parity :std_logic;</p><p> signal flag1 :std_logic;</p><p><b> begin</b></p><p> -------------
117、---------ps/2鍵盤時(shí)鐘下降沿</p><p> 捕獲進(jìn)程---------------</p><p> process(clk)</p><p><b> begin</b></p><p> if (clk'event and clk ='1') then</p>
118、;<p> kbclkreg<=kb_clk;</p><p> kbclkfall<=kbclkreg and (not kb_clk);</p><p><b> end if;</b></p><p> end process;</p><p> ----------------
119、----ps/2鍵盤數(shù)據(jù)接收進(jìn)程--------------------</p><p> process(clk)</p><p><b> begin</b></p><p> if (clk'event and clk='1') then </p><p> if (kbclkfal
120、l ='1'and datacoming='0'and kb_data='0') then</p><p> datacoming<='1';</p><p> cnt<="0000";</p><p> parity<='0';</p&
121、gt;<p> elsif (kbclkfall='1'and datacoming='1') then</p><p> if cnt =9 then --接受停止位</p><p> if (kb_data='1') then</p><p> datacoming<
122、='0';</p><p> dataerror<='0';</p><p><b> else</b></p><p> dataerror<='1';</p><p><b> end if;</b></p>&l
123、t;p> cnt<=cnt+1;</p><p> elsif (cnt=80) then --接受奇校驗(yàn)位</p><p> if (kb_data=parity) then</p><p> dataerror<='0';</p><p><b> else </b
124、></p><p> dataerror<='1';</p><p><b> end if;</b></p><p> cnt<=cnt+1;</p><p> else--接收數(shù)據(jù)位</p><p> shiftdata<=kb_data &a
125、mp; shiftdata(7 downto 1); </p><p> parity<=parity xor kb_data;</p><p> cnt<=cnt+1;</p><p><b> end if;</b></p><p><b> end if;</b>
126、;</p><p><b> end if;</b></p><p> end process;</p><p> ------------------------------------------------------------</p><p> process(clk) --對接收
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于fpga的ps2鼠標(biāo)接口設(shè)計(jì)及vga顯示
- 課程設(shè)計(jì)-基于fpga的vga圖像顯示設(shè)計(jì)
- fpga課程設(shè)計(jì)--vga圖像顯示控制電路設(shè)計(jì)
- 基于verilog的ps2鍵盤設(shè)計(jì)進(jìn)階
- 利用鍵盤控制點(diǎn)陣進(jìn)行漢字顯示課程設(shè)計(jì)
- 實(shí)驗(yàn)四_ps2鍵盤的控制
- fpga控制的ps2接口電路設(shè)計(jì)
- 基于fpga的ps2鍵盤鼠標(biāo)控制電子琴說明書
- 畢業(yè)設(shè)計(jì)----基于單片機(jī)的ps2鍵盤設(shè)計(jì)
- 課程設(shè)計(jì)-基于fpga的vga圖像顯示設(shè)計(jì)(圖像旋轉(zhuǎn)、放大、單步步進(jìn)移動(dòng)和屏保移動(dòng))
- 課程設(shè)計(jì)-基于fpga的vga圖像顯示設(shè)計(jì)(圖像旋轉(zhuǎn)、放大、單步步進(jìn)移動(dòng)和屏保移動(dòng))
- 畢業(yè)設(shè)計(jì)--ps2鍵盤鼠標(biāo)識(shí)別器的設(shè)計(jì)
- hdl-ps2接口鍵盤課程設(shè)計(jì)
- 基于fpga的vga接口顯示設(shè)計(jì)與實(shí)現(xiàn)
- 基于FPGA的實(shí)時(shí)視頻圖像采集與VGA顯示系統(tǒng)設(shè)計(jì)研究.pdf
- 基于FPGA的VGA顯示控制器設(shè)計(jì)和實(shí)現(xiàn).docx
- ps2鼠標(biāo)鍵盤協(xié)議 外文翻譯
- 畢業(yè)論文----基于vhdl語言的vga、ps2接口協(xié)議
- 課程設(shè)計(jì)-- 基于fpga的液晶顯示控制器設(shè)計(jì)
- 畢業(yè)論文--基于fpga的vga顯示控制器設(shè)計(jì)(含外文翻譯)
評論
0/150
提交評論