vhdl四位密码锁课程设计eda.doc
《vhdl四位密码锁课程设计eda.doc》由会员分享,可在线阅读,更多相关《vhdl四位密码锁课程设计eda.doc(19页珍藏版)》请在冰点文库上搜索。
课程设计报告
电子与信息工程学院
电子线路课程设计报告
(2011—2012学年第一学期)
班级:
___电子0903_________
学号:
___________________
课程设计题目:
四位密码锁
内容和要求:
1.掌握VHDL语言的使用,学会用VHDL语言来编程解决实际问题;
2.学会使用EDA开发软件设计小型综合电路,掌握仿真的技巧;
3.学会应用开发系统实现硬件电路,检验电路的功能。
设计内容(原理图以及相关说明、调试过程、结果)
实验要求:
用VHDL语言设计一个密码锁,用波形仿真验证其功能后,实现到GW48实验系统。
功能描述:
用于模仿密码锁的工作过程。
完成密码锁的核心控制功能。
功能要求:
设计一个密码锁,平时处于等待状态。
管理员可以设置或更改密码。
如果不预置密码,密码缺省为“1234”。
用户如果需要开锁,按相应的按键进入输入密码状态,输入4位密码,按下确定键后,若密码正确,锁打开;若密码错误,将提示密码错误,要求重新输入,三次输入都错误,将发出报警信号。
报警后,只有管理员作相应的处理才能停止报警。
用户输入密码时,若输入错误,在按下确定键之前,可以通过按取消键重新输入。
正确开锁后,用户处理完毕后,按下确定键,系统回到等待状态。
系统操作过程中,只要密码锁没有打开,如果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;
ENTITYE_lockIS
PORT(
clk,user,admin,clear,enter,chgcode,res,key1,key2:
INSTD_LOGIC;
num:
INSTD_LOGIC_VECTOR(9DOWNTO0);
openlock:
bufferstd_logic;
alarming,o_ua,o_chgcode,chgcode_ua:
OUTSTD_LOGIC;
out_code4:
outstd_logic_vector(3downto0)
);
ENDE_lock;
ARCHITECTUREbehaveOFE_lockIS
TYPESTATESIS(ss,sw,s0,s1,s2,s3,s4,s5,s6,s7);
SIGNALstate:
STATES;
SIGNALone_key,code0,code1,code2,code3:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALuser_code,admin_code:
STD_LOGIC_VECTOR(15DOWNTO0);
SIGNALtemp_code,old_code:
STD_LOGIC_VECTOR(15DOWNTO0);
SIGNALnew_ctime:
STD_LOGIC_VECTOR(1DOWNTO0);
SIGNALkey:
std_logic_vector(7downto0);
SIGNALalarm,inkey,ifnum,s_ua,chg_c,c_ua,back:
std_logic;
SIGNALout_code:
std_logic_vector(3downto0);
SIGNALnumtime:
std_logic_vector(9downto0);
BEGIN
temp_code<=code0&code1&code2&code3;
key<=user&admin&chgcode&enter&clear&res&key1&key2;
inkey<=useroradminorchgcodeorenterorclearorkey1orkey2;
ifnum<=not(one_key(3)and((one_key
(2)orone_key
(1))));
--ifnum='1',thekeyisanum
o_ua<=s_ua;--表明当前状态
chgcode_ua<=c_ua;--表明当前更改的密码为用户密码或是管理员密码
o_chgcode<=chg_c;--当状态为“1”时表明正在修改密码
out_code4<=out_code;
alarming<=alarm;
main:
PROCESS(res,clk)
variablen,m:
std_logic_vector(1downto0):
="00";
variablenew1_code,new2_code:
std_logic_vector(15downto0);
BEGIN
if(res='1')then
state<=ss;--出厂状态,用来初始化密码锁的各项设置
user_code<="0001001000110100";--1234
admin_code<="0000000000000000";--0000
n:
="00";
s_ua<='0';
c_ua<='0';
chg_c<='0';
new_ctime<="00";
alarm<='0';
elsifclk'EVENTANDclk='1'then
casestateis
whenss=>
state<=s0;
whens0=>
ifback='1'then
state<=sw;
elsif(ifnum='1'andalarm='0'andchg_c='0')then
code3<=one_key;
out_code<="0001";
state<=s1;
elsif(ifnum='1'andc_ua='0'andchg_c='1')then
old_code<=user_code;
code3<=one_key;
out_code<="0001";
state<=s1;
elsif(ifnum='1'andalarm='1'ands_ua='1'andchg_c='0')then
code3<=one_key;
out_code<="0001";
state<=s1;
elsif(ifnum='1'andc_ua='1'andchg_c='1')then
old_code<=admin_code;
code3<=one_key;
out_code<="0001";
state<=s1;
elsif(one_key="0011"andchg_c='0')then
s_ua<='1';
state<=s0;
elsif(one_key="0100"andchg_c='0'andalarm='0')then
s_ua<='0';
state<=s0;
endif;
whens1=>
ifback='1'then
state<=sw;
elsif(ifnum='1')then
code2<=one_key;
out_code<="0011";
state<=s2;
elsif(one_key="0000")then--clear
out_code<="0000";
state<=s0;
elsif(one_key="0100"andchg_c='0')then--user
out_code<="0000";
s_ua<='0';
state<=s0;
elsif(one_key="0011"andchg_c='0')then--admin
out_code<="0000";
s_ua<='1';
state<=s0;
endif;
whens2=>
ifback='1'then
state<=sw;
elsif(ifnum='1')then
code1<=one_key;
out_code<="0111";
state<=s3;
elsif(one_key="0000")then
out_code<="0001";
state<=s1;
elsif(one_key="0100"andchg_c='0')then
out_code<="0000";
s_ua<='0';
state<=s0;
elsif(one_key="0011"andchg_c='0')then
out_code<="0000";
s_ua<='1';
state<=s0;
endif;
whens3=>
ifback='1'then
state<=sw;
elsif(ifnum='1')then
code0<=one_key;
out_code<="1111";
state<=s4;
elsif(one_key="0000")then
out_code<="0011";
state<=s2;
elsif(one_key="0100"andchg_c='0')then
out_code<="0000";
s_ua<='0';
state<=s0;
elsif(one_key="0011"andchg_c='0')then
out_code<="0000";
s_ua<='1';
state<=s0;
endif;
whens4=>
ifback='1'then
state<=sw;
elsif(one_key="0001"andchg_c='0')then--enter
state<=s5;
out_code<="0000";
elsif(one_key="0001"andchg_c='1'andm="00")then--enter
out_code<="0000";
if(old_code=temp_code)then
m:
="01";
state<=s0;
elsestate<=sw;
endif;
elsif(one_key="0001"andchg_c='1'andm="01")then--enter
out_code<="0000";
new1_code:
=temp_code;
m:
="10";
state<=s0;
elsif(one_key="0001"andchg_c='1'andm="10")then--enter
out_code<="0000";
new2_code:
=temp_code;
if(new1_code=new2_codeandc_ua='0')then
user_code<=new2_code;
state<=sw;
elsif(new1_code=new2_codeandc_ua='1')then
admin_code<=new2_code;
state<=sw;
elsif(new1_code/=new2_code)then
state<=sw;
endif;
elsif(one_key="0000")then--clear
out_code<="0111";
state<=s3;
endif;
whens5=>
if(s_ua='0'andtemp_code=user_code)then
openlock<='1';
state<=s6;
elsif(s_ua='0'andtemp_code/=user_code)then
n:
=n+1;
ifn="11"then
alarm<='1';
state<=s0;
out_code<="0000";
else
state<=s0;
out_code<="0000";
endif;
elsif(s_ua='1'andtemp_code=admin_code)then
state<=s6;
elsif(s_ua='1'andtemp_code/=admin_code)then
state<=sw;
endif;
whens6=>
ifback='1'then
state<=sw;
elsif(one_key="0001")then--enter
state<=sw;
elsif(one_key="0000"andalarm='1')then--clear
alarm<='0';
state<=s0;
out_code<="0000";
elsif(one_key="0010")then
chg_c<='1';
state<=s7;
endif;
whens7=>
m:
="00";
ifback='1'then
state<=sw;
elsif(one_key="0100")then
c_ua<='0';
old_code<=user_code;
state<=s0;
elsif(one_key="0011")then
c_ua<='1';
old_code<=admin_code;
state<=s0;
endif;
whensw=>
alarm<='0';
s_ua<='0';
c_ua<='0';
m:
="00";