小梅哥和你一起深入學(xué)習FPGA之PS2鍵盤(pán)驅動(dòng)
在我們的電子系統中,當需要用到大量的按鍵輸入時(shí),普通的獨立按鍵和矩陣鍵盤(pán)已經(jīng)無(wú)法滿(mǎn)足我們的輸入需求,這個(gè)時(shí)候,我們需要使用一種功能更加強大的鍵盤(pán),來(lái)幫助我們輸入更多的信息。在pc機上,我們經(jīng)常使用104鍵的鍵盤(pán),這種鍵盤(pán)與pc機的接口,可分為USB接口和PS2接口,我們FPGA要實(shí)現USB接口比較困難,因為USB的接口線(xiàn)路,不是標準的TTL電平,而PS2接口,則使用標準的TTL電平,那么我們今天就使用FPGA來(lái)解碼驅動(dòng)一個(gè)采用PS2接口的pc機鍵盤(pán),用這個(gè)鍵盤(pán)來(lái)擴展我們FPGA的輸入系統,以使我們能夠方便的輸入更多的信息。
本文引用地址:http://dyxdggzs.com/article/278903.htm一、 實(shí)驗目的
實(shí)現采用PS2協(xié)議的PC機鍵盤(pán)的解碼,最終將PS2鍵盤(pán)作為FPGA系統的一個(gè)標準輸入設備。
二、 實(shí)驗原理
PS2鍵盤(pán)的內部結構我們不需要過(guò)多的去關(guān)注,我們只需要關(guān)心其接口協(xié)議,正確的解碼其發(fā)送過(guò)來(lái)的按鍵信息即可,至于解碼到的按鍵信息該怎么處理,不同的應用有不同的處理方式,這里就不做過(guò)多的介紹。PS2協(xié)議的簡(jiǎn)單描述如下:
PS2協(xié)議總共由兩根線(xiàn)組成,一根時(shí)鐘線(xiàn)和一根數據線(xiàn)。這里我們將采用PS2協(xié)議的鍵盤(pán)稱(chēng)為從機,將控制和解碼PS2協(xié)議的一方成為主機,生活中最常見(jiàn)的主機便是我們的PC機。PS2總線(xiàn)協(xié)議的兩根線(xiàn)中,時(shí)鐘線(xiàn)傳輸時(shí)鐘信號,該時(shí)鐘信號始終由從機,即鍵盤(pán)產(chǎn)生。PS2協(xié)議發(fā)送一個(gè)字節的數據總共有11位,分別為
1位起始位
8位數據位
1位校驗位
1位停止位
PS2從機發(fā)送一個(gè)完整數據包的時(shí)序圖如下所示:

圖2-1 PS2從機發(fā)送數據時(shí)序圖
相信熟悉UART協(xié)議的同學(xué)一眼就能看出來(lái),PS2協(xié)議和我們最熟悉的UART通信協(xié)議非常相似,那么我們的工作就簡(jiǎn)單了,既然鍵盤(pán)按照這個(gè)協(xié)議發(fā)送數據,我們FPGA作為主機,只需要正確的實(shí)現該協(xié)議的解碼,將其中的8位數據位讀取出來(lái)即可。由圖可知,數據在時(shí)鐘的下降沿處是穩定的,因此我們只需要去捕獲時(shí)鐘信號的下降沿,并在檢測到這個(gè)下降沿時(shí)去讀取數據線(xiàn)上的電平,就能夠正確的讀到數據。
以上是PS2協(xié)議中從機到主機的一個(gè)通訊過(guò)程,實(shí)際在PS2協(xié)議中,包含了從機到主機和主機到從機的通信時(shí)序,只是在我們進(jìn)行PS2鍵盤(pán)的解碼時(shí),可以不需要進(jìn)行主機到從機的通信,因此這部分內容小梅哥就不在這里講解了,如果大家以后要解碼PS2鼠標的話(huà),就會(huì )用到主機到從機的通信了。
上面只是簡(jiǎn)單的介紹了PS2從機到主機的通信協(xié)議,我們知道了鍵盤(pán)是一個(gè)字節一個(gè)字節的往主機發(fā)送數據的,但是,每個(gè)字節代表了什么內容呢,我們還需要對照鍵盤(pán)編碼對照表來(lái)查看。

鍵盤(pán)掃描碼分為第一套掃描碼、第二套掃描碼和第三套掃描碼,我們日常生活中常見(jiàn)的掃描碼絕大多數采用第二套掃描碼,因此這里小梅哥就只附上第二套掃描碼的內容。
實(shí)際一個(gè)按鍵由按下到釋放時(shí)鍵盤(pán)將按照如下的規定往主機發(fā)送數據:
只要一個(gè)鍵被按下,這個(gè)鍵的通碼(MAKE)就被發(fā)送到計算機。通碼只表示鍵盤(pán)上的一個(gè)按鍵,它不表示印刷在按鍵上的那個(gè)字符。 這就意味著(zhù)在通碼和ASCII碼之間沒(méi)有已定義好的關(guān)聯(lián), 直到主機把掃描碼翻譯成一個(gè)字符或命令。
雖然多數第二套通碼都只有一個(gè)字節寬,但也有少數“ 擴展按鍵”的通碼是兩字節或四字節寬,這類(lèi)的通碼第一個(gè)字節總是為E0H(如“END”、“HOME”……)。正如鍵按下通碼就被發(fā)往計算機一樣, 只要鍵一釋放, 斷碼就會(huì )被發(fā)送。每個(gè)鍵都有它自己唯一的通碼,它們也都有唯一的斷碼。 幸運的是,你不用總是通過(guò)查表來(lái)找出按鍵的斷碼―― 在通碼和斷碼之間存在著(zhù)必然的聯(lián)系。 多數第二套斷碼有兩字節長(cháng),它們的第一個(gè)字節是F0H, 第二個(gè)字節是這個(gè)鍵的通碼。
例如,當我們按下鍵盤(pán)上的“A”鍵時(shí),鍵盤(pán)就會(huì )往主機發(fā)送”A”鍵對應的通碼(MAKE)”1C”,如果你一直按下這個(gè)按鍵不釋放,那么在一個(gè)短暫的延時(shí)之后,鍵盤(pán)會(huì )再次開(kāi)始,以一定的速率持續向主機發(fā)送”1C“,直到該按鍵被釋放。在該按鍵被釋放后,鍵盤(pán)將會(huì )向主機發(fā)送“A ”的斷碼(Break),即首先發(fā)送“F0”,然后下一個(gè)字節再馬上發(fā)送“1C”。
如果我們按下的是“END”、“PAGE UP”等擴展按鍵時(shí),會(huì )怎么樣呢?這里,以”END”鍵舉例。當”END“鍵被按下后,鍵盤(pán)會(huì )首先向主機發(fā)送“E0”,發(fā)送完成后,又會(huì )接著(zhù)發(fā)送下一個(gè)字節“69”,釋放時(shí)也與前面的普通按鍵類(lèi)似,先發(fā)送“E0”,然后發(fā)送“F0”,最后再發(fā)送“69”。
由上述分析可知,我們FPGA在解碼到一次數據后,還需要對這個(gè)數據進(jìn)行分析判斷,判斷該數據是否為斷碼標志“F0”以及擴展碼標志”E0“。
三、 硬件設計
PS2電路結構簡(jiǎn)單,因此這里就略去。
四、 架構設計
本實(shí)驗我們進(jìn)行PS2鍵盤(pán)的解碼實(shí)驗,并將解碼到的結果顯示在數碼管上,同時(shí),為了使我們更加直觀(guān)的感受到按鍵被按下和釋放,小梅哥在這里增加了一個(gè)蜂鳴器,當有按鍵按下或釋放(包括長(cháng)按時(shí)每接收到一個(gè)通碼)時(shí),蜂鳴器發(fā)出一個(gè)短暫的響聲,來(lái)反饋給操作者,讓我們知道我們的解碼模塊解碼到了按鍵信息。設計結構如下圖所示:

圖4-1 led實(shí)驗模塊組織結構圖
詳細端口名及其意義如下

表4-1 獨立按鍵檢測實(shí)驗端口說(shuō)明
因為存在模塊間的連接,因此有部分內部信號,下表為內部信號的名稱(chēng)和功能說(shuō)明

表4-2 獨立按鍵檢測實(shí)驗內部信號說(shuō)明
fpga相關(guān)文章:fpga是什么
蜂鳴器相關(guān)文章:蜂鳴器原理
評論