【至簡設計案例系列】基於FPGA的密碼鎖設計(altera版)

本文爲明德揚原創及錄用文章,轉載請註明出處!
作者:秦紅鍇

一、項目背景概述
隨着生活質量的不斷提高,加強家庭防盜安全變得非常重要,但傳統機械鎖的構造過於簡單,很容易被打開,從而降低了安全性。數字密碼鎖因爲它的保密性很高,安全係數也非常高,再加上其不需要攜帶避免了丟失的可能,省去了因鑰匙丟失而需要換鎖的麻煩,受到了越來越多的人的歡迎。隨看人們對高科技產品也越來越推崇,在當今社會科技的高度集中和創新,人們對日常生活中保護自身及財產安全的物品非常追捧,對其安全性的要求也非常的高。

爲了達到人們對鎖具安全性的高要求,加強鎖具的安全保密性,用密碼鎖來取代傳統機械鎖的鎖具是必然趨勢。數字密碼鎖比傳統機械鎖具更加的安全 。

在本案例的設計過程中,應用了至簡設計法、狀態機模板應用等,在經過逐步改進、調試等一系列工作之後,最終達到了設計目標。

基於明德揚至簡設計法和明德揚設計規範,設計一個基於FPGA的密碼鎖、並將數值顯示在數碼管上,然後根據輸入的鍵值判斷密碼是否正確。

二、項目設計要求
1、通過矩陣鍵盤採樣輸入密碼;
2、數碼管顯示輸入的密碼
3、密碼正確,指示燈給出指示,不正確蜂鳴器給出報警

三、頂層接收設計
根據所有的功能要求,我們先對其進行結構劃分如下:
Key_in:開始模塊
Key_scan :按鍵掃描模塊
Code_detect:密碼比較模塊
Control:控制信號模塊
Dis_play:數碼管顯示模塊
在這裏插入圖片描述

Key_in 比較按鍵輸入
Key_scan 按鍵掃描,密碼檢測
Code_detect 負責密碼的比較
Dis_play 數碼管顯示
control 負責輸出LED,BEEP控制

矩陣按鍵模塊
如果按鍵不多的話,我們可以直接按鍵與FPGA相連接,但是如果按鍵比較多的時候,如何還繼續使用直接按鍵與FPGA相連接的話,所會大量增加FPGA端口的消耗,爲了減少FPGA端口的消耗,我們可以把按鍵設計成矩陣的形式,就如下圖所示:
在這裏插入圖片描述

信號名稱 I/O 功能描述
clk I 模塊時鐘
rst_n I 模塊復位
key_col[3:0] I 列信號
key_row[3:0] O 行信號
Key_num O 鍵值
Key_vld O 按鍵有效

由上圖可以知道,矩陣鍵盤的行row(行)與col(列)的交點,都是通過一個按鍵來相連接。傳統的一個按鍵一個端口的方法,若要實現16個按鍵,則需要16個端口,而現在這個矩陣鍵盤的設計,16個按鍵,僅僅需要8個端口,如果使用16個端口來做矩陣鍵盤的話,可以識別64個按鍵,端口的利用率遠遠比傳統的設計好的多,所以如果需要的按鍵少的話,可以選擇傳統的按鍵設計,如果需要的按鍵比較多的話,可以採用這種矩陣鍵盤的設計。

而我們現在就以掃描法爲例來介紹矩陣鍵盤的工作原理。

在進行鍵盤掃描時,應內部對信號進行按鍵消抖處理。
詳細內容可以參考明德揚另一篇文章:矩陣鍵盤的檢測。

密碼比較模塊:Code_detect
在這裏插入圖片描述

信號名稱 I/O 功能描述
clk I 模塊時鐘
rst_n I 模塊復位
key_falg I 按鍵按下標誌信號
key_value[3:0] I 按鍵值
start I 開始比較
error O 密碼錯誤
right O 密碼正確
code[3:0] O 輸入密碼

每次輸入4位數的密碼,所以每次按下一次,就將這詞的鍵值先存到寄存器中。

所以這裏需要一個計數器,來計算是第幾次按下的操作
在這裏插入圖片描述

在使用一個時序邏輯,將上個模塊的鍵值存儲到寄存器。
在這裏插入圖片描述

控制模塊:control
在這裏插入圖片描述

信號名稱 I/O 功能描述
clk I 模塊時鐘
rst_n I 模塊復位
error I 錯誤信號
right I 正確信號
beep o 蜂鳴器
Error_led o 錯誤指示燈
Right_led o 正確指示燈

這個模塊要操作的信號較多,並且每種情況下,各個指示燈的情況也不一樣,爲了設計的簡單,我們在這採用一個狀態機設計,每個狀態下規定不同的操作就行了。

狀態機的設計主要要有3個狀態,主要是有空閒狀態,正確狀態,錯誤狀態,狀態轉移圖如下所示:
空閒狀態:等待檢測
正確狀態:right_led亮
錯誤狀態:error_led亮,並且BEEP叫1s;
在這裏插入圖片描述

根據MDY的模板設計出4段狀態機:

根據模板我們只需要修改很少的部分就可以,
1根據自己的狀態圖,修改所需要的狀態轉移條件
2修改狀態發生變化的條件
3修改最後的輸出信號

本次需要注意的是89行中的時鐘條件被修改了,原因是,這幾個狀態中的燈亮或者蜂鳴器發出響聲會持續一段時間,狀態改變要等到每次小的狀態結束,或者接收到新的上有信號。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

數碼管顯示模塊:dis_play
在這裏插入圖片描述

信號名稱 I/O 功能描述
clk I 模塊時鐘
rst_n I 模塊復位
Code[3:0] I 密碼
Seg_Sel[3:0] O 位選信號
Segment[7:0] O 段選信號

數碼管動態顯示接口是應用最爲廣泛的一種顯示方式之一,動態驅動是將所有數碼管的 8 個顯示筆劃"a,b,c,d,e,f,g,dp"的同名端連在一起,另外爲每個數碼管的公共極 COM 增加位選通控制電路,位選通由各自獨立的 I/O 線控制,當要輸出字形碼時,所有數碼管都接收相同的字形碼,但究竟是哪個數碼管會顯示出字形,取決於單片機對位選通 COM 端電路的控制,所以我們只要將需要顯示的數碼管的選通控制打開,該位就顯示出字形,沒有選通的數碼管就不會亮。

通過分時輪流控制各個數碼管的的 COM 端,就使各個數碼管輪流受控顯示,這就是動態驅動。在輪流顯示過程中,每位數碼管的點亮時間爲 1~2ms,由於人的視覺暫留現象及發光二極管的餘輝效應,儘管實際上各位數碼管並非同時點亮,但只要掃描的速度足夠快,給人的印象就是一組穩定的顯示數據,不會有閃爍感,動態顯示的效果和靜態顯示是一樣的,能夠節省大量的 I/O 端口,而且功耗更低。

動態掃描是利用人眼視覺滯留的特點,點亮某一位後,在人眼反應之前,進行下一位的顯示,故而出現重影現象。而人的視覺暫留時間大約在1/24秒左右,所以應該保持24幀以上纔會保持連續而不會出現閃爍,通俗來講,應該在一秒內至少掃描多次。也就是每次掃描時間至少小於40ms 。

相關代碼可參考之前設計:“數字秒錶”一文中。

四、實驗總結:
事先在程序中設置內置密碼爲1111,當下載完成後輸入4591,按下確認鍵之後,發現正確的燈不變化,蜂鳴器會響持續1s,重新輸入1111後,正確的燈會先滅然後恢復,蜂鳴器也不發聲,說明設計正確。
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章