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 交替报警,交替周
3、期为 1s(1Hz 时钟,需要对系统时钟进行 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、 save2sa
5、ve8 来存储预置的密码。用 “*”号作为设置密码的开始和结束符,即要设置密码为“1234”则输入“*1234*”,第二个“*”号输入即将密码存入 save1save8 中。为便于表示特殊符号(字母、 “-”号、消隐、密码中空余位 ) ,将 BCD 码扩展一位为5 位。实验设计的各模块图:图 12.1 数字密码锁模块图其中, “Read_Keyboard”,与实验三中的 44 键盘模块一致。“CHECK”模块功能是读取输入的键值并依次送入 buff1buff8,以提供显示(从左到右顺序),并存储密码值(“*”号作为开始和结束符)或与 save1save8 存储的密码相比较(“#”号作为开始和结
6、束符) ,校验密码的情况通过 open_Door、Error_Flag 和 Error_3 输出,以提供彩灯和喇叭控制:Key:键盘输入,输入控制符(*、#等)或数字。open_Door:开门信号,密码校验通过时为“1”(持续 5 秒)Error_Flag:出错标志,密码校验错误时为“1”(持续 4 秒)Error_3:三次出错标志,三次密码校验错误时一直为 “1”, “Reset”为低才能使其恢复为“0”buff1buff8:8 位密码输入,未输入的位用大于 “10000”的特殊符号表示。“manage”模块功能是根据开门或错误标志控制彩灯和喇叭。SPK:扬声器输出,当三次错误后,按 1Hz
7、 频率交替用高声 2.5KHz,低声 1.25KHz报警。Lamp3.0:彩灯输出,出错时一个灯按 1Hz 频率闪烁 3 秒,3 次错误时 4 个灯按1Hz 频率持续闪烁,开门时 4 个灯长亮(持续 5 秒) 。“sel_time”模块功能是数码管动态扫描,并从选择对应的 buff 位按顺序输出到译码器译码显示。“deled”模块功能是 BCD 译码输出。“CHECK”模块设计方法:要求用状态机改写。状态机可以清晰的描述控制过程,如图 12.2 所示。图 12.2 密码设置及检查“CHECK”模块状态转换图用下面所示代码读取按键值,可以保证每按一次键,读取的键值(用 current_key 保
8、存)持续一个时钟周期,而其他时间 current_key=“11111”(表示没有按键按下) 。用“current_key”代替状态图中的“key”避免重复读入键值。各个状态要检查的输入、转换条件、输出值分析如下:S0:初始态,复位(Reset=0)或其它未知状态均转入本状态。输入:检查键盘输入。状态转换:当键盘输入“#”号,转到 S1(校验密码) ;当键盘输入“*”号,转到S6(修改密码) 。输出:buff(n)= “11111”(消隐) 。其它:状态转入 S1、S6 时,应将 buff1buff8 置为“10001” (输入提示符“-” ) 。S1:输入密码。输入:检查键盘输入。状态转换:
9、当键盘输入“#”号,转到 S2(输入完成,校验密码) ;当键盘输入“D”号,转到 S0(取消输入) 。输出:如果键盘输入“09”的数字,则 buff(n-1)= buff(n)(左移一位) ,buff82 时转入 S5Error_Num=49999 时转入 S0(开门状态持续 5 秒) 。输出:open_Door=1 ;Count= Count+1;buff1buff8 显示 “OPEndOOR”(选做,在译码器中应添加相应编码用于显示对应字母) 。其它: S4:密码错误。输入:Count 。状态转换:Count=29999 时转入 S0(错误状态持续 3 秒) 。输出:Error_Flag=
10、1 ;Count= Count+1;buff1buff8 显示 “RRROR-错误次数 ”(选做,在译码器中应添加相应编码用于显示对应字母) 。其它: S5:密码错误超过 3 次。输入: 状态转换:死循环,无法转入其它状态(只有通过复位(Reset=0)才能转入 S0) 。输出:Error3 =1;buff1buff8 显示“-LOCKED-” (选做,在译码器中应添加相应编码用于显示对应字母) 。其它: S6:修改密码。输入:检查键盘输入。状态转换:当键盘输入“*”号,则保存密码然后转到 S0;当键盘输入“D”号,转到S0(取消输入) 。输出:如果键盘输入“09”的数字,则 buff(n-1)= buff(n)(左移一位) ,buff8=key ;当输入了 8 个数字后,只接收“*”号和“D ”键。其它: 图 12.3 为“CHECK”模块的 VHDL 代码(去掉了部分实现代码“”部分) ,请按照前面的设计思路补充完整。图 12.3 “CHECK”模块的部分 VHDL 代码
Copyright © 2018-2021 Wenke99.com All rights reserved
工信部备案号:浙ICP备20026746号-2
公安局备案号:浙公网安备33038302330469号
本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。