1、实验十二 数码锁实验十二 数码锁一 实验目的1 了解数码锁的工作原理。2 了解数码锁的实现方法。3 进一步掌握44键盘或PS/2键盘接口电路设计方法。4 掌握状态机设计复杂控制电路的基本方法。二 硬件需求 1EDA/SOPC实验箱一台。三 实验原理数码锁又称密码锁,它只需要主人记住自己的开锁密码,开门时只需要将密码输入,就可以开门,所以密码锁的核心问题就是密码的比对问题。假如密码锁有六位,那么在系统复位后,用户按键6次,输入一个完整的密码串,输入完6次后,系统进行比对,如果发现密码吻合,则开门,否则要求用户继续输入,如果连续3次输入的密码串都是错误的,则系统报警。实验中还要用到44键盘,在实验
2、三 常用模块电路的设计中已经讲述,可以直接使用已做好的模块。密码输入也可以使用PS/2接口键盘,这样可以输入更多的字符。四 实验内容 本实验需要完成的任务就是一个密码锁,考虑到系统中有键盘扫描、七段码管显示和报警,系统时钟选择时钟模块的10KHz时钟。键盘扫描和显示均是用10KHz。输入密码时,七段码管从右至左显示按键对应的数值,每按键(09)一次,显示左移一次,6次密码输入结束后系统开始校验,校验结束后,七段码管全灭。也就是显示部分维持的时间就是按键6次的时间和校验的时间。密码输入连续三次错误开始报警,报警声要求为高声2.5KHz,低声1.25KHz交替报警,交替周期为1s(1Hz时钟,需要
3、对系统时钟进行10K分频)。实验中要求用LED模块的LED1_1指示键盘状态,如果有按键按下,LED1_1亮起,直到松开该按键;用LED2_1指示门的状态,也就是密码校验结果,如果密码校验正确,LED2_1亮起,否则如果密码校验错误LED2_1闪烁4次,然后熄灭,表明密码错误。系统的复位用主芯片模块的复位键,复位时,七段码管全部熄灭。五 实验步骤完成数码锁的实验步骤如下:1首先打开Quartus II软件,新建一个工程,并新建一个VHDL File。2按照自己的想法,编写VHDL程序。3对自己编写的VHDL程序进行编译并仿真。4仿真无误后,根据附录一的引脚对照表,对实验中用到时钟、七段码显示、
4、44键盘、扬声器、按键以及LED对应的FPGA引脚进行管脚绑定,然后再重新编译一次。5用下载电缆通过JTAG接口将对应的sof文件下载到FPGA中。6测试数码锁的工作是否满足实验要求。 注意:此实验需管脚复用图12.4整个设计的原始VHDL源码:要求在读懂源码基础上,按图12.1改写各模块:密码位数08位,用开关“#”作为输入密码开始和结束符,如要输入密码 “1234567”则输入“#1234567#”,第二个“#”号输入即开始比较密码。可以定义8个信号save1、save2save8来存储预置的密码。用“*”号作为设置密码的开始和结束符,即要设置密码为“1234”则输入“*1234*”,第二
5、个“*”号输入即将密码存入save1save8中。为便于表示特殊符号(字母、“-”号、消隐、密码中空余位),将BCD码扩展一位为5位。实验设计的各模块图:图12.1 数字密码锁模块图其中,“Read_Keyboard”,与实验三中的44键盘模块一致。“CHECK”模块功能是读取输入的键值并依次送入buff1buff8,以提供显示(从左到右顺序),并存储密码值(“*”号作为开始和结束符)或与save1save8存储的密码相比较(“#”号作为开始和结束符),校验密码的情况通过open_Door、Error_Flag和Error_3输出,以提供彩灯和喇叭控制:Key:键盘输入,输入控制符(*、#等)
6、或数字。open_Door:开门信号,密码校验通过时为“1”(持续5秒)Error_Flag:出错标志,密码校验错误时为“1”(持续4秒)Error_3:三次出错标志,三次密码校验错误时一直为 “1”,“Reset”为低才能使其恢复为“0”buff1buff8:8位密码输入,未输入的位用大于“10000”的特殊符号表示。 “manage”模块功能是根据开门或错误标志控制彩灯和喇叭。SPK:扬声器输出,当三次错误后,按1Hz频率交替用高声2.5KHz,低声1.25KHz报警。Lamp3.0:彩灯输出,出错时一个灯按1Hz频率闪烁3秒,3次错误时4个灯按1Hz频率持续闪烁,开门时4个灯长亮(持续5
7、秒)。“sel_time”模块功能是数码管动态扫描,并从选择对应的buff位按顺序输出到译码器译码显示。“deled”模块功能是BCD译码输出。“CHECK”模块设计方法:要求用状态机改写。状态机可以清晰的描述控制过程,如图12.2所示。图12.2 密码设置及检查“CHECK”模块状态转换图用下面所示代码读取按键值,可以保证每按一次键,读取的键值(用current_key保存)持续一个时钟周期,而其他时间current_key=“11111”(表示没有按键按下)。用“current_key”代替状态图中的“key”避免重复读入键值。各个状态要检查的输入、转换条件、输出值分析如下:S0:初始态,
8、复位(Reset=0)或其它未知状态均转入本状态。输入:检查键盘输入。状态转换:当键盘输入“#”号,转到S1(校验密码);当键盘输入“*”号,转到S6(修改密码)。输出:buff(n)=“11111”(消隐)。其它:状态转入S1、S6时,应将buff1buff8置为“10001”(输入提示符“-”)。S1:输入密码。输入:检查键盘输入。状态转换:当键盘输入“#”号,转到S2(输入完成,校验密码);当键盘输入“D”号,转到S0(取消输入)。输出:如果键盘输入“09”的数字,则buff(n-1)= buff(n)(左移一位),buff82时转入S5Error_Num=49999时转入S0(开门状态
9、持续5秒)。输出:open_Door=1;Count= Count+1;buff1buff8显示“OPEndOOR”(选做,在译码器中应添加相应编码用于显示对应字母)。其它: S4:密码错误。输入:Count。状态转换:Count=29999时转入S0(错误状态持续3秒)。输出:Error_Flag=1;Count= Count+1;buff1buff8显示“RRROR-错误次数”(选做,在译码器中应添加相应编码用于显示对应字母)。其它: S5:密码错误超过3次。输入: 状态转换:死循环,无法转入其它状态(只有通过复位(Reset=0)才能转入S0)。输出:Error3 =1;buff1buf
10、f8显示“-LOCKED-”(选做,在译码器中应添加相应编码用于显示对应字母)。其它: S6:修改密码。输入:检查键盘输入。状态转换:当键盘输入“*”号,则保存密码然后转到S0;当键盘输入“D”号,转到S0(取消输入)。输出:如果键盘输入“09”的数字,则buff(n-1)= buff(n)(左移一位),buff8=key;当输入了8个数字后,只接收“*”号和“D”键。其它: 图12.3为“CHECK”模块的VHDL代码(去掉了部分实现代码“”部分),请按照前面的设计思路补充完整。图12.3 “CHECK”模块的部分VHDL代码图12.4 整个设计的原始VHDL代码六、实验报告要求1详细论述源码中实现各功能的设计方法。2总结用状态机设计控制电路的要点。3. 66键盘有几种按键状态(不包括组合键),应该定义多少编码来表示?如果包含所有组合键,则用于表示按键状态的编码至少应定义为几位?4. 如果用“#”键作为功能键(类似PC键盘上的Ctrl键),如何输入“#+C”(类似于“Ctrl+C”)这种组合功能键?(只说思路,不用给出具体实现)5. 实验的心得体会。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1