時間:2018-08-16 11:55:37來源:網(wǎng)絡轉(zhuǎn)載
1設計背景:
矩陣鍵盤在工程設計越來越多的被用到,已然成為了我們做開發(fā)接觸到的不可缺少的小型項目,利于我們理解設計方向的原理為以后的強化學習打好了堅實的基礎。
2設計原理:
在使用按鍵的時候,如果按鍵不多的話,我們可以直接按鍵與FPGA相連接,但是如果按鍵比較多的時候,如何還繼續(xù)使用直接按鍵與FPGA相連接的話,所會大量增加FPGA端口的消耗,為了減少FPGA端口的消
耗,我們可以把按鍵設計成矩陣的形式,就如下圖所示:
由上圖可以知道,矩陣鍵盤的行row(行)與col(列)的交點,都是通過一個按鍵來相連接。
傳統(tǒng)的一個按鍵一個端口的方法,若要實現(xiàn)16個按鍵,則需要16個端口,而現(xiàn)在這個矩陣鍵盤的設計,16個按鍵,僅僅需要8個端口,如果使用16個端口來做矩陣鍵盤的話,可以識別64個按鍵,端口的利用率遠遠比傳統(tǒng)的設計好的多,所以如果需要的按鍵少的話,可以選擇傳統(tǒng)的按鍵設計,如果需要的按鍵比較多的話,可以采用這種矩陣鍵盤的設計。
而我們現(xiàn)在就以掃描法為例來介紹矩陣鍵盤的工作原理。
首先col(列)是FPGA給矩陣鍵盤輸出的掃描信號,而row(行)是矩陣鍵盤反饋給FPGA的輸入信號,用于檢測哪一個按鍵被按下來,如下圖所示:
詳細如上圖所示,F(xiàn)PGA給出掃描信號COL[3:0],COL=4’b0111,等下一個時鐘周期COL=4’b1011,再等下一個時鐘周期COL=4’b1101,再等下一個時鐘周期COL=4’b1110,再等下一個時鐘周期COL=4’b0111,COL就是這樣不斷循環(huán),給矩陣鍵盤一個低電平有效的掃描信號,當FPGA給矩陣鍵盤COL掃描信號的同時,F(xiàn)PGA也要在檢測矩陣鍵盤給FPGA的的反饋信號ROW,舉個例子,假若矩陣鍵盤中的9號案件被按下了:
當COL=4’b1101,ROW=4’b1011;
當9號按鍵被按下的時候,9號按鍵的電路就會被導通,掃描電路COL開始掃描,當掃描到COL[1]的時候,由于9號按鍵的電路被導通了,COL[1]的電壓等于ROW[2]的電壓,所以會出現(xiàn)當COL=4’b1101的時候ROW=4’b1011;然后我們就可以利用這一種現(xiàn)象,來設計一個識別按鍵的電路。
3設計架構圖:
4設計代碼:
設計模塊
0modulekey_borad(clk,rst_n,row,col,key_num);
1inputclk;
2inputrst_n;
3input[3:0]row;//輸入反饋信號
4
5
6outputreg[3:0]col;//輸出掃描信號
7outputreg[3:0]key_num;//按鍵值得輸除
8
9reg[15:0]count;
10
11parameterT1ms=50000;//掃描的時間間隔50000*20ns
12//parameterT1ms=5;
13
14regflag;
15always@(posedgeclkornegedgerst_n)
16if(!rst_n)
17begin
18count<=16'd0;
19flag<=1'b0;
20end
21else
22begin
23if(count
24begin
25count<=count+1'b1;
26flag<=0;
27end
28else
29begin
30flag<=1'b1;//計數(shù)到了就給一個標志位
31count<=16'b0;
32end
33end
34always@(posedgeclkornegedgerst_n)
35if(!rst_n)
36begin
37col<=4'b0111;
38end
39else
40begin
41if(flag)
42col<={col[2:0],col[3]};//列掃描
43else
44col<=col;
45end
46
47//鍵值得翻譯模塊
48always@(posedgeclkornegedgerst_n)
49if(!rst_n)
50key_num=4'd0;
51else
52case({row,col})//位拼接行和列的信號,翻譯出對應的鍵值
538'b0111_0111:key_num=4'hf;
548'b0111_1011:key_num=4'he;
558'b0111_1101:key_num=4'hd;
568'b0111_1110:key_num=4'hc;
57
588'b1011_0111:key_num=4'hb;
598'b1011_1011:key_num=4'ha;
608'b1011_1101:key_num=4'h9;
618'b1011_1110:key_num=4'h8;
62
638'b1101_0111:key_num=4'h7;
648'b1101_1011:key_num=4'h6;
658'b1101_1101:key_num=4'h5;
668'b1101_1110:key_num=4'h4;
67
688'b1110_0111:key_num=4'h3;
698'b1110_1011:key_num=4'h2;
708'b1110_1101:key_num=4'h1;
718'b1110_1110:key_num=4'h0;
72default:;
73endcase
74endmodule
測試模塊
0`timescale1ns/1ps
1
2modulekey_borad_tb();
3regclk;
4regrst_n;
5reg[4:0]pressnum;//按鍵的值
6wire[3:0]row;
7
8wire[3:0]col;
9wire[3:0]key_num;//輸出的值
10
11initialbegin
12clk=1'b1;
13rst_n=1'b0;
14pressnum=5'd16;
15
16#200.1
17rst_n=1'b1;
18#1000
19pressnum=5'd16;
20
21#1000
22pressnum=5'd8;
23
24#1000
25pressnum=5'd16;
26
27#1000
28pressnum=5'd15;
29#1000
30pressnum=5'd16;
31#1000
32$stop;
33
34end
35always#10clk=~clk;
36//例化對應的模塊
37key_topborad_dut(
38.clk(clk),
39.rst_n(rst_n),
40.row(row),
41.col(col),
42.key_num(key_num)
43);
44yingjianyingjian_dut(//硬件檢測電路//此模塊自己可以設計
45.clk(clk),
46.rst_n(rst_n),
47.col(col),
48.row(row),
49.pressnum(pressnum)
50);
51endmodule
仿真圖:
在仿真圖中可以清晰的看出當按鍵按下的時候為8,顯示出來的鍵值也為8,當抬起的時候為16,那么鍵值就保持不變,在設置的時候我們設置的是按鍵抬起為16,通過驗證我們得到我們的設計是正確的。
標簽:
上一篇:淺析傳感器在智能時代的應用
中國傳動網(wǎng)版權與免責聲明:凡本網(wǎng)注明[來源:中國傳動網(wǎng)]的所有文字、圖片、音視和視頻文件,版權均為中國傳動網(wǎng)(www.connectcrack.com)獨家所有。如需轉(zhuǎn)載請與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個人轉(zhuǎn)載使用時須注明來源“中國傳動網(wǎng)”,違反者本網(wǎng)將追究其法律責任。
本網(wǎng)轉(zhuǎn)載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權屬于原版權人。轉(zhuǎn)載請保留稿件來源及作者,禁止擅自篡改,違者自負版權法律責任。
相關資訊
產(chǎn)品新聞
更多>2025-05-19
2025-04-30
性能躍升20%!維宏NK300CX Plus數(shù)控系統(tǒng)...
2025-04-11
2025-04-08
【產(chǎn)品解讀】全面提升精密制造檢測節(jié)拍...
2025-03-31
應用案例 | 使用宏集TELE監(jiān)控繼電器監(jiān)控...
2025-03-26