FPGA控制的PS2接口電路設(shè)計(jì) 畢業(yè)論文 畢業(yè)設(shè)計(jì)_第1頁
FPGA控制的PS2接口電路設(shè)計(jì) 畢業(yè)論文 畢業(yè)設(shè)計(jì)_第2頁
FPGA控制的PS2接口電路設(shè)計(jì) 畢業(yè)論文 畢業(yè)設(shè)計(jì)_第3頁
FPGA控制的PS2接口電路設(shè)計(jì) 畢業(yè)論文 畢業(yè)設(shè)計(jì)_第4頁
FPGA控制的PS2接口電路設(shè)計(jì) 畢業(yè)論文 畢業(yè)設(shè)計(jì)_第5頁
已閱讀5頁,還剩15頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、fpga控制的ps/2接口電路設(shè)計(jì)摘要:ps2作為鍵盤接口至今仍在廣泛使用。本論文根據(jù)ps2鍵盤接口的協(xié)議,用vhd語言編程,用fpga控制ps2,使其能夠接收從鍵盤鍵入的信息,并把它顯示在數(shù)碼管和液晶顯示頻上。the design of ps / 2 interface circuit by control of fpgaabstract:today,ps2 keyboard interface is still being used widely.this report is based ps2 keyboard interface protocol, with vhd language

2、programming, using fpga control ps2, so that it can receive information from the keyboard to type, and display it in the digital frequency of the tube and liquid crystal display.關(guān)鍵詞:vhdl,fpga , ps2, quartusii引言:ps2是一類應(yīng)用廣泛的鍵盤接口。本文論述了用fpga控制ps2的設(shè)計(jì)思想及方法,并實(shí)現(xiàn)把按鍵的掃描碼及其對應(yīng)的ascii碼顯示在led及l(fā)cd上。設(shè)計(jì)原理 通過分析,本次設(shè)計(jì)需要

3、分四部分實(shí)現(xiàn):1.接收從鍵盤發(fā)出的掃描碼信息2.把接收到的掃描碼轉(zhuǎn)換成ascii碼3.把掃描碼和ascii碼顯示在數(shù)碼管上4.把掃描碼和ascii碼顯示在led液晶上。1.ps2鍵盤接口協(xié)議介紹ps2協(xié)議和接口最初是由ibm公司開發(fā)并廣泛使用的應(yīng)用于鍵盤/鼠標(biāo)的協(xié)議和接口。ps2鍵盤接口是6芯的插頭,各插頭定義如下: 1 data key data 2 n/c not connected 3 gnd gnd 4 vcc power , +5 vdc 5 clk clock 6 n/c not connected 在ps2的6個芯中,2和6未定義,3和4為電源和地,需要用fpga控制的只有1(數(shù)

4、據(jù))和5(時(shí)鐘)。2.把從鍵盤發(fā)出的數(shù)據(jù)轉(zhuǎn)換成掃描碼 每當(dāng)有按鍵按下或彈起時(shí)鍵盤都會發(fā)出一幀或幾幀數(shù)據(jù),每一幀數(shù)據(jù)一共都12位,其數(shù)據(jù)格式如下表所示:1個起始位總是邏輯08個數(shù)據(jù)位(lsb)低位在前1個奇偶校驗(yàn)位奇校驗(yàn)1個停止位總是邏輯11個應(yīng)答位僅用在主機(jī)對設(shè)備的通訊中 從鍵盤發(fā)出的數(shù)據(jù)是在時(shí)鐘信號的下降沿的時(shí)候才被讀取,fpga要想接收到鍵盤發(fā)出的數(shù)據(jù)就要配合ps2的時(shí)序。具體設(shè)計(jì)思路如下: 首先我們來定義幾個端口。首先要有數(shù)據(jù)輸入端口k_data和鍵盤時(shí)鐘k_clock。k_data是從鍵盤發(fā)出的一位一位串行數(shù)據(jù),我們要在k_clock的下降沿到來時(shí)接收這12位串行數(shù)據(jù),并最終輸出我們想

5、要的中間1至8位數(shù)據(jù)。這8位輸出我們用datascan來表示。另外再對整個系統(tǒng)設(shè)置一個復(fù)位信號rst。為了方便接收數(shù)據(jù),我們有必要定義一個計(jì)數(shù)器count,使它對k_clock鍵盤時(shí)鐘計(jì)數(shù),count的值在0到11之間變化,count等于11時(shí)清零,其余自加1。另外再定義一個接收鍵盤數(shù)據(jù)的中間變量tmpdata,每當(dāng)檢測到k_clock下降沿到來時(shí),就把data的值賦給tmpdata,這樣,當(dāng)k_clock的12個下降沿到來時(shí),tmpdata就接收到了鍵盤發(fā)出的全部12位數(shù)據(jù)。在程序中,我們還要定義一個串并轉(zhuǎn)換結(jié)束的標(biāo)志信號flag,當(dāng)count大于8時(shí)就可以把flag置為1,當(dāng)檢測到flag

6、變?yōu)?時(shí),就把tmpdata的1至8位賦給輸出端口data,這樣,我們就得到了想要的8位掃描碼輸出。為了和下一步的掃描碼轉(zhuǎn)換成ascii碼建立聯(lián)系,我們還要定義一個觸發(fā)中斷信號interrupt1,當(dāng)count等于11的時(shí)候把interrupt1置1觸發(fā)中斷,作為掃描碼轉(zhuǎn)換為ascii碼的使能信號。這部分電路的仿真結(jié)果如下(以輸出1c為例):3.把掃描碼轉(zhuǎn)換成ascii碼 把掃描碼轉(zhuǎn)換成ascii碼的目的是為了識別按鍵?,F(xiàn)在,我們已經(jīng)有了從鍵盤發(fā)出的掃描碼信息,那么,如何根據(jù)這些掃描碼信息來區(qū)分按下的是哪一個鍵呢? 實(shí)際上,鍵盤接口中的微處理器負(fù)責(zé)掃描或監(jiān)視按鍵的動作,如果發(fā)現(xiàn)有按鍵按下,按住

7、或者釋放,鍵盤將會發(fā)送掃描碼的信息包。掃描碼有通碼和斷碼兩種,當(dāng)一個按鍵按下或按住,鍵盤就向接口發(fā)送一個字節(jié)的鍵盤接通的掃描碼,稱為通碼。當(dāng)該按鍵彈起或釋放時(shí),鍵盤向接口發(fā)送兩個字節(jié)的鍵盤斷開的掃描碼,稱為斷碼。斷碼和通碼有一定的聯(lián)系,多數(shù)第二套斷碼有兩字節(jié)長。它們的第一個字節(jié)是f0 ,第二個字節(jié)是這個鍵的通碼。擴(kuò)展按鍵的斷碼通常有三個字節(jié),它們前兩個字節(jié)是e0h,f0h ,最后一個字節(jié)是這個按鍵通碼的最后一個字節(jié)。鍵盤每個按鍵被分配了唯一的通碼和斷碼。這樣,我們通過查找唯一的通碼和斷碼就可以確定按下的是哪一個鍵。每個鍵一整套的通斷碼組成了掃描碼集。有三套標(biāo)準(zhǔn)的掃描碼集,所有現(xiàn)代的鍵盤默認(rèn)使用

8、第二套掃描碼。 有了這個基礎(chǔ),我們就可以設(shè)計(jì)程序把掃描碼轉(zhuǎn)換成ascii碼了。這部分的核心是查表。需要注意的是當(dāng)shift鍵和capslock鍵按下時(shí)的不同結(jié)果。我們同樣先來定義幾個端口。用scan作為掃描碼的輸入端口,clk作為時(shí)鐘信號,它與上一個掃描碼輸出電路的觸發(fā)中斷信號interrupt1相連接。定義dataascii為最終的ascii碼輸出。另外再定義一個ascii碼轉(zhuǎn)換結(jié)束的中斷信號interrupt2。 整個轉(zhuǎn)換的思路是,由接收過來的掃描碼的值,通過查表判斷這個掃描碼對應(yīng)的是哪一個按鍵,再在ascii表中查找這個按鍵的ascii值,然后把按鍵的ascii值輸出。這里面牽扯到組合鍵

9、的問題。即shift和capslock這兩個鍵有沒有按下。為了判斷組合鍵有沒有按下,我們設(shè)計(jì)幾個觸發(fā)器來保存上一個時(shí)鐘的特殊組合鍵的狀態(tài),以便后來的ascii碼轉(zhuǎn)換。當(dāng)檢測到有這兩個按鍵按下時(shí),就把相應(yīng)的shifted_d或capslocked_d置為1,然后再通過d觸發(fā)器把這兩個鍵的狀態(tài)鎖存起來。鎖存后為shifted和capslocked。判斷這兩個鍵按下的依據(jù)是判斷掃描碼的值,若掃描碼的值對應(yīng)的是這兩個按鍵,就可以把相應(yīng)的鍵的狀態(tài)置1。在轉(zhuǎn)換時(shí)我們先不管組合鍵有沒有按下,先根據(jù)掃描碼的值通過查表找到它的ascii值,最后再判斷組合鍵有沒有按下。具體操作是,當(dāng)接收到掃描碼時(shí),先判斷掃描碼的

10、值是否為shift或capslock的掃描碼值,如果是的話就表示有組合鍵按下了,這時(shí)把shifted_d或capslocked_d置1,否則置0.轉(zhuǎn)換成的ascii碼用tmpascii表示。當(dāng)這些工作完成以后,再判斷shifted或capslocked的值是否為1,若這兩個值都為1或0,則應(yīng)為小寫,這時(shí)就需要把前得到的tmpascii的值加上十六進(jìn)制的“20”。當(dāng)然,這些大小寫轉(zhuǎn)換是針對ascii值在“a”和“a”之間而言的。另外,有些鍵上面有上下兩排字符,當(dāng)shift鍵按下時(shí)用到的是上面一排,這個應(yīng)該注意。解決這個問題的方法很簡單,由于在前面我們已經(jīng)把shift鍵前一個狀態(tài)鎖存起來,在進(jìn)行掃

11、描碼到ascii碼轉(zhuǎn)換的時(shí)候,若遇到有兩排字符的鍵時(shí),先判斷shifted是否為1,若為1則轉(zhuǎn)換上面字符的ascii值就行了。最后我們把轉(zhuǎn)換得到的值賦給一個信號ascii。若沒有按鍵按下或掃描碼對應(yīng)的不是鍵盤的126個鍵,則把a(bǔ)scii賦成“10000000”。在轉(zhuǎn)換中我們還應(yīng)該考慮一個問題。比如我們要顯示小寫的a這個字母,當(dāng)按下a再彈起時(shí)我們接收到的一串掃描碼應(yīng)該為1c,f0,1c。再比如我們要顯示大寫的字母a,應(yīng)該是先按shift鍵,再按a鍵,然后彈起a鍵,再彈起shift鍵。那么我們接收到的掃描碼就該為:12,1c,f0,1c,f0,12。我們接收到這么些掃描碼,而我們要輸出的ascii

12、碼應(yīng)該為61(a為小寫時(shí))和41(a為大寫時(shí))。如果我們都一一轉(zhuǎn)換的話會出錯。注意到如果我們在“f0”掃描碼到來時(shí)才進(jìn)行轉(zhuǎn)換就可以解決問題了。因此,在轉(zhuǎn)換前先判斷掃描碼是不是為f0,若是的話就代表斷碼到來了,這時(shí)把定義好的duanma_d置1,否則置0,再把它鎖入鎖存器,輸出為duanma,在進(jìn)行ascii碼轉(zhuǎn)換時(shí),我們都把duanma等于1作為轉(zhuǎn)換的一個條件,這樣就可以得到正確的ascii碼值了。接下來的問題是,我們應(yīng)該在什么時(shí)候把轉(zhuǎn)換成的ascii碼輸出呢?在前面,我們把沒有轉(zhuǎn)換的ascii信號賦為“10000000”,所以,每當(dāng)clk下降沿到來時(shí),我們?nèi)z測ascii的后7位是否為“00

13、00000”,若不是則說明已經(jīng)轉(zhuǎn)換結(jié)束了,這時(shí)我們給程序一個轉(zhuǎn)換結(jié)束標(biāo)志flag,當(dāng)檢測到flag上升沿到來時(shí),把a(bǔ)scii的值傳遞給最終的ascii碼輸出端口dataascii,同時(shí)觸發(fā)中斷interrupt2。這部分電路的仿真結(jié)果如下(以輸出大寫和小寫字母a的asscii碼值為例):4.把掃描碼及ascii碼值顯示在數(shù)碼管上經(jīng)過前兩部分的設(shè)計(jì)分析,我們已經(jīng)得到了按鍵的掃描碼值和ascii碼值。我們要用動態(tài)掃描的方法把這兩個值顯示在數(shù)碼管上。顯示這兩個鍵值需要點(diǎn)亮4個數(shù)碼管。實(shí)現(xiàn)動態(tài)掃描的原理就是使這4個數(shù)碼管依次點(diǎn)亮,由于依次點(diǎn)亮的時(shí)間間隔很短,而人都有一定時(shí)間的視覺暫留,所以就會看到4個

14、數(shù)碼管同時(shí)點(diǎn)亮。為了依次點(diǎn)亮4個數(shù)碼管,我們定義一個計(jì)數(shù)器cnt,cnt在“00”到“11”之間變化。cnt每變化依次,我們把相應(yīng)的段選信號輸出到對應(yīng)的數(shù)碼管,那么,當(dāng)cnt連續(xù)變化很快時(shí),我們就可以看到四個數(shù)碼管點(diǎn)亮了。接下來的問題是,段選信號如何獲得?容易想到,段選信號就是掃描碼的高四位、低四位和ascii碼的高四位、低四位所對應(yīng)的數(shù)字的段選信號。所以我們要把掃描碼和ascii碼的高四位、低四位分別求出來。而掃描碼和ascii碼的值我們提前是不知道的,所以我們要建立一個對照表,我們先把掃描碼和ascii碼的高四位和低四位放在四個變量中,然后分別判斷這四位對應(yīng)的是0到f之間的哪一個數(shù),然后求

15、出這個數(shù)對應(yīng)的段選信號,并把它放在信號中,等到相應(yīng)的cnt到來時(shí),把這個段選信號輸出到數(shù)碼管就行了。5.把掃描碼及ascii碼顯示在lcd液晶屏上在這里要用到lcd1602。lcd1602為一個16位,兩行的液晶顯示頻,我們要想把鍵值顯示在lcd上,只要按照它的協(xié)議來做就行了。 lcd接收數(shù)據(jù)有它對應(yīng)的時(shí)鐘,這個我們可以通過分頻產(chǎn)生。當(dāng)時(shí)鐘到來時(shí),我們要決定是送指令還是數(shù)據(jù),是讀還是寫,還要送入相應(yīng)的指令或數(shù)據(jù)信息。根據(jù)要求,我們要在上面一行顯示“scancode:*”,第二行顯示:“asciicode:*”。在顯示這些字符之前,必須先做以下準(zhǔn)備:1.開顯示 2.使指針自加1 3.清屏 4.設(shè)

16、置顯示模式(這里用5*7顯示模式)。做完這幾步工作才可以傳遞數(shù)據(jù)。首先給lcd一個指令,讓指針指到第一行的第一個點(diǎn)陣(當(dāng)然,如果不想從第一個點(diǎn)陣開始顯示,也可以把指針指到其它地方)。在下一個時(shí)鐘到來時(shí),就要依次把“scancode:”這幾個字符的ascii值賦給數(shù)據(jù)端口,接下來就該顯示掃描碼值了。顯示掃描碼的值比較麻煩,因?yàn)閽呙璐a是提前未知的,所以我們還得先解碼。做這部分的工作和led顯示部分一樣,也是要提前先建立一個對照表,求出掃描碼和ascii碼的高四位和低四位對應(yīng)的是0到f之間的哪一個數(shù)據(jù),不同的是不再把數(shù)據(jù)對應(yīng)的段選信號賦給對應(yīng)的變量了,而是把數(shù)據(jù)所對應(yīng)的ascii碼值賦給變量。因?yàn)閘

17、cd要接收ascii碼值然后顯示ascii值對應(yīng)的字符。有了這部分工作,當(dāng)輪到顯示掃描碼時(shí),就要把前面得到的掃描碼高、低四位對應(yīng)數(shù)據(jù)的ascii碼送到數(shù)據(jù)端口就行了。掃描碼顯示完后,就該顯示ascii碼了,這時(shí)指針不能自加1了,而應(yīng)該跳到下一行顯示。所以應(yīng)該把下一行第一個點(diǎn)陣的地址賦給數(shù)據(jù)端口,然后再依次把“asciicode:”這幾個字符的ascii碼值賦給數(shù)據(jù)端口,然后再把a(bǔ)scii碼高、低四位對應(yīng)數(shù)據(jù)的ascii碼值送到數(shù)據(jù)端口,這樣就可以顯示出ascii碼的數(shù)據(jù)了。6.設(shè)計(jì)頂層文件 當(dāng)前面四個模塊都設(shè)計(jì)完成以后,就可以設(shè)計(jì)頂層文件了,也就是把相應(yīng)的模塊連接起來。在這里我們用端口映射的方

18、法。具體鏈接在這里就不再贅述了。頂層文件設(shè)計(jì)完成后,整體編譯一遍,然后進(jìn)行rtl級仿真,便得到如下所示的硬件連接電路:結(jié)束語本次的ps2鍵盤接口設(shè)計(jì),總的來說,實(shí)現(xiàn)了4大功能:1,用fpga控制ps2鍵盤接口,接收鍵盤發(fā)出的掃描碼數(shù)據(jù)2.把接收到的掃描碼轉(zhuǎn)換成ascii碼3.把掃描碼和ascii碼顯示在數(shù)碼管上4.把掃描碼和ascii碼顯示在lcd液晶上。這四個功能的設(shè)計(jì),基本上涵蓋了平時(shí)講課的大部分內(nèi)容。對我們來說這是一次很好的鍛煉機(jī)會,也使我們對實(shí)際系統(tǒng)的設(shè)計(jì)掌握了一定的經(jīng)驗(yàn),提升了我們對這門課的理解,同時(shí)培養(yǎng)了我們編程和寫論文的能力。回想自己所設(shè)計(jì)的程序,里面還有很多瑕疵,比如顯示掃描碼

19、時(shí)部分,每顯示一個鍵需要接收至少3個字節(jié)(按下時(shí)鍵盤發(fā)出一個字節(jié)的通碼,彈起時(shí)發(fā)送兩個字節(jié)的斷碼)的數(shù)據(jù),比如顯示大寫字母a的一串掃描碼為12,1c,f0,1c,f0,12。這5個掃描碼將會分別顯示在數(shù)碼管和液晶上,而其實(shí)我們更希望只顯示1c。想改進(jìn)的話可以在掃描碼轉(zhuǎn)換為ascii碼部分,把最后得到的ascii碼再反過來求出按鍵的掃描碼,這樣又要建立一個大的對照表,但目前也只能想到這個方法,而且比較麻煩,所以不再設(shè)計(jì)。另外,根據(jù)所設(shè)計(jì)的程序的功能,只有當(dāng)按鍵彈起時(shí)才能把按鍵的信息顯示出來,而實(shí)際上我們希望當(dāng)按住鍵不放時(shí)也能顯示鍵值信息。更多需要改進(jìn)的地方這里就不再列舉了??傊@次的設(shè)計(jì)真的使

20、我受益匪淺。參考文獻(xiàn)1 侯伯亨,劉凱,顧新. vhdl硬件描述語言與數(shù)字邏輯電路設(shè)計(jì)【m】.西安:西安電子科技大學(xué)出版社,20092 劉勇 ,王玉晶,曲斌,于洋.1種嵌入式 pc 非標(biāo)準(zhǔn)鍵盤的設(shè)計(jì)【m】.微計(jì)算機(jī)信息,2007,23-1:8788。3 苗新法,王秀華.ps2鍵盤在嵌入式系統(tǒng)中的應(yīng)用研究【m】.蘭州:蘭州交通大學(xué)學(xué)報(bào)(自然科學(xué)版), 2007(1).4 徐曉 , 汪道輝 .標(biāo)準(zhǔn)ps2鍵盤與單片機(jī)的接口設(shè)計(jì)【j】.中國測試技術(shù), 2005(1).5 王勇.電子設(shè)計(jì)自動化實(shí)驗(yàn)指導(dǎo)書【m】.河南科技大學(xué):電子信息工程學(xué)院,2009.電路設(shè)計(jì)源程序:-接收鍵盤發(fā)出的掃描碼library

21、ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity keyboard isport(k_data:in std_logic; k_clock:in std_logic; rst:in std_logic; datascan:out std_logic_vector(7 downto 0); interrupt1:out std_logic);end keyboard;architecture one of keyboard is signal t

22、mpdata:std_logic_vector(11 downto 0):=000000000000; signal flag:std_logic; signal count:integer range 0 to 11;beginprocess(rst,k_clock)begin if(rst=1)then count=0; elsif(k_clockevent and k_clock=0)then if(count=11)then count=0;else count=count+1;tmpdata(count)=k_data;end if; end if;end process;proce

23、ss(count)begin if(count=10)then flag=1; else flag=0; end if;end process;process(flag,rst)begin if(rst=1)then interrupt1=0; elsif(flagevent and flag=1)then interrupt1=1;datascan=tmpdata(8 downto 1); end if;end process;end;-把掃描碼轉(zhuǎn)換成ascii碼library ieee;use ieee.std_logic_1164.all;entity dff isport(clk:in

24、 std_logic; d:in std_logic; q:out std_logic);end dff;architecture one of dff is signal tmp:std_logic;begin process(clk) beginif(clkevent and clk=1)thentmp=d;end if; end process; q=tmp;end;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity con

25、vert isport(scan:in std_logic_vector(7 downto 0); rst:in std_logic; clk:in std_logic; dataascii:out std_logic_vector(7 downto 0); interrupt2:out std_logic);end convert;architecture one of convert issignal tmpascii:integer range 0 to 16#7f#;signal ascii:std_logic_vector(7 downto 0);signal duanma_d:st

26、d_logic:=0;signal shifted_d:std_logic:=0;signal capslocked_d:std_logic:=0;signal duanma:std_logic:=0;signal shifted:std_logic:=0;signal capslocked:std_logic:=0;signal flag:std_logic;component dff isport(clk:in std_logic; d:in std_logic; q:out std_logic);end component;beginduanma_d=1 when scan=xf0els

27、e 0;shifted_d=0 when rst=1 elsenot shifted when(scan=x12 or scan=x59)elseshifted;capslocked_d=0 when rst=1 elsenot capslocked when(scan=x58 and duanma=1)elsecapslocked; tmpascii=16#09# when scan=00001101 else16#60# when scan=00001110 and shifted=0 else16#7e# when scan=00001110 and shifted=1 else16#5

28、1# when scan=00010101 else16#31# when scan=00010110 and shifted=0 else16#21# when scan=00010110 and shifted=1 else16#5a# when scan=00011010 else16#53# when scan=00011011 else16#41# when scan=00011100 else16#57# when scan=00011101 else16#32# when scan=00011110 and shifted=0 else16#40# when scan=00011

29、110 and shifted=1 else16#43# when scan=00100001 else16#58# when scan=00100010 else16#44# when scan=00100011 else16#45# when scan=00100100 else16#34# when scan=00100101 and shifted=0 else16#24# when scan=00100101 and shifted=1 else16#33# when scan=00100101 and shifted=0 else16#23# when scan=00100101

30、and shifted=1 else16#20# when scan=00101001 else16#56# when scan=00101010 else16#46# when scan=00101011 else16#54# when scan=00101100 else16#52# when scan=00101101 else16#35# when scan=00101110 and shifted=0 else16#25# when scan=00101110 and shifted=1 else16#4e# when scan=00110001 else16#42# when sc

31、an=00110010 else16#48# when scan=00110011 else16#47# when scan=00110100 else16#59# when scan=00110101 else16#36# when scan=00110110 and shifted=0 else16#5e# when scan=00110110 and shifted=1 else16#4d# when scan=00111010 else16#4a# when scan=00111011 else16#55# when scan=00111100 else16#37# when scan

32、=00111101 and shifted=0 else16#26# when scan=00111101 and shifted=1 else16#38# when scan=00111110 and shifted=0 else16#2a# when scan=00111110 and shifted=1 else16#2c# when scan=01000001 and shifted=0 else16#3c# when scan=01000001 and shifted=1 else16#4b# when scan=01000010 else16#49# when scan=01000

33、011 else16#4f# when scan=01000100 else16#30# when scan=01000101 and shifted=0 else16#29# when scan=01000101 and shifted=1 else16#39# when scan=01000110 and shifted=0 else16#28# when scan=01000110 and shifted=1 else16#2e# when scan=01001001 and shifted=0 else16#3e# when scan=01001001 and shifted=1 el

34、se16#2f# when scan=01001010 and shifted=0 else16#3f# when scan=01001010 and shifted=1 else16#4c# when scan=01001101 else16#3b# when scan=01001100 and shifted=0 else16#3a# when scan=01001100 and shifted=1 else16#50# when scan=01001101 else16#2d# when scan=01001110 and shifted=0 else16#5f# when scan=0

35、1001110 and shifted=1 else16#27# when scan=01010010 and shifted=0 else16#22# when scan=01010010 and shifted=1 else16#5b# when scan=01010100 and shifted=0 else16#7b# when scan=01010100 and shifted=1 else16#3d# when scan=01010101 and shifted=0 else16#2b# when scan=01010101 and shifted=1 else16#0d# whe

36、n scan=01011010 else16#5d# when scan=01011011 and shifted=0 else16#7d# when scan=01011011 and shifted=1 else16#5c# when scan=01011101 and shifted=0 else16#7c# when scan=01011101 and shifted=1 else16#08# when scan=01100110 else16#1b# when scan=01110110; ascii16#40#) and (tmpascii=16#5a#)and duanma=1

37、else conv_std_logic_vector(tmpascii,8)when duanma=1 else 10000000;u1:dff port map(clk,duanma_d,duanma);u2:dff port map(clk,shifted_d,shifted);u3:dff port map(clk,capslocked_d,capslocked);process(rst,clk)beginif(rst=0)then if(clkevent and clk=0)then if(ascii(6 downto 0)/=0000000)then flag=1; else fla

38、g=0; end if; end if;end if;end process;process(flag)beginif(flag=1)then dataascii=ascii; interrupt2=1;else interrupt2=0;end if;end process;end;-把掃描碼和ascii碼顯示在led數(shù)碼管上library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity leddisp isport(rst:in std_logic; enabl:in std_logic; cl

39、k:in std_logic; data_scan:in std_logic_vector(7 downto 0); data_ascii:in std_logic_vector(7 downto 0); sg:out std_logic_vector(6 downto 0);end;architecture one of leddisp issignal data_scan_h:std_logic_vector(3 downto 0);signal data_scan_l:std_logic_vector(3 downto 0);signal data_ascii_h:std_logic_v

40、ector(3 downto 0);signal data_ascii_l:std_logic_vector(3 downto 0);signal cnt:std_logic_vector(1 downto 0);signal a,b,c,d:std_logic_vector(6 downto 0);begin process(rst,enabl)beginif(rst=0)then if(clkevent and clk=1)then data_scan_h=data_scan(7 downto 4); data_scan_l=data_scan(3 downto 0); data_asci

41、i_h=data_ascii(7 downto 4); data_ascii_laaaaaaaaaaaaaaaanull; end case; case data_scan_l iswhen 0000 =bbbbbbbbbbbbbbbbnull; end case; case data_ascii_h iswhen 0000 =ccccccccccccccccnull; end case; case data_ascii_l iswhen 0000 =ddddddddddddddddnull; end case;end process; process(enabl,clk) beginif(r

42、st=1)then cnt=00;elsif(clkevent and clk=1)then if(cnt=11)then cnt=00; else cntsgsgsgsgnull; end case;end if; end process;end;-把掃描碼和ascii碼顯示在led液晶上library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity lcddisp isport(rst:in std_logic; clk:in std_logic; enabl:in std_logic; data_scan:in std_logic_vector(7 downto 0); data_ascii:in std_logic_vector(7 downto 0); data:out std_logic_vecto

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論