VHDL四位密码锁课程设计EDAWord格式.docx
《VHDL四位密码锁课程设计EDAWord格式.docx》由会员分享,可在线阅读,更多相关《VHDL四位密码锁课程设计EDAWord格式.docx(17页珍藏版)》请在冰豆网上搜索。
系统操作过程中,只要密码锁没有打开,如果60秒没有对系统操作,系统回到等待状态。
要求密码在输入过程中被依次显示,即先输入的为密码的第一位,总是显示在最左边。
用两个发光二极管模拟显示,其中一个显示当前的工作模式,灭表示用户模式,亮表示管理员模式;
另外一个指示锁的状态,灭表示锁处于锁定,亮表示锁被开启。
注意:
用两个按键实现密码输入,Key1选择输入的是第几位密码,KEY2输入密码数字。
初始状态:
初次使用密码锁时,要先用Reset键初始化。
初始状态下,用户密码为“1234”,管理员密码为“0000”。
用户开锁:
默认情况下,密码锁处于用户使用状态。
如果当前为管理员状态,则按下user键回到用户状态。
用户开锁时,输入四位数用户密码,可以从out_code6的输出状态确定密码输入状态。
如输入错误则按下clear清除前一位输入。
输入完毕后按enter,如果密码正确,则开锁,否则重新输入密码。
开锁后再次按下enter键则关锁,回到等待状态。
三次密码输入错误,警报器alarming为1。
要管理员输入管理员密码解除警报。
此时哪怕用户再输对密码也没用。
管理员解除警报:
当用户三次密码输入错误的时候,alarming为1,此时,只要管理员密码输入正确后,按下clear键,alarming为0,报警取消。
管理员修改密码:
在非警报和为开锁状态下,任何时候按admin键进入管理员状态。
按chgcode选择修改密码,先选择修改的是用户密码还是管理员密码。
修改用户密码则按user键,修改管理员密码则按admin键。
然后分别输入旧密码,新密码,新密码要输入两次。
旧密码与所要修改的密码对应。
如旧密码输入错误,则无法修改;
当验证不成功即两次新密码不相同时,修改密码失败。
返回等待状态。
成功后也返回等待状态。
定时返回:
用户在未开锁状态下,60s没有按键输入,则返回等待状态,但不包括alarming状态。
只要是alarming,则只有管理输入管理员密码才能解锁并按下clear消除警报。
设计思路:
设计密码锁时,采用自顶向下的设计方法。
将整个系统分成几个子模块:
输入输出模块,控制模块,按键设置模块和60s计时器模块。
控制模块是整个程序的主要部分,采用状态循环的办法,以用户每按下一次按键为计量单位,划分状态,以实现各种功能。
60s计时器模块是完成60s没有按键则返回等待状态这一功能的主要模块。
这个模块的核心思想是一个变量numtime计数。
变量numtime的初始值为0,在无报警为开锁的情况下,时钟每秒发出一个上升沿信号,计数一次,如有按键则numtime清零,否则计数到60即“111100”则返回信号back变为1,返回等待状态。
按键设置模块是将各种功能按键用高低电平赋值,便于调用。
实验设计程序如下:
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
----Uncommentthefollowinglibrarydeclarationifinstantiating
----anyXilinxprimitivesinthiscode.
--libraryUNISIM;
--useUNISIM.VComponents.all;
entitylockis
PORT(
clk,user,admin,clear,enter,chgcode,res,numenter,number:
INSTD_LOGIC;
openlock:
bufferstd_logic;
alarming,model:
OUTSTD_LOGIC;
shuma2,shuma1,shuma0:
outstd_logic_vector(6downto0)
);
endlock;
architectureBehavioraloflockis
TYPESTATESIS(sw,s1,s2,s3,s4,s5,s6,s7);
SIGNALstate:
STATES;
SIGNALone_key,code0,code1,code2:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALuser_code,admin_code:
STD_LOGIC_VECTOR(11DOWNTO0);
SIGNALtemp_code,old_code:
SIGNALkey:
std_logic_vector(3downto0);
signalalarm,ifnum,s_model,chg_c,c_ua:
std_logic;
signalk:
begin
temp_code<
=code2&
code1&
code0;
model<
=s_model;
alarming<
=alarm;
main:
PROCESS(res,admin,user,clear,chgcode,number,numenter,enter)
variablen,m:
std_logic_vector(1downto0):
="
00"
;
variablenew1_code,new2_code:
std_logic_vector(11downto0);
BEGIN
if(res='
1'
)then
state<
=s1;
--出厂状态
user_code<
001000010001"
--211
admin_code<
001000010000"
--210
n:
s_model<
='
0'
c_ua<
chg_c<
K<
0000"
openlock<
alarm<
shuma2<
0000000"
shuma1<
shuma0<
ifnum<
else
if(number='
k<
=k+1;
Elsifnumenter='
then
ifnum<
Endif;
casestateis
whens1=>
if(admin='
andchg_c='
)then
elsif(user='
andalarm='
)then
elsif(ifnum='
)then
code2<
=k;
CASEkIS
WHEN"
=>
shuma2<
0111111"
WHEN"
0001"
shuma2<
0000110"
0010"
1011011"
0011"
1001111"
0100"
1100110"
0101"
1101101"
0110"
1111101"
0111"
0000111"
1000"
1111111"
1001"
1101111"
WHENOTHERS=>
ENDCASE;
state<
=s2;
andc_ua='
old_code<
=user_code;
ifnum<
CASEkIS
k<
state<
ands_model='
ifnum<
CASEkIS
=admin_code;
elsif(clear='
)then--clear
endif;
whens2=>
if(user='
)then--user
elsif(admin='
)then--admin
elsif(ifnum='
)then
code1<
shuma1<
shuma1<
=s3;
elsif(clear='
whens3=>
if(user='
code0<
shuma0<
=s4;
elsif(clear='
whens4=>
if(enter='
)then--enter
=s5;
elsif(enter='
andm="
if(old_code=temp_code)then
m:
01"
elsestate<
=sw;
elsif(enter='
new1_code:
=temp_code;
10"
new2_code:
if(new1_code=new2_codeandc_ua='
user_code<
=new2_code;
elsif(new1_code=new2_codeandc_ua='
)then
elsif(new1_code/=new2_code)then
whens5=>
if(s_model='
andtemp_code=user_code)then
=s6;
elsif(s_model='
andtemp_code/=user_code)then
=n+1;
ifn="
11"
state<
else
andtemp_code=admin_code)then
elsif(s_model='
andtemp_code/=admin_code)then
whens6=>
if(enter='
)then--enter
)then--clear
elsif(chgcode='
=s7;
whens7=>
if(user='
elsif(admin='
whensw=>
shuma2<
endcase;
ENDif;
ENDPROCESSmain;
endBehavioral;
创建测试平台仿真结果:
一:
输入密码,期间有清除,并且密码输入正确。
仿真波形图如下:
二:
在管理员状态下输入密码,之后切换到用户状态,输入三次,最后输入密码正确,开锁。
三:
输入密码错误三次,拉起警报。
管理员状态下,管理员输入正确密码解除警报。
四:
输入密码一次,密码错误,切换到管理员状态。
实验小结
这次的实习,让我学到了掌握了很多EDA的知识,这两周的实习我通过复习跟大量的查询,终于完成了这次课程的设计,让我对以前所学专业知识不足的地方有了进一步的掌握改正,让我对这门专业有了更深的理解。
这次的EDA实习任务是编写密码锁的程序并且下载在硬件实现密码锁功能,这次实习任务是我大学以来做过的最难的。
在编写密码锁程序时,有很多的难点。
一:
密码锁的功能复杂,编写程序容易混乱;
二:
硬件要去实验程序中只可以设置八个按键;
三:
题目要求用两个按键实现密码输入,一个按键控制选择输入的是第几位密码,另一位按键控制输入密码。
经过与同学以及老师的讨论,采取以下方法解决问题。
将整个系统分成输入输出模块,控制模块,按键设置模块和60s计时器模块来解决功能复杂导致的程序逻辑关系不清的问题;
将确认键和enter键合并,切换键与user键合并解决按键不足的问题:
采用计数法实现