設(shè)計(jì)背景:
矩陣鍵盤(pán)在工程設(shè)計(jì)越來(lái)越多的被用到,已然成為了我們做開(kāi)發(fā)接觸到的不可缺少的小型項(xiàng)目,利于我們理解設(shè)計(jì)方向的原理為以后的強(qiáng)化學(xué)習(xí)打好了堅(jiān)實(shí)的基礎(chǔ)。
設(shè)計(jì)原理:
在使用按鍵的時(shí)候,如果按鍵不多的話,我們可以直接按鍵與FPGA相連接,但是如果按鍵比較多的時(shí)候,如何還繼續(xù)使用直接按鍵與FPGA相連接的話,所會(huì)大量增加FPGA端口的消耗,為了減少FPGA端口的消
耗,我們可以把按鍵設(shè)計(jì)成矩陣的形式,就如下圖所示:
由上圖可以知道,矩陣鍵盤(pán)的行row(行)與col(列)的交點(diǎn),都是通過(guò)一個(gè)按鍵來(lái)相連接。傳統(tǒng)的一個(gè)按鍵一個(gè)端口的方法,若要實(shí)現(xiàn)16個(gè)按鍵,則需要16個(gè)端口,而現(xiàn)在這個(gè)矩陣鍵盤(pán)的設(shè)計(jì),16個(gè)按鍵,僅僅需要8個(gè)端口,如果使用16個(gè)端口來(lái)做矩陣鍵盤(pán)的話,可以識(shí)別64個(gè)按鍵,端口的利用率遠(yuǎn)遠(yuǎn)比傳統(tǒng)的設(shè)計(jì)好的多,所以如果需要的按鍵少的話,可以選擇傳統(tǒng)的按鍵設(shè)計(jì),如果需要的按鍵比較多的話,可以采用這種矩陣鍵盤(pán)的設(shè)計(jì)。而我們現(xiàn)在就以掃描法為例來(lái)介紹矩陣鍵盤(pán)的工作原理。
首先col(列)是FPGA給矩陣鍵盤(pán)輸出的掃描信號(hào),而row(行)是矩陣鍵盤(pán)反饋給FPGA的輸入信號(hào),用于檢測(cè)哪一個(gè)按鍵被按下來(lái),如下圖所示:
詳細(xì)如上圖所示,FPGA給出掃描信號(hào)COL[3:0],COL = 4’b0111,等下一個(gè)時(shí)鐘周期COL = 4’b1011,再等下一個(gè)時(shí)鐘周期COL =4’b1101,再等下一個(gè)時(shí)鐘周期COL = 4’b1110,再等下一個(gè)時(shí)鐘周期COL = 4’b0111,COL就是這樣不斷循環(huán),給矩陣鍵盤(pán)一個(gè)低電平有效的掃描信號(hào),當(dāng)FPGA給矩陣鍵盤(pán)COL掃描信號(hào)的同時(shí),FPGA也要在檢測(cè)矩陣鍵盤(pán)給FPGA的的反饋信號(hào)ROW,舉個(gè)例子,假若矩陣鍵盤(pán)中的9號(hào)案件被按下了:
當(dāng) COL = 4’b1101,ROW =4’b1011 ;
當(dāng)9號(hào)按鍵被按下的時(shí)候,9號(hào)按鍵的電路就會(huì)被導(dǎo)通,掃描電路COL開(kāi)始掃描,當(dāng)掃描到COL[1]的時(shí)候,由于9號(hào)按鍵的電路被導(dǎo)通了,COL[1]的電壓等于ROW[2]的電壓,所以會(huì)出現(xiàn)當(dāng)COL = 4’b1101的時(shí)候ROW = 4’b1011;然后我們就可以利用這一種現(xiàn)象,來(lái)設(shè)計(jì)一個(gè)識(shí)別按鍵的電路。
設(shè)計(jì)架構(gòu)圖:
設(shè)計(jì)代碼:
設(shè)計(jì)模塊
0modulekey_borad(clk,rst_n,row,col,key_num);
1 inputclk;
2 inputrst_n;
3 input[3:0]row; //輸入反饋信號(hào)
4
5
6 outputreg[3:0]col; //輸出掃描信號(hào)
7 outputreg[3:0]key_num; //按鍵值得輸除
8
9 reg[15:0]count;
10
11 parameterT1ms =50000;//掃描的時(shí)間間隔 50000 * 20ns
12 //parameter T1ms = 5;
13
14 regflag;
15 always@(posedgeclk ornegedgerst_n)
16 if(!rst_n)
17 begin
18 count <=16'd0;
19 flag <=1'b0;
20 end
21 else
22 begin
23 if(count <T1ms -1)//計(jì)數(shù)時(shí)間
24 begin
25 count <=count +1'b1;
26 flag <=0;
27 end
28 else
29 begin
30 flag <=1'b1;//計(jì)數(shù)到了就給一個(gè)標(biāo)志位
31 count <=16'b0;
32 end
33 end
34 always@(posedgeclk ornegedgerst_n)
35 if(!rst_n)
36 begin
37 col <=4'b0111;
38 end
39 else
40 begin
41 if(flag)
42 col <={col[2:0],col[3]};//列掃描
43 else
44 col <=col;
45 end
46
47 //鍵值得翻譯模塊
48 always@(posedgeclk ornegedgerst_n)
49 if(!rst_n)
50 key_num =4'd0;
51 else
52 case({row,col}) //位拼接行和列的信號(hào),翻譯出對(duì)應(yīng)的鍵值
53 8'b0111_0111:key_num =4'hf;
54 8'b0111_1011:key_num =4'he;
55 8'b0111_1101:key_num =4'hd;
56 8'b0111_1110:key_num =4'hc;
57
58 8'b1011_0111:key_num =4'hb;
59 8'b1011_1011:key_num =4'ha;
60 8'b1011_1101:key_num =4'h9;
61 8'b1011_1110:key_num =4'h8;
62
63 8'b1101_0111:key_num =4'h7;
64 8'b1101_1011:key_num =4'h6;
65 8'b1101_1101:key_num =4'h5;
66 8'b1101_1110:key_num =4'h4;
67
68 8'b1110_0111:key_num =4'h3;
69 8'b1110_1011:key_num =4'h2;
70 8'b1110_1101:key_num =4'h1;
71 8'b1110_1110:key_num =4'h0;
72 default:;
73 endcase
74endmodule
測(cè)試模塊
0`timescale1ns/1ps
1
2modulekey_borad_tb();
3 regclk;
4 regrst_n;
5 reg[4:0]pressnum;//按鍵的值
6 wire[3:0]row;
7
8 wire[3:0]col;
9 wire[3:0]key_num;//輸出的值
10
11 initialbegin
12 clk =1'b1;
13 rst_n =1'b0;
14 pressnum =5'd16;
15
16 #200.1
17 rst_n =1'b1;
18 #1000
19 pressnum =5'd16;
20
21 #1000
22 pressnum =5'd8;
23
24 #1000
25 pressnum =5'd16;
26
27 #1000
28 pressnum =5'd15;
29 #1000
30 pressnum =5'd16;
31 #1000
32 $stop;
33
34 end
35 always#10clk =~clk;
36 //例化對(duì)應(yīng)的模塊
37 key_top borad_dut(
38 .clk(clk),
39 .rst_n(rst_n),
40 .row(row),
41 .col(col),
42 .key_num(key_num)
43 );
44 yingjian yingjian_dut(//硬件檢測(cè)電路 //此模塊自己可以設(shè)計(jì)
45 .clk(clk),
46 .rst_n(rst_n),
47 .col(col),
48 .row(row),
49 .pressnum(pressnum)
50 );
51endmodule
仿真圖:
在仿真圖中可以清晰的看出當(dāng)按鍵按下的時(shí)候?yàn)?/span>8,顯示出來(lái)的鍵值也為8,當(dāng)抬起的時(shí)候?yàn)?6,那么鍵值就保持不變,在設(shè)置的時(shí)候我們?cè)O(shè)置的是按鍵抬起為16,通過(guò)驗(yàn)證我們得到我們的設(shè)計(jì)是正確的。
-
FPGA
+關(guān)注
關(guān)注
1630文章
21798瀏覽量
606051 -
仿真
+關(guān)注
關(guān)注
50文章
4124瀏覽量
134002
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
至芯科技昭哥帶你學(xué)FPGA之FPGA_100天之旅_矩陣鍵盤(pán)設(shè)計(jì)
獨(dú)立鍵盤(pán)和矩陣鍵盤(pán)簡(jiǎn)析
基于FPGA開(kāi)發(fā)板的矩陣鍵盤(pán)實(shí)驗(yàn)設(shè)計(jì)與實(shí)現(xiàn)
單片機(jī)入門(mén)教程第26課-矩陣式鍵盤(pán)接口技術(shù)及編程
![單片機(jī)入門(mén)教程第<b class='flag-5'>26</b>課-<b class='flag-5'>矩陣</b>式<b class='flag-5'>鍵盤(pán)</b>接口技術(shù)及編程](https://file1.elecfans.com//web2/M00/A5/98/wKgZomUMOSeAVy3wAAAP_JH0l6E975.gif)
VNS網(wǎng)絡(luò)控制矩陣鍵盤(pán)
基于FPGA的矩陣鍵盤(pán)控制器的設(shè)計(jì)
矩陣鍵盤(pán)有什么用_矩陣鍵盤(pán)有何用途
FPGA學(xué)習(xí)系列:26. 計(jì)算器的設(shè)計(jì)
![<b class='flag-5'>FPGA</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>系列</b>:<b class='flag-5'>26.</b> 計(jì)算器的設(shè)計(jì)](https://file.elecfans.com/web1/M00/5A/A1/pIYBAFttPxuAU5IEAAA0q6vvLLU945.png)
矩陣鍵盤(pán)的按鍵識(shí)別方法_矩陣鍵盤(pán)掃描程序
單片機(jī)學(xué)習(xí)(五)LCD1602和矩陣鍵盤(pán)的使用
![單片機(jī)<b class='flag-5'>學(xué)習(xí)</b>(五)LCD1602和<b class='flag-5'>矩陣</b><b class='flag-5'>鍵盤(pán)</b>的使用](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
藍(lán)橋杯單片機(jī)學(xué)習(xí)記錄4矩陣鍵盤(pán)
![藍(lán)橋杯單片機(jī)<b class='flag-5'>學(xué)習(xí)</b>記錄4<b class='flag-5'>矩陣</b><b class='flag-5'>鍵盤(pán)</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
stm32矩陣鍵盤(pán)學(xué)習(xí)筆記
![stm32<b class='flag-5'>矩陣</b><b class='flag-5'>鍵盤(pán)</b><b class='flag-5'>學(xué)習(xí)</b>筆記](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評(píng)論