<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 牛人業(yè)話 > 小梅哥和你一起深入學(xué)習(xí)FPGA之PS2鍵盤驅(qū)動

          小梅哥和你一起深入學(xué)習(xí)FPGA之PS2鍵盤驅(qū)動

          作者: 時間:2015-08-18 來源:網(wǎng)絡(luò) 收藏

            在我們的電子系統(tǒng)中,當(dāng)需要用到大量的按鍵輸入時,普通的獨立按鍵和矩陣鍵盤已經(jīng)無法滿足我們的輸入需求,這個時候,我們需要使用一種功能更加強大的鍵盤,來幫助我們輸入更多的信息。在pc機上,我們經(jīng)常使用104鍵的鍵盤,這種鍵盤與pc機的接口,可分為USB接口和接口,我們要實現(xiàn)USB接口比較困難,因為USB的接口線路,不是標(biāo)準(zhǔn)的TTL電平,而接口,則使用標(biāo)準(zhǔn)的TTL電平,那么我們今天就使用來解碼驅(qū)動一個采用接口的pc機鍵盤,用這個鍵盤來擴展我們的輸入系統(tǒng),以使我們能夠方便的輸入更多的信息。

          本文引用地址:http://www.ex-cimer.com/article/278903.htm

            一、 實驗?zāi)康?/strong>

            實現(xiàn)采用PS2協(xié)議的PC機鍵盤的解碼,最終將PS2鍵盤作為FPGA系統(tǒng)的一個標(biāo)準(zhǔn)輸入設(shè)備。

            二、 實驗原理

            PS2鍵盤的內(nèi)部結(jié)構(gòu)我們不需要過多的去關(guān)注,我們只需要關(guān)心其接口協(xié)議,正確的解碼其發(fā)送過來的按鍵信息即可,至于解碼到的按鍵信息該怎么處理,不同的應(yīng)用有不同的處理方式,這里就不做過多的介紹。PS2協(xié)議的簡單描述如下:

            PS2協(xié)議總共由兩根線組成,一根時鐘線和一根數(shù)據(jù)線。這里我們將采用PS2協(xié)議的鍵盤稱為從機,將控制和解碼PS2協(xié)議的一方成為主機,生活中最常見的主機便是我們的PC機。PS2總線協(xié)議的兩根線中,時鐘線傳輸時鐘信號,該時鐘信號始終由從機,即鍵盤產(chǎn)生。PS2協(xié)議發(fā)送一個字節(jié)的數(shù)據(jù)總共有11位,分別為

            1位起始位

            8位數(shù)據(jù)位

            1位校驗位

            1位停止位

            PS2從機發(fā)送一個完整數(shù)據(jù)包的時序圖如下所示:

            

           

            圖2-1 PS2從機發(fā)送數(shù)據(jù)時序圖

            相信熟悉UART協(xié)議的同學(xué)一眼就能看出來,PS2協(xié)議和我們最熟悉的UART通信協(xié)議非常相似,那么我們的工作就簡單了,既然鍵盤按照這個協(xié)議發(fā)送數(shù)據(jù),我們FPGA作為主機,只需要正確的實現(xiàn)該協(xié)議的解碼,將其中的8位數(shù)據(jù)位讀取出來即可。由圖可知,數(shù)據(jù)在時鐘的下降沿處是穩(wěn)定的,因此我們只需要去捕獲時鐘信號的下降沿,并在檢測到這個下降沿時去讀取數(shù)據(jù)線上的電平,就能夠正確的讀到數(shù)據(jù)。

            以上是PS2協(xié)議中從機到主機的一個通訊過程,實際在PS2協(xié)議中,包含了從機到主機和主機到從機的通信時序,只是在我們進行PS2鍵盤的解碼時,可以不需要進行主機到從機的通信,因此這部分內(nèi)容小梅哥就不在這里講解了,如果大家以后要解碼PS2鼠標(biāo)的話,就會用到主機到從機的通信了。

            上面只是簡單的介紹了PS2從機到主機的通信協(xié)議,我們知道了鍵盤是一個字節(jié)一個字節(jié)的往主機發(fā)送數(shù)據(jù)的,但是,每個字節(jié)代表了什么內(nèi)容呢,我們還需要對照鍵盤編碼對照表來查看。

            

           

            鍵盤掃描碼分為第一套掃描碼、第二套掃描碼和第三套掃描碼,我們?nèi)粘I钪谐R姷膾呙璐a絕大多數(shù)采用第二套掃描碼,因此這里小梅哥就只附上第二套掃描碼的內(nèi)容。

            實際一個按鍵由按下到釋放時鍵盤將按照如下的規(guī)定往主機發(fā)送數(shù)據(jù):

            只要一個鍵被按下,這個鍵的通碼(MAKE)就被發(fā)送到計算機。通碼只表示鍵盤上的一個按鍵,它不表示印刷在按鍵上的那個字符。 這就意味著在通碼和ASCII碼之間沒有已定義好的關(guān)聯(lián), 直到主機把掃描碼翻譯成一個字符或命令。

            雖然多數(shù)第二套通碼都只有一個字節(jié)寬,但也有少數(shù)“ 擴展按鍵”的通碼是兩字節(jié)或四字節(jié)寬,這類的通碼第一個字節(jié)總是為E0H(如“END”、“HOME”……)。正如鍵按下通碼就被發(fā)往計算機一樣, 只要鍵一釋放, 斷碼就會被發(fā)送。每個鍵都有它自己唯一的通碼,它們也都有唯一的斷碼。 幸運的是,你不用總是通過查表來找出按鍵的斷碼―― 在通碼和斷碼之間存在著必然的聯(lián)系。 多數(shù)第二套斷碼有兩字節(jié)長,它們的第一個字節(jié)是F0H, 第二個字節(jié)是這個鍵的通碼。

            例如,當(dāng)我們按下鍵盤上的“A”鍵時,鍵盤就會往主機發(fā)送”A”鍵對應(yīng)的通碼(MAKE)”1C”,如果你一直按下這個按鍵不釋放,那么在一個短暫的延時之后,鍵盤會再次開始,以一定的速率持續(xù)向主機發(fā)送”1C“,直到該按鍵被釋放。在該按鍵被釋放后,鍵盤將會向主機發(fā)送“A ”的斷碼(Break),即首先發(fā)送“F0”,然后下一個字節(jié)再馬上發(fā)送“1C”。

            如果我們按下的是“END”、“PAGE UP”等擴展按鍵時,會怎么樣呢?這里,以”END”鍵舉例。當(dāng)”END“鍵被按下后,鍵盤會首先向主機發(fā)送“E0”,發(fā)送完成后,又會接著發(fā)送下一個字節(jié)“69”,釋放時也與前面的普通按鍵類似,先發(fā)送“E0”,然后發(fā)送“F0”,最后再發(fā)送“69”。

            由上述分析可知,我們FPGA在解碼到一次數(shù)據(jù)后,還需要對這個數(shù)據(jù)進行分析判斷,判斷該數(shù)據(jù)是否為斷碼標(biāo)志“F0”以及擴展碼標(biāo)志”E0“。

            三、 硬件設(shè)計

            PS2電路結(jié)構(gòu)簡單,因此這里就略去。

            四、 架構(gòu)設(shè)計

            本實驗我們進行PS2鍵盤的解碼實驗,并將解碼到的結(jié)果顯示在數(shù)碼管上,同時,為了使我們更加直觀的感受到按鍵被按下和釋放,小梅哥在這里增加了一個蜂鳴器,當(dāng)有按鍵按下或釋放(包括長按時每接收到一個通碼)時,蜂鳴器發(fā)出一個短暫的響聲,來反饋給操作者,讓我們知道我們的解碼模塊解碼到了按鍵信息。設(shè)計結(jié)構(gòu)如下圖所示:

            

           

            圖4-1 led實驗?zāi)K組織結(jié)構(gòu)圖

            詳細端口名及其意義如下

            

           

            表4-1 獨立按鍵檢測實驗端口說明

            因為存在模塊間的連接,因此有部分內(nèi)部信號,下表為內(nèi)部信號的名稱和功能說明

            

           

            表4-2 獨立按鍵檢測實驗內(nèi)部信號說明

          fpga相關(guān)文章:fpga是什么


          蜂鳴器相關(guān)文章:蜂鳴器原理

          上一頁 1 2 下一頁

          關(guān)鍵詞: FPGA PS2

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();