好久不見,因為博主最近兩個月有點事情,加上接著考試,考完試也有點事情要處理,最近才稍微閒了一些,這才趕緊記錄分享一篇博文。FPGA驅動4x4矩陣鍵盤。這個其實原理是十分簡單,但是由於博主做的時候遇到了一些有意思的情況,所以我個人覺得值得記錄分享一下。
首先找了本書看了下矩陣鍵盤的驅動原理,一般來說4x4矩陣鍵盤的原理圖如下,有四根行線和四根列線,行選通和列選通可以確定鍵盤上的一個位置。從原理圖上看出,在沒有操作的情況下,行線上接了一個10K的上拉電阻接vcc,這使得鍵盤在沒有按下時,四根行線始終是高電平。
列線是由處理器輸入給矩陣鍵盤,空閒狀態下保持為0。也就是行空閒時輸出給處理器為四個1,列空閒時由處理器輸入給四個0。
當按下按鍵時,比如第一行第一個按鍵,對應的那一行導通輸出為0,即row_data = 0111,此時由處理器逐漸輸入列掃描信號由col_data = 0111——1110,當所按下按鍵為對應的那一行列的按鍵,矩陣鍵盤的行才會導通輸出為0,否則會回到1111。其他按鍵類似,就是利用這個原理來驅動矩陣鍵盤。
最後FPGA部分模塊引腳設計如圖,我們需要對按鍵進行消抖,和普通按鍵一樣,採用20ms的延時對按鍵進行消抖,分為按下消抖和鬆開消抖,中間的狀態轉移,因為列信號需要輸出判斷行信號的變化,所以狀態機狀態轉移用兩個系統時鐘周期跳轉。採用狀態機進行描述,狀態轉移圖如下。
代碼如下:(點擊閱讀原文查看博客)
代碼部分其實沒啥好說的,有意思的是博主連接硬體做調試的時候,博主的矩陣鍵盤模塊如圖,薄膜鍵盤。某寶客服連原理圖都沒有,有一家給的我原理圖還是錯的。問題在於代碼第一次下載到板子上的時候,沒有出結果,不知道是代碼問題還是硬體電路連接問題,我也是試了好久才猜出來正確的連接順序。
這是,某寶客服給的錯的原理圖,先拿這個看一下,和這個矩陣鍵盤的構造差不多,從圖中可以看到這個圖和文章開頭的原理圖中少了點什麼,上拉電阻。這裡比較迷惑的是,如果沒有上拉電阻,在空閒狀態下,row_data怎麼能保持輸出高電平呢。問了幾個客服,有說不懂的有說不用加上拉電阻的。
我直接上板調試,在鍵盤的基礎上加了個數碼管顯示按下的數值。按下時發現是可以顯示正確的數字的,但是奇怪的是過一會兒數碼管顯示會清零。最開始以為是代碼的問題,檢查後從仿真和邏輯看,按鍵後解碼的數值其實是一直保持不變的,沒有操作是不會發生變化的,但實際情況不太符合。
這樣奇怪的情況發生,這個時候我們要相信科學。這種仿真發現不了問題,但實際運行卻又bug,這個沒法猜出來。在線邏輯分析儀就可以看到你的代碼在開發板上運行的情況,這裡引出Xilinx的Chipscope,用在線邏輯分析儀幾乎可以抓到你的代碼內部的所有信號,這個時候抓到的是你的電路實際運行的情況,配置流程如下。
新建New source界面,選擇如圖Chipscope,next。
然後會自動生成一個後綴為.cdc的文件,雙擊打開。
這一步點擊next
同樣next
這裡選擇,觸發信號的數量和位寬,我這裡選擇了三個觸發信號,兩個位寬為4,對應矩陣鍵盤的行和列,一個位寬為1,為復位信號。最後邊的滾輪下拉可以看到全部信號。
這裡設置抓取的信號深度,選擇上升沿採樣信號。完成後點擊next
這裡選擇時鐘信號clk
選擇後點擊make connection,OK。
同樣的選擇其他觸發信號,加入行和列和復位信號。
添加完成OK
點擊完成退出。
保存
這裡點擊這裡就會啟動Chipscope了,這個時候板子就可以上電了。
點擊連結板子
照圖點擊下載板子。
配置相關文件
然後會彈出這個窗口,這裡可以設置觸發類型和觸發方式,添加的信號都會顯示出來
設置觸發方式為M2,即復位信號。
點擊上面的按鈕開始運行,復位鍵釋放,就可以抓取到一部分信號了。
按下一個按鍵會看到對應的行列變換。
這是Chipscope的調用流程,通過在線邏輯分析儀,博主發現了問題,在空閒無操作時,觸發復位抓取信號,抓到的row_data有時候是1111。有時候是0000或其他,但是理論上矩陣鍵盤在無操作下應該一直row_data輸出1111。就是這個奇怪的問題導致的錯誤。我們要相信科學。應該是硬體電路的問題,檢查了與開發板連接的杜邦線沒問題後,應該就是矩陣鍵盤自己的問題,上拉電阻這塊的原理,我所使用的矩陣鍵盤沒有上拉電阻,但是實際上這樣的驅動,如果row_data線上沒有上拉電阻,它很難保持為高電平,而這個地方加不加其實和驅動開發板的構造有關,據我了解,有些單片機的I/O引腳會內置上拉電阻,默認情況下是高電平,所以用這些單片機驅動是不需要加上拉電阻的。
我這裡使用FPGA驅動,FPGA的引腳特性來說,還是需要加的,使矩陣鍵盤的信號輸出穩定,對於Xilinx FPGA來說有意思的是,通過綜合工具添加引腳約束可以啟動同樣的效果,比如在ucf文件的引腳電平約束中加上pullup就可以了。
由於我使用的Spartan-3E系列的開發板,從它手冊上可以得到。在引腳約束在電平為3.3v時加上pull up,可以等下出相當於10.8k歐姆的電阻這和矩陣鍵盤的驅動原理是完全相符。
這篇博文主要分享的是硬體的一個調試過程,Chipscope還是很好用的。對於硬體來說,你沒辦法確定他的狀態,所以使用工具抓取他的實際信號,幫助我們更好調試。