【至简设计案例系列】基于FPGA的密码锁设计(altera版)

【至简设计案例系列】基于FPGA的密码锁设计(altera版)
本文为明德扬原创及录用文章转载请注明出处明德扬官网明德扬产品官网作者秦红锴一、项目背景概述随着生活质量的不断提高加强家庭防盗安全变得非常重要但传统机械锁的构造过于简单很容易被打开从而降低了安全性。数字密码锁因为它的保密性很高安全系数也非常高再加上其不需要携带避免了丢失的可能省去了因钥匙丢失而需要换锁的麻烦受到了越来越多的人的欢迎。随看人们对高科技产品也越来越推崇在当今社会科技的高度集中和创新人们对日常生活中保护自身及财产安全的物品非常追捧对其安全性的要求也非常的高。为了达到人们对锁具安全性的高要求加强锁具的安全保密性用密码锁来取代传统机械锁的锁具是必然趋势。数字密码锁比传统机械锁具更加的安全 。在本案例的设计过程中应用了至简设计法、状态机模板应用等在经过逐步改进、调试等一系列工作之后最终达到了设计目标。基于明德扬至简设计法和明德扬设计规范设计一个基于FPGA的密码锁、并将数值显示在数码管上然后根据输入的键值判断密码是否正确。二、项目设计要求1、通过矩阵键盘采样输入密码2、数码管显示输入的密码3、密码正确指示灯给出指示不正确蜂鸣器给出报警三、顶层接收设计根据所有的功能要求我们先对其进行结构划分如下Key_in开始模块Key_scan :按键扫描模块Code_detect:密码比较模块Control:控制信号模块Dis_play:数码管显示模块Key_in比较按键输入Key_scan按键扫描密码检测Code_detect负责密码的比较Dis_play数码管显示control负责输出LEDBEEP控制矩阵按键模块如果按键不多的话我们可以直接按键与FPGA相连接但是如果按键比较多的时候如何还继续使用直接按键与FPGA相连接的话所会大量增加FPGA端口的消耗为了减少FPGA端口的消耗我们可以把按键设计成矩阵的形式就如下图所示信号名称I/O功能描述clkI模块时钟rst_nI模块复位key_col[3:0]I列信号key_row[3:0]O行信号Key_numO键值Key_vldO按键有效由上图可以知道矩阵键盘的行row行与col列的交点都是通过一个按键来相连接。传统的一个按键一个端口的方法若要实现16个按键则需要16个端口而现在这个矩阵键盘的设计16个按键仅仅需要8个端口如果使用16个端口来做矩阵键盘的话可以识别64个按键端口的利用率远远比传统的设计好的多所以如果需要的按键少的话可以选择传统的按键设计如果需要的按键比较多的话可以采用这种矩阵键盘的设计。而我们现在就以扫描法为例来介绍矩阵键盘的工作原理。在进行键盘扫描时应内部对信号进行按键消抖处理。详细内容可以参考明德扬另一篇文章矩阵键盘的检测。密码比较模块Code_detect信号名称I/O功能描述clkI模块时钟rst_nI模块复位key_falgI按键按下标志信号key_value[3:0]I按键值startI开始比较errorO密码错误rightO密码正确code[3:0]O输入密码每次输入4位数的密码所以每次按下一次就将这词的键值先存到寄存器中。所以这里需要一个计数器来计算是第几次按下的操作在使用一个时序逻辑将上个模块的键值存储到寄存器。控制模块control信号名称I/O功能描述clkI模块时钟rst_nI模块复位errorI错误信号rightI正确信号beepo蜂鸣器Error_ledo错误指示灯Right_ledo正确指示灯这个模块要操作的信号较多并且每种情况下各个指示灯的情况也不一样为了设计的简单我们在这采用一个状态机设计每个状态下规定不同的操作就行了。状态机的设计主要要有3个状态主要是有空闲状态正确状态错误状态状态转移图如下所示空闲状态等待检测正确状态right_led亮错误状态error_led亮并且BEEP叫1s;根据MDY的模板设计出4段状态机根据模板我们只需要修改很少的部分就可以1根据自己的状态图修改所需要的状态转移条件2修改状态发生变化的条件3修改最后的输出信号本次需要注意的是89行中的时钟条件被修改了原因是这几个状态中的灯亮或者蜂鸣器发出响声会持续一段时间状态改变要等到每次小的状态结束或者接收到新的上有信号。数码管显示模块dis_play信号名称I/O功能描述clkI模块时钟rst_nI模块复位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 端就使各个数码管轮流受控显示这就是动态驱动。在轮流显示过程中每位数码管的点亮时间为 12ms由于人的视觉暂留现象及发光二极管的余辉效应尽管实际上各位数码管并非同时点亮但只要扫描的速度足够快给人的印象就是一组稳定的显示数据不会有闪烁感动态显示的效果和静态显示是一样的能够节省大量的 I/O 端口而且功耗更低。动态扫描是利用人眼视觉滞留的特点点亮某一位后在人眼反应之前进行下一位的显示故而出现重影现象。而人的视觉暂留时间大约在1/24秒左右所以应该保持24帧以上才会保持连续而不会出现闪烁通俗来讲应该在一秒内至少扫描多次。也就是每次扫描时间至少小于40ms 。相关代码可参考之前设计“数字秒表”一文中。四、实验总结事先在程序中设置内置密码为1111当下载完成后输入4591按下确认键之后发现正确的灯不变化蜂鸣器会响持续1s重新输入1111后正确的灯会先灭然后恢复蜂鸣器也不发声说明设计正确。明德扬官网明德扬产品官网

最新新闻

日新闻

周新闻

月新闻