課程設計基于FPGA的VGA圖像漢字顯示及PS2鍵盤控制設計與應用_第1頁
課程設計基于FPGA的VGA圖像漢字顯示及PS2鍵盤控制設計與應用_第2頁
課程設計基于FPGA的VGA圖像漢字顯示及PS2鍵盤控制設計與應用_第3頁
課程設計基于FPGA的VGA圖像漢字顯示及PS2鍵盤控制設計與應用_第4頁
課程設計基于FPGA的VGA圖像漢字顯示及PS2鍵盤控制設計與應用_第5頁
已閱讀5頁,還剩11頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 電子信息工程專業綜合設計(報告)(課 程 設 計)題目 基于fpga的vga圖像漢字顯示及ps/2鍵盤控制設計與應用 二級學院 專 業 班 級 學生姓名 學 號 指導教師 時 間 基于fpga的vga圖像漢字顯示及ps/2鍵盤控制設計與應用摘 要:現在社會,以計算機技術為核心的信息技術迅速發展,以及信息的爆炸式增長,人類獲得視覺信息的很大一部分是從各種各樣的電子顯示器件上獲得的,對這些電子顯示器件的要求也越來越高,在這些諸多因素的驅動下,顯示技術也取得了飛速的發展。vga(video graphics array)是ibm在1987年隨ps2機一起推出的一種視頻傳輸標準,具有分辨率高、顯示速

2、率快、顏色豐富等優點,在彩色顯示器領域得到了廣泛的應用。使用fpga設計的vga顯示控制器具有很高的靈活性,可以根據其不同的類型、尺寸、適用場合特別是不同的工業產品,做一些特殊的設計,以最小的代價滿足系統的要求,而且可以解決通用的顯示控制器本身固有的一些缺點。vga(視頻圖形陣列)作為一種標準的顯示接口得到廣泛的應用。本文依據vga顯示原理,介紹了利用 fpga 實現對vga圖形控制器vhdl設計及ps/2鍵盤與按鍵對顯示圖象控制的方法。詳細描述了各硬件模塊的工作原理及實現途徑,并給出了軟件設計思路及部分代碼。 關鍵詞:vga;fpga;vhdl;ps/20. 引言 隨著可編程邏輯器件的不斷發

3、展及其價格的不斷下降,eda 開發軟件的不斷完善,可編程邏輯設計的應用優勢逐漸顯示出來, 特別是大規模可編程器件。 而 fpga 具有功能強大,開發過程投資小、周期短等特點,成為當今硬件設計的首選方式之一。vga(視頻圖形陣列)作為一種標準的顯示接口得到廣泛地應用。利用 fpga 芯片和 eda設計方法,可以靈活地根據用戶需求,設計出針對性強的 vga 顯示控制器,不僅降低了生產成本也可以快速地對產品進行升級換代。 本文設計采用 quartus ii 9.0軟件工具,并以 altera公司的 cyclone 系列 fpga 的器件ep1c12f324c8為主實現硬件平臺的設計。1 方案設計及工

4、作原理 1.1 vga模塊方案設計 采用模塊化設計方法,我們對 vga 圖形控制器按功能進行層次劃分。本設計的vga控制器主要由以下模塊組成:vga 時序控制模塊、rom 內存地址控制模塊、rom內存模塊、按鍵掃描控制模塊。如圖 1 所示。 圖1.方案模塊框圖1.2工作原理 vga時序控制 模塊 rom內存地址控制模塊 rom 按鍵掃描 控制模塊 50mhz 5hz addr data 首坐標xx、yy vga 接口 rgb hs、vs d/a crt 根據vga的顯示協議,可以選擇不同的顯示分辨率。本設計選擇的是800*600的分辨率。根據相應協議,在“vga時序控制模塊”對行掃描信號hs和

5、場掃描信號vs進行相應的時序控制(具體控制詳細信息見“vga驅動原理”資料文檔)。 “rom內存地址控制模塊”根據“按鍵掃描控制模塊”獲得的圖片顯示首坐標xx、yy信息和“vga時序控制模塊”傳送過來的hcnt(列計數器值)、vcnt(行計數器值)及相關控制信號計算出正確的內存地址,從rom中取出所需要的像素點的三基色數據。1.3 ps/2接口電路的工作原理ps/2協議和接口最初是ibm公司開發并推廣使用的一種應用于鍵盤/鼠標的協議和接口,ps/2鍵盤按鍵接口是6芯的插頭與pc機的鍵盤相連接,插頭、插座定義如圖所示。鍵盤/鼠標接口的數據線和時鐘線采用集電極開路結構,平時都是高電平當這些設備等待

6、發送數據時,它首先檢查clock是否為高。如果為低,則認為pc抑制了通訊,此時它緩沖數據直到獲得總線的控制權。如果clock為高電平,設備則開始向pc發送數據。一般都是由ps2設備產生時鐘信號。發送按幀格式。數據位在clock為高電平時準備好,在clock下降沿被pc讀入。圖3所示是按下q鍵的時序圖“q”鍵的掃描碼從鍵盤發送到計算機(通道a是時鐘信號,通道b是數據信號)。因本設計只需進行控制,所以ps/2模塊并未設計轉碼功能。2 模塊設計及仿真 2.1 vga顯示模塊 圖片想要在顯示器上顯示出來,它主要需要5個信號,行同步信號(hs)、場同步信號(vs)和rgb三基色信號。vga時序控制模塊是

7、須嚴格按照vga時序標準產生相應的脈沖信號。對這5個信號的時序驅動,vga顯示器要嚴格遵守“vga工業標準”,即640*480*60hz模式,否則會損壞vga顯示器。vga工業標準要求的頻率是:時鐘頻率為25.175mhz,行頻為31469hz,場頻為59.94hz。圖為行hs、場vs時序圖圖 行hs、場vs時序圖顯示模塊是整個顯示控制器的重要組成部分,各個模塊的輸出數據都要經過模塊處理后送到顯示器。顯示模塊在vga顯示控制器中起至關重要的作用。顯示模塊的輸出信號通過d/a轉換器的轉換連到vga接口,它是控制器和顯示器進行通信的橋梁。該模塊以可以vhdl語言實現。2.2 rom內存地址控制模塊

8、 整個顯示思路是在640*480分辨率的顯示器上開辟一128*128的顯示區域來 顯示圖片,因為顯示的圖片的大小為128*128。在此區域以外顯示指定顏色,例如黑色、藍色等,作為一個背景色顯示。在本模塊中,通過在對rom內存地址的控制,實現了圖片顯示功能。以下通過一段關鍵代碼詳細講解其實現原理。2.2.1romaddr_control的計算原理:romaddr_control o:=o+1;j:=0;-w when x01b = o:=d-1;j:=0;-s when x01c = o:=0;j:=j-1;-a when x023 = o:=0;j:=j+1;-d (其中o為圖片縱坐標控制變量

9、,j為橫坐標控制變量)即可完成wasd對圖片移動的控制。對應操作為:w:圖片上移。s:圖片下移。a:圖片右移。d:圖片左移。2.4 按鍵控制模塊 按鍵控制采用的電平觸發機制,1hz左右的掃描頻率,適合于人們的使用習慣。其中按鍵的功能里包括了:a.上下、左右的移動;b.移動中的加速減速停止啟動;c.屏保模式自由移動和停止選擇按鈕。具體語句為if(clkmevent and clkm=1) then if(key1=0)then d:=d+1;e:=e+1;end if; if(key2=0)then d:=d-1;e:=e-1;end if; if(key3=0)then d:=d+1;e:=0

10、;end if; if(key4=0)then d:=0;e:=e+1;end if;(其中d為圖片縱坐標控制變量,e為橫坐標控制變量)即可完成由開發板上的s1s4按鍵對圖片的控制。對應操作為:key1(s1):圖片自動移動開始與加速。key2(s2):圖片自動移動減速與停止。key3(s3):圖片左移與加速。key4(s4):圖片右移與加速。2.5.漢字顯示模塊 本模塊實現方法為對特定區域進行黑白兩色點陣顯示漢字。顯示區域為屏幕94*16。點陣數據程序直接編寫,不額外添加rom存儲。 本模塊設置了兩個變量對顯示區域橫縱軸進行函數運算。即line1,pixel :integer range 0

11、 to 15;3結果分析和調試 因為模塊較多,調試過程中出現中出現了不少問題。1、 按預想情況,圖片在觸及屏幕邊沿是反彈,實際情況是直接消失,一段時間后重新出現在初始位置開始運動。在進行思考測試后,發現是原來的由hitcase代表圖片撞擊屏幕位置,然后編寫case語句對xy進行改變的運算有所欠缺且十分復雜,難以尋找錯誤。后改用對圖片坐標判斷,然后進行xy運算后功能正常,同時使得程序更加簡單易讀。2、 在測試圖片顯示的過程中,由于對vga顯示原理沒有完全理解。出現了圖片顯示紊亂的錯誤。在對行場時序掃描部分查閱資料后,對程序語句進行了重新編寫后,圖片即顯示正常。3、 編寫程序時,出現過模塊無效的錯

12、誤。檢查后發現為自己對模塊調用方法的陌生。查閱資料后在程序中加入了中間量進行中轉后,實現了模塊間的調用連接。4、 測試中,出現過鍵盤無法正常識別彈起狀態的錯誤。后檢查發現并沒有編寫彈起標志位,加入flag變量與通碼一起進行運算后成功解決。經過多次調試以及同學、老師的幫助下,解決了上訴遇到的問題 ,由于時間有限 ,實現初步功能,沒有達到完美效果,基本符合本次設計要求。4體會與感受 在為期三周的課程設計中,進一步鞏固了曾經所學的eda相關知識,并且第一次了解學習了vga相關原理。經過本次課程設計,對vhdl語言有了更進一步了解,也豐富了一個電子信息工程學生的專業知識,鍛煉了動手能力和思辨能力 。此

13、次課程設計師對我們理論的一次大檢驗也是理論運用與實際的完美展現。5. 參考文獻1 侯伯亨.vhdl硬件描述語言與數字邏輯電路設計m.西安:西安 電子科技大學 出版社,1999. 2 李國洪、沈明山。可編程器件eda技術與實踐 機械工業出版社,20043 趙世霞、楊豐、劉揭生。 vhdl與微機接口設計 北京:清華大學出版社 2004 4 林敏.vhdl數字系統設計與高層次綜合m.北京:電子工業出版社,2001. 5 盧毅.vhdl與數字電路設計m.北京:科學出版社,2001. 6 張琴.向先波.徐國率 ps/2鍵盤在基于pic單片機的遠程多溫度點巡檢系統中的應 用 期刊論文 -機械與電子2006

14、(08) 7 苗新法.王秀隼 ps/2鍵盤在嵌入式系統中的應用研究 期刊論文 -蘭州交通大學學 報2007(01) 8 徐曉.汪道輝 標準ps/2鍵盤與單片機的接口設計 期刊論文 -中國測試技術 2005(01) 9、 鄭煒.須文波.胡晉 單片機系統中ps/2鍵盤驅動程序設計 期刊論文 -單片機與嵌 入式系統200510 北京理工大學asic研究所,vhdl語言100例詳解,清華大學出版社 ,北京,1999 :302-310 11 altera 公司 ,datasheet of ep1k30,美國,1999:401006 附錄(程序、元件清單和制作效果)1、頂層文件img.vhdlibrary

15、 ieee; -圖象顯示頂層程序 use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;entity img is port ( clk50mhz ,clk1,clk2,data: in std_logic; key1,key2,key3,key4: in std_logic;hs, vs : out std_logic;r,g: out std_logic;b: out std_logic); end img; architecture modelstru of img is component vga640480 -vga

16、顯示控制模塊 port(clk : in std_logic; rgbin ,rgbin1: in std_logic_vector(2 downto 0); hs, vs : out std_logic;r, g, b: out std_logic;hcntout, vcntout : out std_logic_vector(9 downto 0) ); end component;component keyboard -vga顯示控制模塊 port ( clk: in std_logic; -系統時鐘輸入 kb_clk: in std_logic; -ps/2鍵盤時鐘輸入 kb_data

17、: in std_logic; -ps/2鍵盤數據輸入 keycode: out std_logic_vector(7 downto 0); -ps/鍵盤鍵值輸出 flag: out std_logic ); end component;component imgrom -圖象數據rom,數據線12位;地址線14位 port(clock : in std_logic; address : in std_logic_vector(13 downto 0); q : out std_logic_vector(2 downto 0) ); end component;component rom2 -

18、圖象數據rom,數據線12位;地址線14位 port(clock : in std_logic; address : in std_logic_vector(13 downto 0); q : out std_logic_vector(2 downto 0) ); end component;component mid1port ( clk : in std_logic;qin1 : in std_logic_vector(2 downto 0);xx: in std_logic_vector(8 downto 0);yy: in std_logic_vector(8 downto 0); h

19、cntin : in std_logic_vector(9 downto 0); vcntin : in std_logic_vector(9 downto 0);qout : out std_logic_vector(2 downto 0);romaddr_control : out std_logic_vector(13 downto 0); end component;component midport ( clk : in std_logic;qin : in std_logic_vector(2 downto 0);key1,key2,key3,key4: in std_logic;

20、hcntin : in std_logic_vector(9 downto 0); vcntin : in std_logic_vector(9 downto 0);qout : out std_logic_vector(2 downto 0);code:in std_logic_vector(7 downto 0);flag:in std_logic;romaddr_control : out std_logic_vector(13 downto 0); end component; signal rgb : std_logic_vector(2 downto 0); signal rgb1

21、 : std_logic_vector(2 downto 0); signal rgb2 : std_logic_vector(2 downto 0); signal rgb3 : std_logic_vector(2 downto 0); signal clk25mhz : std_logic; signal clk1hz : std_logic; signal romaddr : std_logic_vector(13 downto 0);signal romaddr1 : std_logic_vector(13 downto 0); signal romaddr2 : std_logic

22、_vector(13 downto 0); signal hpos, vpos : std_logic_vector(9 downto 0);signal txx :std_logic_vector(8 downto 0);signal tyy :std_logic_vector(8 downto 0);signal code1:std_logic_vector(7 downto 0);signal flag1: std_logic;begin process(clk50mhz) begin if clk50mhzevent and clk50mhz = 1 then clk25mhz clk

23、25mhz, rgbin = rgb1, rgbin1 = rgb3,hs = hs, vs = vs, r=r, g=g, b=b, hcntout = hpos, vcntout = vpos); i_rom2: rom2 port map(clock = clk25mhz, address = romaddr1, q =rgb2); i_rom : imgrom port map(clock = clk25mhz, address = romaddr, q = rgb); i_mid : mid port map(clk = clk25mhz, qin = rgb, hcntin = h

24、pos, vcntin = vpos, qout =rgb1,romaddr_control = romaddr,code=code1,flag=flag1,key1=key1,key2=key2,key3=key3,key4=key4); i_mid1 : mid1 port map(clk = clk25mhz, xx = txx, yy= tyy ,qin1 = rgb2, hcntin = hpos, vcntin = vpos, qout =rgb3,romaddr_control = romaddr1); i_keyboard :keyboard port map(clk=clk5

25、0mhz,kb_clk=clk2, kb_data=data,keycode=code1,flag=flag1);end;2、vga顯示模塊library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity vga640480 is port ( clk : in std_logic; hs : out std_logic; vs : out std_logic; r : out std_logic; g : out std_logic; b : out std_logic; rgbin,rgbi

26、n1: in std_logic_vector(2 downto 0); hcntout : out std_logic_vector(9 downto 0); vcntout : out std_logic_vector(9 downto 0) ); end vga640480; architecture one of vga640480 is signal hcnt : std_logic_vector(9 downto 0); signal vcnt : std_logic_vector(9 downto 0); begin - assign pin hcntout = hcnt; vc

27、ntout = vcnt; -this is horizonal counter process(clk) begin if (rising_edge(clk) then if(hcnt 800) then hcnt = hcnt + 1; else hcnt 0); end if; end if; end process; -this is vertical counter process(clk) begin if (rising_edge(clk) then if (hcnt = 640+8 ) then if(vcnt 525) then vcnt = vcnt + 1; else v

28、cnt 0); end if; end if; end if; end process; -this is hs pulse process(clk) begin if (rising_edge(clk) then if(hcnt= 640+8+8) and (hcnt640+8+8+96 ) then hs = 0; else hs = 480+8+2) and (vcnt 480+8+2+2) then vs = 0; else vs = 1; end if; end process; process(clk) begin if (rising_edge(clk) then if(hcnt

29、=640 and vcnt=480)thenr=rgbin(2)or rgbin1(2);g=rgbin(1)or rgbin1(1);b=rgbin(0)or rgbin1(0);elser=0; g=0; b=0; end if; end if;end process;end one;3、rom地址及圖片運動控制模塊library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; entity mid is port (clk : in std_

30、logic;key1,key2,key3,key4: in std_logic;qin : in std_logic_vector(2 downto 0); -xx: in std_logic_vector(9 downto 0); -yy: in std_logic_vector(8 downto 0);hcntin : in std_logic_vector(9 downto 0); vcntin : in std_logic_vector(9 downto 0);qout : out std_logic_vector(2 downto 0);code:in std_logic_vecto

31、r(7 downto 0);flag:in std_logic;romaddr_control : out std_logic_vector(13 downto 0); end mid;architecture one of mid issignal hcnt : std_logic_vector(9 downto 0); signal vcnt : std_logic_vector(9 downto 0); signal qout_temp : std_logic_vector(2 downto 0);- signal romaddr_temp : std_logic_vector(13 d

32、ownto 0);signal count_temph : std_logic_vector(9 downto 0);signal count_tempv : std_logic_vector(9 downto 0);signalclk_count: std_logic_vector(24 downto 0);signal tx: std_logic_vector(9 downto 0);signal ty: std_logic_vector(8 downto 0);signal m,t: std_logic ;signalclkm:std_logic;-signal tempxx: inte

33、ger range 0 to 640;-signal tempyy: integer range 0 to 480;constant wide: integer:=128;constant long: integer:=128;begin- assign pin hcnt = hcntin; vcnt = vcntin;qout = qout_temp;romaddr_control = (vcnt(6 downto 0)-count_tempv(6 downto 0) & (hcnt(6 downto 0)-count_temph(6 downto 0); process(clk) begi

34、n if (rising_edge(clk) thenif(vcnt = ty) and( hcnt=tx ) )then count_temph=hcnt;count_tempv=vcnt; end if;if(vcnt ty+long) then qout_temptx)and (hcnttx + wide ) then -qout_temp=qin;-input logo.hexelseqout_temptx) and (hcntty-1)and (vcnt ty+long-1 ) and ( vcnt ty+long+2 ) ) then qout_tempty)and ( vcnt

35、tx-1)and (hcnttx + wide-2 )and (hcnttx + wide+1 ) then qout_temp=100; end if;end if; -end if; end process;div: process(clk)beginif (clkevent and clk=1) thenif(clk_count 1100110111111110011000000)thenclk_count = clk_count + 1;clkm = 0;elseclk_count =0000000000000000000000001;clkm o:=o+1;j:=0;-w 119 w

36、hen x01b = o:=d-1;j:=0;-s 115 when x01c = o:=0;j:=j-1;-a 973 when x023 = o:=0;j:=j+1;-d 100 when others = null; end case; end if; if(clkmevent and clkm=1) then if(key1=0)then d:=d+1;e:=e+1;end if; if(key2=0)then d:=d-1;e:=e-1;end if; if(key3=0)then d:=d+1;e:=0;end if; if(key4=0)then d:=0;e:=e+1;end

37、if;end if;if (rising_edge(clk) then z:=z+1;if(z=111110) then z:=0; if(m=0)then y:=y+d; else y:=y-d; end if; if(t=640-wide)then t=1; end if; if(x=1) then t=480-long)then m=1; end if; if(y=1) then m=0;end if; end if; end if; tx=x; ty=y;end process; end one;4、鍵盤控制模塊library ieee;use ieee.std_logic_1164.

38、all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;-entity keyboard isport ( clk: in std_logic; -系統時鐘輸入 kb_clk: in std_logic; -ps/2鍵盤時鐘輸入 kb_data: in std_logic; -ps/2鍵盤數據輸入 keycode: out std_logic_vector(7 downto 0);-ps/鍵盤鍵值輸出 flag: out std_logic ); end keyboard;-architecture behave of keyboard is signal dataerror :std_logic; -數據幀出錯信號 signal shiftdata :st

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論