名稱:簡(jiǎn)易單元門禁系統(tǒng)4x4矩陣鍵盤VHDL代碼Quartus仿真
軟件:Quartus
語言:VHDL
代碼功能:
簡(jiǎn)易單元門禁系統(tǒng)4x4矩陣鍵盤
設(shè)計(jì)實(shí)現(xiàn)一個(gè)簡(jiǎn)易單元門禁系統(tǒng),模擬呼叫住戶和開關(guān)單元門的基本功能。
基本要求:
1、 本單元門禁系統(tǒng)的住戶為 8 戶,門牌號(hào)分別為 101、102、103、104、105、106、107 和 108),按鍵 BTN0-BTN7 為各家戶內(nèi)開單元門的按鍵(BTN0→101、BTN1→102、BTN2→103、BTN3→104、BTN4→105、BTN5→106、BTN6→107、BTN7→108),發(fā)光二極管 LD0-LD7 為 8 個(gè)住戶被呼叫的指示燈(LD0→101、LD1→102、LD2→103、LD3→104、LD4→105、LD5→106、LD6→107、LD7→108)。
2、 來訪客人用鍵盤(鍵盤設(shè)置見圖 1)輸入門牌號(hào)(以 103 為例),客人在鍵盤上輸入的門牌號(hào) 103 的過程中,門牌號(hào) 103 要依次顯示在數(shù)碼管 DIP2-DISP0 上,當(dāng)門牌號(hào)103 輸入無誤并按下確認(rèn)鍵后,對(duì)應(yīng)的發(fā)光二極管 LD2 亮起,同時(shí)蜂鳴器響起門鈴音樂(樂曲自擬),103 戶內(nèi)的人聽到門鈴音樂后按一下對(duì)應(yīng)的開門按鍵 BTN2 打開單元門(點(diǎn)陣演示開門動(dòng)畫),同時(shí)對(duì)應(yīng)的發(fā)光二極管 LD2 熄滅,門鈴音樂停止,數(shù)碼管 DIP6 從 9 開始進(jìn)行 10 秒倒計(jì)時(shí),倒計(jì)時(shí)到 0 時(shí),點(diǎn)陣演示關(guān)門動(dòng)畫,同時(shí)數(shù)碼管 DIP2-DISP0 上顯示的門牌號(hào) 103 熄滅,完成一次訪客進(jìn)單元門的過程;
3、 如果來訪客人在輸入門牌號(hào)時(shí)發(fā)生的錯(cuò)誤,可以按刪除鍵將已輸入的數(shù)字刪掉(數(shù)碼管 DIP2-DISP0 上已經(jīng)顯示的數(shù)字熄滅),重新輸入門牌號(hào);
4、 住戶進(jìn)門時(shí),同時(shí)按下小鍵盤最右列上面的三個(gè)鍵(刷卡鍵)一次打開單元門(模擬刷卡開門),點(diǎn)陣演示開門動(dòng)畫,同時(shí)數(shù)碼管 DIP6 從 9 開始進(jìn)行 10 秒倒計(jì)時(shí),倒計(jì)時(shí)到 0 時(shí),點(diǎn)陣演示關(guān)門動(dòng)畫,完成一次住戶進(jìn)單元門的過程;
5、 來訪客人或住戶出門離開所在單元時(shí),按一下小鍵盤上右下角的出門按鍵(模擬單元門內(nèi)的開門鍵)打開單元門,點(diǎn)陣演示開門動(dòng)畫,同時(shí)數(shù)碼管 DIP6 從 9 開始進(jìn)行 10 秒倒計(jì)時(shí),倒計(jì)時(shí)到 0 時(shí),點(diǎn)陣演示關(guān)門動(dòng)畫,完成一次訪客出單元門的過程;
6、 單元門的開門和關(guān)門動(dòng)畫自擬,盡可能形象;
7、 系統(tǒng)上電時(shí),實(shí)驗(yàn)板上所有的顯示器件應(yīng)都沒有顯示;
8、 系統(tǒng)工作流程合理,工作穩(wěn)定。
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
設(shè)計(jì)文檔:
一、整體框圖
電路功能由key_module、key44、control_module、seg_display共4個(gè)模塊組成。
二、模塊功能
key_module:即獨(dú)立按鍵處理模塊,用于對(duì)8個(gè)獨(dú)立按鍵進(jìn)行消抖,輸入為按鍵,輸出為消抖后的按鍵上升沿。
key44:矩陣按鍵處理模塊,該模塊用于控制板子上的4*4矩陣鍵盤,輸入為矩陣鍵盤的行控制信號(hào),輸出列信號(hào)和對(duì)應(yīng)按鍵的鍵值。
control_module:即控制模塊,該模塊為系統(tǒng)主控模塊,用于根據(jù)按鍵輸入的內(nèi)容判斷是否開門及LED、點(diǎn)陣等相關(guān)的操作。
seg_display:數(shù)碼管顯示模塊,根據(jù)控制模塊輸出的數(shù)碼管顯示內(nèi)容控制對(duì)應(yīng)的數(shù)碼管點(diǎn)亮和顯示相關(guān)數(shù)字和字母。
三、波形仿真
1. 獨(dú)立按鍵處理模塊仿真
圖中,輸入信號(hào)為key,代表了8個(gè)按鍵,每個(gè)按鍵高電平表示按下,以key[0]為例,在圖中70ns附近變?yōu)楦唠娖剑?a class="article-link" target="_blank" href="/baike/1572723.html">輸出信號(hào)為key_flag,圖中可以看到,key_flag[0]信號(hào)在key[0]變?yōu)楦唠娖胶蟛痪?,就輸出了一個(gè)脈沖信號(hào),該脈沖就是key[0]信號(hào)消抖后的上升沿。
2. 矩陣按鍵處理模塊
上圖中仿真了矩陣鍵盤依次按下7,F(xiàn),B,2的情況。矩陣鍵盤的最終輸出是根據(jù)行和列的值確定輸出按鍵值。即通過4位的row信號(hào)和4位的col信號(hào)進(jìn)行拼接,再根據(jù)拼接后的信號(hào)輸出key_value。以上圖中200ns附近的波形為例說明:圖中row值為1011,col_out值為1110,拼接后就是10111110。該拼接后的值對(duì)應(yīng)的按鍵鍵值就是7(key44模塊代碼171行)。
3. ? ? 控制模塊仿真
上圖中仿真以了一種典型的情況,即來訪客人用鍵盤輸入門牌號(hào)103?,客人在鍵盤上輸入 的門牌號(hào)?103?的過程中,門牌號(hào)?103 依次顯示在數(shù)碼管?DIP2-DISP0?上,當(dāng)門牌號(hào)?103?輸入無誤并按下確認(rèn)鍵后,對(duì)應(yīng)的發(fā)光二極管?LD2?亮起,103?戶內(nèi)的按一下對(duì)應(yīng)的開門按鍵?BTN2?打開 單元門,同時(shí)對(duì)應(yīng)的發(fā)光二極管?LD2?熄滅, 數(shù)碼管?DIP6?從?9?開始進(jìn)行?10?秒倒計(jì)時(shí)。具體對(duì)應(yīng)信號(hào)如下圖所示:
4. 數(shù)碼管顯示模塊
圖中,display_num為顯示內(nèi)容。Seg為數(shù)碼管的段選,用于控制8段數(shù)碼管哪一段亮,低電平時(shí)亮,高電平滅。Sel為數(shù)碼管的位選信號(hào),需要不斷的依次點(diǎn)亮。圖中Sel可以看到在依次循環(huán)點(diǎn)亮。同時(shí)圖中輸入的待顯示內(nèi)容為AAAAA103,即模擬有用戶按下103,其中A表不顯示,對(duì)應(yīng)數(shù)碼管的段選信號(hào)為11111111,即該數(shù)碼管不亮,因此實(shí)際數(shù)碼管顯示內(nèi)容只有3個(gè)數(shù)碼管亮,其他滅,數(shù)碼管顯示內(nèi)容為103。
部分代碼展示:
library?IEEE; use?IEEE.STD_LOGIC_1164.ALL; use?ieee.std_logic_arith.all;? use?ieee.std_logic_unsigned.all; --時(shí)鐘分頻模塊 entity?clock_fenpin?is generic(cycle:integer:=50000000);--50000000 port ( clk??:in??std_logic;--系統(tǒng)時(shí)鐘 rst??:in??std_logic;--系統(tǒng)復(fù)位,低有效 enable?:in??std_logic;--計(jì)數(shù)使能 clk_out??:out?std_logic?--分頻信號(hào)輸出 ); end?clock_fenpin; architecture?Behavioral?of?clock_fenpin?is signal?cnt:integer?range?0?to?99999999; begin --時(shí)鐘分頻計(jì)數(shù) process(clk,rst) begin if(rst?=?'0')then cnt?<=?0;? elsif(rising_edge(clk))then if(enable?=?'1')then if(cnt?=?cycle-1)then cnt?<=?0; else? cnt?<=?cnt+?1;?? end?if; else? cnt?<=?0; end?if; end?if; end?process; --分頻后的時(shí)鐘輸出 process(clk,rst) begin if(rst?=?'0')then clk_out?<=?'0';? elsif(rising_edge(clk))then if(cnt?=?cycle-1?and?enable?=?'1')then clk_out?<=?'1';? else? clk_out?<=?'0';? end?if; end?if; end?process; end?Behavioral;
點(diǎn)擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=515