1.概述
本文基于明德揚至簡設計法和明德揚設計規范,設計了一個基于FPGA的數字密碼鎖,實現了在撥碼開關條件下,按鍵設置密碼、按鍵輸入解鎖密碼,密碼正確時正確指示燈亮、密碼錯誤時或者默認狀態錯誤指示燈亮,密碼正確時一位數碼管顯示1,其他情況顯示0。本案例的擴展和應用在現實生活中具有重大意義。在本案例的設計過程中,應用了至簡設計法、計數器模板應用等,在經過逐步改進、調試等一系列工作之后,最終達到了設計目標。
2. 設計目標
(1)實現8位數字密碼鎖功能
(2)按鍵1、2設置密碼,按鍵1有效時設置一位密碼0,按鍵2有效時設置一位密碼1,按下8次后密碼設置完成
(3)按鍵3、4輸入密碼,按鍵3有效時輸入一位密碼0,按鍵2有效時輸入一位密碼1,按下8次后密碼輸入完成
(4)比較設置的密碼和輸入的密碼是否相同,正確時正確指示燈亮,數碼管顯示1,否則錯誤指示燈亮,數碼管顯示0;
3. 模塊功能
1) 密碼模塊實現功能:
SW1有效時按鍵1、2設置密碼,按鍵1有效時設置一位密碼0,按鍵2有效時設置一位密碼1,按下8次后密碼設置完成
SW2有效時按鍵3、4輸入密碼,按鍵3有效時輸入一位密碼0,按鍵2有效時輸入一位密碼1,按下8次后密碼輸入完成
2) 數碼管顯示模塊實現功能
密碼正確時數碼管顯示1,否則顯示0;
3) led模塊實現功能:
密碼正確時led_y指示燈亮,否則led_n指示燈亮;
4) 按鍵模塊實現功能
將外來異步信號打兩拍處理,將異步信號同步化;
實現20ms按鍵消抖功能,并輸出有效按鍵信號;
4. 信號定義
1)頂層模塊Lock_Top.v
信號 | 定義 |
clk | 系統時鐘 |
rst_n | 低電平復位信號 |
key_in | 按鍵輸入 |
sw | 撥碼開關 |
led_y | 正確指示燈 |
led_n | 錯誤指示燈 |
seg_sel | 數碼管位選信號 |
segment | 數碼管顯示信號 |
2)密碼模塊password.v
信號 | 定義 |
clk | 系統時鐘 |
rst_n | 低電平復位信號 |
key_vld | 按鍵有效 |
SW | 撥碼開關 |
password_set | 設置的密碼 |
password_shift | 輸入的密碼 |
3)數碼管顯示模塊sel_disp.v
信號 | 定義 |
clk | 系統時鐘 |
rst_n | 低電平復位信號 |
password_set | 設置的密碼 |
password_shift | 輸入的密碼 |
seg_sel | 數碼管位選信號 |
segment | 數碼管顯示信號 |
4)led模塊led_flag.v
信號 | 定義 |
clk | 系統時鐘 |
rst_n | 低電平復位信號 |
led_y | 正確指示燈 |
led_n | 錯誤指示燈 |
5)按鍵模塊key_module.v
信號 | 定義 |
clk | 系統時鐘 |
rst_n | 低電平復位信號 |
key_in | 按鍵輸入 |
key_vld | 有效按鍵 |

6.數碼管顯示


7.led指示燈模塊


9、Modelsim仿真驗證


按鍵2按下時設置了一位密碼1,再按鍵時設置了兩位密碼1;
按鍵4按下時輸入了一位密碼1,再按鍵時輸入了兩位密碼1;
設置的密碼和輸入的密碼是否相同,正確時正確指示燈亮,數碼管顯示1,否則錯誤指示燈亮,數碼管顯示0;從仿真圖可以看出符合功能要求。
在這個設計案例中,至簡設計法和明德揚至簡法發揮了至關重要的作用,使我能夠快速準確完成設計。
本設計可以加以拓展:
1) 可以結合開發板外設和實際情況,改變設置和輸入密碼的方式、位數,以及密碼正確與否的反應,如蜂鳴器報警等等。
對于初學者而言,流水燈太簡單,復雜項目又太難,不如嘗試一下這些相對簡單而又酷炫的案例,并一步步拓展成大項目。趕緊動手嘗試吧。
溫馨提示:明德揚2023推出了全新課程——邏輯設計基本功修煉課,降低學習FPGA門檻的同時,增加了學習的趣味性,并組織了考試贏積分活動
http://www.cqqtmy.cn/ffkc/415.html
(點擊→了解課程詳情?)感興趣請聯系易老師:13112063618(微信同步)