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