verilog矩陣鍵盤_第1頁
verilog矩陣鍵盤_第2頁
verilog矩陣鍵盤_第3頁
verilog矩陣鍵盤_第4頁
verilog矩陣鍵盤_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、二、矩陣鍵盤顯示電路設(shè)計(顯示鍵盤值的平方)矩陣鍵盤顯示電路的設(shè)計一、 實驗?zāi)康?、 了解普通 4×4 鍵盤掃描的原理。2、 進(jìn)一步加深七段碼管顯示過程的理解。3、 了解對輸入/輸出端口的定義方法。二、實驗原理實現(xiàn)鍵盤有兩種方案:一是采用現(xiàn)有的一些芯片實現(xiàn)鍵盤掃描;再就是用軟 件實現(xiàn)鍵盤掃描。作為一個嵌入系統(tǒng)設(shè)計人員,總是會關(guān)心產(chǎn)品成本。目前有很 多芯片可以用來實現(xiàn)鍵盤掃描,但是鍵盤掃描的軟件實現(xiàn)方法有助于縮減一個系 統(tǒng)的重復(fù)開發(fā)成本,且只需要很少的 CPU 開銷。嵌入式控制器的功能能強,可 能充分利用這一資源,這里就介紹一下軟鍵盤的實現(xiàn)方案。圖 10-1 簡單鍵盤電路通常在一個鍵盤

2、中使用了一個瞬時接觸開關(guān),并且用如圖 10-1 所示的簡單電路,微處理器可以容易地檢測到閉合。當(dāng)開關(guān)打開時,通過處理器的 I/O 口的一個上拉電阻提供邏輯 1;當(dāng)開關(guān)閉合時,處理器的/IO口的輸入將被拉低得到邏輯 0??蛇z憾的是,開關(guān)并不完善,因為當(dāng)它們被按下或者被釋放時,并不能夠產(chǎn)生一個明確的 1或者 0。盡管觸點可能看起來穩(wěn)定而且很快地閉合,但與微處理器快速的運行速度相比,這種動作是比較慢的。當(dāng)觸點閉合時,其彈起就像一個球。彈起效果將產(chǎn)生如圖 10-2所示的好幾個脈沖。彈起的持續(xù)時間通常將維持在 5ms30ms 之間。如果需要多個鍵,則可以將每個開關(guān)連接到微處理器上它自己的輸入端口。然而,

3、當(dāng)開關(guān)的數(shù)目增加時,這種方法將很快使用完所有的輸入端口。圖 10-2 按鍵抖動鍵盤上陣列這些開關(guān)最有效的方法(當(dāng)需要5個以上的鍵時)就形成了一個如圖 10-3 所示的二維矩陣。當(dāng)行和列的數(shù)目一樣多時,也就是方型的矩陣,將產(chǎn)生一個最優(yōu)化的布列方式(I/O 端被連接的時候),一個瞬時接觸開關(guān)(按鈕)放置在每一行與線一列的交叉點。矩陣所需的鍵的數(shù)目顯然根據(jù)應(yīng)用程序而不同。 每一行由一個輸出端口的一位驅(qū)動,而每一列由一個電阻器上拉且供給輸入端口一位。 圖 10-3 矩陣鍵盤鍵盤掃描的實現(xiàn)過程如下:對于4×4鍵盤,通常連接為4行、4列,因此要識別按鍵,只需要知道是哪一行和哪一列即可,為了完成這

4、一識別過程,我們的思想是,首先固定輸出 4 行為高電平,然后輸出 4 列為低電平,在讀入輸出的4行的值,通常高電平會被低電平拉低,如果讀入的 4 行均為高電平,那么肯定沒有按鍵按下,否則,如果讀入的4 行有一位為低電平,那么對應(yīng)的該行肯定有一個按鍵按下,這樣便可以獲取到按鍵的行值。同理,獲取列值也是如此,先輸出 4 列為高電平,然后在輸出4 行為低電平,再讀入列值,如果其中有哪一位為低電平,那么肯定對應(yīng)的那一列有按鍵按下。獲取到行值和列值以后,組合成一個 8 位的數(shù)據(jù),根據(jù)實現(xiàn)不同的編碼在對每個按鍵進(jìn)行匹配,找到鍵值后在 7 段碼管顯示。三、實驗內(nèi)容本實驗要求完成的任務(wù)是通過編程實現(xiàn)對4X4矩

5、陣鍵盤按下鍵的鍵值的讀 取,并在數(shù)碼管上完成一定功能(如移動等)的顯示。按鍵盤的定義,按下“*” 鍵則在數(shù)碼管是顯示“E”鍵值。按下“#”鍵在數(shù)碼管上顯示“F”鍵值。其它的鍵則按鍵盤上的標(biāo)識進(jìn)行顯示。在此實驗中數(shù)碼管與 FPGA的連接電路和管腳連接在以前的實驗中都做了詳細(xì)說明,這里不在贅述。本實驗箱上的 4X4 矩陣鍵盤的電路原理如圖 10-4 所示。與 FPGA 的管腳連接如表 10-1 所示。 圖 10-4 4X4 矩陣鍵盤電路原理圖表 10-1 4X4 矩陣鍵與 FPGA 的管腳連接表信號名稱對應(yīng) FPGA 管腳名說明KEY-C0B8矩陣鍵盤的第 1 列選擇KEY-C1A9矩陣鍵盤的第

6、2 列選擇KEY-C2B9矩陣鍵盤的第 3 列選擇KEY-C3E5矩陣鍵盤的第 4 列選擇KEY-R0B6矩陣鍵盤的第 1 行選擇KEY-R1A7矩陣鍵盤的第 2 行選擇KEY-R2B7矩陣鍵盤的第 3 行選擇KEY-R3A8矩陣鍵盤的第 4 行選擇四、實驗步驟1、 打開 QUARTUSII 軟件,新建一個工程。2、 建完工程之后,再新建一個 VHDL File,打開 VHDL編輯器對話框。3、 按照實驗原理和自己的想法,在 VHDL 編輯窗口編寫 VHDL 程序,用戶可參照光盤中提供的示例程序。4、 編寫完 VHDL 程序后,保存起來。方法同實驗一。5、 對自己編寫的 VHDL 程序進(jìn)行編譯

7、并仿真,對程序的錯誤進(jìn)行修改。6、 編譯仿真無誤后,依照 4X4 矩陣鍵、數(shù)碼管與 FPGA 的管腳連接表(表或參照附錄)進(jìn)行管腳分配。表 10-2 是示例程序的管腳分配表。分配完成后,再進(jìn)行全編譯一次,以使管腳分配生效。端口名使用模塊信號對應(yīng) FPGA 管腳說明CLK數(shù)字信號源C13時鐘為 1KHZKR04*4 矩陣鍵盤 R0B6矩陣鍵盤行信號KR14*4 矩陣鍵盤 R1A7KR24*4 矩陣鍵盤 R2B7KR34*4 矩陣鍵盤 R3A8KC04*4 矩陣鍵盤 C0B8矩陣鍵盤列信號KC14*4 矩陣鍵盤 C1A9表 10-2 端口管腳分配表KC24*4 矩陣鍵盤 C2B9矩陣鍵盤列信號KC

8、34*4 矩陣鍵盤 C3E5A數(shù)碼管模塊 A 段F13鍵值顯示B數(shù)碼管模塊 B 段F14C數(shù)碼管模塊 C 段F15D數(shù)碼管模塊 D 段E15E數(shù)碼管模塊 E 段F16F數(shù)碼管模塊 F 段F17G數(shù)碼管模塊 G 段E18SA數(shù)碼管模塊 SEL0G18SB數(shù)碼管模塊 SEL1G17SC數(shù)碼管模塊 SEL2G167、 用下載電纜通過 JTAG 口將對應(yīng)的 sof 文件加載到 FPGA 中。觀察實驗 結(jié)果是否與自己的編程思想一致。五、實驗結(jié)果與現(xiàn)象以設(shè)計的參考示例為例,當(dāng)設(shè)計文件加載到目標(biāo)器件后,將數(shù)字信號源模塊 的時鐘選擇為1KHz,按動“模式”按鍵使單8字?jǐn)?shù)碼管顯示“0”(參考實驗四),按下矩陣鍵

9、盤的某一個鍵,則在數(shù)碼管上顯示對應(yīng)的這個鍵標(biāo)識的鍵值,當(dāng)再按下第二個鍵的時候前一個鍵的鍵值在數(shù)碼管上左移一位。按下“*”鍵則在數(shù)碼管是顯示“E”鍵值。按下“#”鍵在數(shù)碼管上顯示“F”鍵 值。/*工 程:4x4矩陣鍵盤日 期:2011-08-3最后修改:功 能:鍵盤說 明:ROW【3:0】設(shè)為輸入,COL【3:0】設(shè)為輸出。 如果沒有按鍵按下,則ROW【3:0】一直被上 拉為高電平,且 COL【3:0】有低電平輸出, ROW【3:0】中才有可能低電平輸入。*/module keys(clk_50M,rst_n,row,col,dataout,smg_wei);/*/output 3:0col;

10、/矩陣鍵盤列input rst_n; /復(fù)位鍵input clk_50M; /系統(tǒng)時鐘input 3:0row; /矩陣鍵盤行output 7:0dataout; /鍵盤值數(shù)碼管顯示數(shù)據(jù)output 7:0smg_wei; /數(shù)碼管顯示使能reg 7:0dataout;reg 3:0col;reg 3:0key_board_val;/*/assign smg_wei=0; /八個數(shù)碼管顯示/*/ /分頻部分開始/*/reg19:0cnt; /計數(shù)子always (posedge clk_50M or negedge rst_n)if(!rst_n)cnt<=0;elsecnt<=c

11、nt+1'b1;wire key_clk=cnt19;/ 220/50M=21ms/* 狀態(tài)機部分 獨熱碼編碼*/parameter NO_KEY_PRESSED=6'b000_001;/沒有鍵按下parameter SCAN_COL0 =6'b000_010;/掃描第 0 列parameter SCAN_COL1 =6'b000_100;/掃描第 1 列parameter SCAN_COL2 =6'b001_000;/掃描第 2 列parameter SCAN_COL3 =6'b010_000;/掃描第 3 列parameter KEY_PRE

12、SSED =6'b100_000;/有鍵按下/*/reg 5:0current_state,next_state; /現(xiàn)態(tài)和次態(tài) /*/ /復(fù)位/*/always (posedge key_clk or negedge rst_n)if(!rst_n)current_state<=NO_KEY_PRESSED;else current_state<=next_state;/*/always * /(current_state) /根據(jù)條件轉(zhuǎn)移狀態(tài)case (current_state)NO_KEY_PRESSED: /沒有鍵按下 if(row!=4'hf)next_

13、state=SCAN_COL0; elsenext_state=NO_KEY_PRESSED; SCAN_COL0: /掃描第 0 列if(row!=4'hf)next_state=KEY_PRESSED;elsenext_state=SCAN_COL1;SCAN_COL1: /掃描第 1 列if(row!=4'hf)next_state=KEY_PRESSED;else next_state=SCAN_COL2;SCAN_COL2: /掃描第 2 列if(row!=4'hf)next_state=KEY_PRESSED;else next_state=SCAN_COL

14、3;SCAN_COL3: /掃描第 3 列if(row!=4'hf)next_state=KEY_PRESSED;else next_state=NO_KEY_PRESSED;KEY_PRESSED: /有按鍵按下if(row!=4'hf)next_state=KEY_PRESSED;elsenext_state=NO_KEY_PRESSED;endcase/*/reg key_pressed_flag; /按鍵按下標(biāo)志reg 3:0col_val; /列值reg 3:0row_val; /行值/*/根據(jù)次態(tài),給相應(yīng)的寄存器賦值/*/always (posedge key_cl

15、k or negedge rst_n)if(!rst_n) /復(fù)位begincol<=4'h0;key_pressed_flag<=0;endelsecase (next_state)NO_KEY_PRESSED:begincol<=4'h0;key_pressed_flag<=0;endSCAN_COL0: /掃描第 0 列col<=4'b1110;SCAN_COL1: /掃描第 1 列col<=4'b1101;SCAN_COL2: /掃描第 2 列col<=4'b1011;SCAN_COL3: /掃描第 3

16、列col<=4'b0111;KEY_PRESSED: /有按鍵按下begincol_val<=col; / 鎖存列值row_val<=row; / 鎖存行值key_pressed_flag<=1; / 置鍵盤按下標(biāo)endendcase /*/ / 掃描行列值部分 開始/*/always (posedge key_clk or negedge rst_n)if(!rst_n)key_board_val<=4'h0;elseif(key_pressed_flag)case(col_val,row_val)8'b11101110 : key_bo

17、ard_val <= 4'h0;8'b11101101 : key_board_val <= 4'h4;8'b11101011 : key_board_val <= 4'h8;8'b11100111 : key_board_val <= 4'hC;8'b11011110 : key_board_val <= 4'h1;8'b11011101 : key_board_val <= 4'h5;8'b11011011 : key_board_val <= 4

18、9;h9;8'b11010111 : key_board_val <= 4'hD;8'b10111110 : key_board_val <= 4'h2;8'b10111101 : key_board_val <= 4'h6;8'b10111011 : key_board_val <= 4'hA;8'b10110111 : key_board_val <= 4'hE;8'b01111110 : key_board_val <= 4'h3; 8'b01111101 : key_board_val <= 4'h7;8'b01111011 : key_board_val <= 4'hB;8'b01110111 : key_board_val <= 4'hF; endcase/*/ / 鍵盤值轉(zhuǎn)換為數(shù)碼管顯示 /*/always * /(key_board_val)begincase(key_board_val)4'h0:dataout<=8'b11000000; /04'h1:datao

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論