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