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.mdy-edu.com/ffkc/415.html
(点击→了解课程详情☝)感兴趣请联系易老师:13112063618(微信同步)