十二、數字密碼鎖設計
本文由山東大學研友袁卓貢獻,特此感謝
實驗目的
實現數字密碼鎖設計,要求矩陣按鍵輸出且數碼管顯示輸入密碼,密碼輸入正確與否均會有相應標志信號產生。
實驗平台
芯航線FPGA核心板、數碼管_VGA_PS2模塊、矩陣按鍵模塊
實驗原理
隨着生活質量的提高,當代人們也認識到了安全的重要性,已經不再滿足於老式的機械鑰匙。近年來越來越多的技術開始在安全領域應用,例如普通的按鍵輸入、指紋輸入或者虹膜輸入等。
本節設計一款按鍵輸入式密碼鎖,用矩陣鍵盤輸入密碼,輸入完成后進行密碼比對,如密碼輸入正確則輸出開門信號以及燈光指示,如密碼輸入錯誤則蜂鳴器進行報警以及燈光指示。
綜合以上要求可以看出此處系統框圖如圖1所示。
圖1 系統框圖
其中各模塊功能描述如表1所示。
表1 各模塊功能描述
矩陣按鍵模塊
現在分開介紹,矩陣按鍵輸入控制模塊的框圖及其接口列表如下所示,詳細內容可以參考芯航線關於矩陣按鍵的教程,此處不再詳述。
圖2 矩陣按鍵模塊框圖
表2 矩陣按鍵模塊接口列表
密碼比較模塊:
現介紹密碼檢測模塊,其主要功能即比較輸入與預設的密碼是否一致,
圖2 密碼檢測模塊框圖
表2 密碼檢測模塊列表
這里先將密碼設置為4位十進制數1234,如下所示
parameter PASSWORD = 16'b0001_0010_0011_0100;
通過計數矩陣按鍵按下標志信號,依次將數據暫存到寄存器mima_r中。
always@(posedge Clk or negedge Rst_n) begin if(!Rst_n) key_cnt <= 2'b0; else if(key_flag) begin if(key_cnt == 2'd3) key_cnt <= 2'b0; else key_cnt <= key_cnt + 1'b1; end else key_cnt <= key_cnt; end always@(posedge Clk or negedge Rst_n) begin if(!Rst_n) mima_r <= 16'b0; else if(key_flag) case(key_cnt) 2'd0: mima_r[15:12] <= key_value[3:0]; 2'd1: mima_r[11:8] <= key_value[3:0]; 2'd2: mima_r[7:4] <= key_value[3:0]; 2'd3: mima_r[3:0] <= key_value[3:0]; default: mima_r <= 0; endcase else mima_r <= mima_r; end
這里通過一個獨立按鍵來控制比較信號,用到了按鍵消抖模塊,詳細內容可以參考芯航線有關章節。
wire key_startbj_flag;wire key_startbj_state; key_filter key_filter_start( .Clk(Clk), .Rst_n(Rst_n), .key_in(start_bj), .key_flag(key_startbj_flag), .key_state(key_startbj_state) );
當開始比較后,根據實際情況判斷后輸出正確與否。
always@(posedge Clk or negedge Rst_n)begin if(!Rst_n) begin error <= 1'b0; right <= 1'b0; end else if(key_startbj_flag && !key_startbj_state)begin if(mima_r == PASSWORD) begin right <= 1'b1; error <= 1'b0; end else begin right <= 1'b0; error <= 1'b1; end end else begin error <= 1'b0; right <= 1'b0; end end
控制模塊:
現在介紹模塊的控制單元。本模塊主要功能是根據密碼檢測模塊的輸出確定,開關門信號以及聲光信號。其模塊接口列表及功能描述如下所示。
圖3 控制模塊框圖
表3 控制模塊接口列表
在這里使用三段式狀態機進行描述。
parameter IDLE = 3'b001, PASS = 3'b010, ALARM = 3'b100;
第一個always塊:
always@(posedge Clk or negedge Rst_n) begin if(!Rst_n) current_state <= IDLE; else current_state <= next_state; end
第二個always塊:
always@(current_state or error or right or cnt_2s) begin case(current_state) IDLE: begin if(right) next_state = PASS; else if(error) next_state = ALARM; else next_state = IDLE; end PASS: begin if(cnt_2s) //door_close next_state = IDLE; else next_state = PASS; end ALARM: begin if(cnt_2s) next_state = IDLE; else next_state = ALARM; end default: next_state = IDLE; endcase end
第三個always塊:
always@(posedge Clk or negedge Rst_n) begin if(!Rst_n) begin door_open_r <= 1'b0; led_alarm_r <= 1'b0; led_right_r <= 1'b0; beep_En <= 1'b0; end else begin case(next_state) IDLE: begin door_open_r <= 1'b0; led_alarm_r <= 1'b0; led_right_r <= 1'b0; beep_En <= 1'b0; end PASS: begin if(cnt_2s)begin door_open_r <= 1'b0; led_alarm_r <= 1'b0; beep_En <= 1'b0; led_right_r <= 1'b0; end else begin door_open_r = 1'b1;led_right_r = 1'b1; end end ALARM: begin if(cnt_2s) begin led_alarm_r = 1'b0; beep_En = 1'b0; end else begin led_alarm_r = 1'b1; beep_En = 1'b1; end end default: begin door_open_r <= door_open_r; led_alarm_r <= led_alarm_r; beep_En <= beep_En; led_right_r <= led_right_r; end endcase end end
數碼管顯示模塊:
Hex8為數碼管顯示模塊,其框圖以及其接口列表如下所示,具體功能介紹可參見芯航線相關內容。
圖4 數碼管顯示模塊框圖
表4 數碼管顯示模塊接口列表
頂層設計:
最后在頂層例化各模塊即可,分配引腳后全編譯無誤后即可下載到芯航線開發板中觀測到對應現象。
圖5 頂層文件RTL Viewer
如有更多問題,歡迎加入芯航線 FPGA 技術支持群交流學習:472607506
小梅哥
芯航線電子工作室
關於學習資料,小梅哥系列所有能夠開放的資料和更新(包括視頻教程,程序代碼,教程文檔,工具軟件,開發板資料)都會發布在我的雲分享。(記得訂閱)鏈接:http://yun.baidu.com/share/home?uk=402885837&view=share#category/type=0
贈送芯航線AC6102型開發板配套資料預覽版下載鏈接:鏈接:http://pan.baidu.com/s/1slW2Ojj 密碼:9fn3
贈送SOPC公開課鏈接和FPGA進階視頻教程。鏈接:http://pan.baidu.com/s/1bEzaFW 密碼:rsyh