vhdl四位密码锁课程设计eda文档格式.doc

上传人:聆听****声音 文档编号:3642050 上传时间:2023-05-02 格式:DOC 页数:19 大小:90KB
下载 相关 举报
vhdl四位密码锁课程设计eda文档格式.doc_第1页
第1页 / 共19页
vhdl四位密码锁课程设计eda文档格式.doc_第2页
第2页 / 共19页
vhdl四位密码锁课程设计eda文档格式.doc_第3页
第3页 / 共19页
vhdl四位密码锁课程设计eda文档格式.doc_第4页
第4页 / 共19页
vhdl四位密码锁课程设计eda文档格式.doc_第5页
第5页 / 共19页
vhdl四位密码锁课程设计eda文档格式.doc_第6页
第6页 / 共19页
vhdl四位密码锁课程设计eda文档格式.doc_第7页
第7页 / 共19页
vhdl四位密码锁课程设计eda文档格式.doc_第8页
第8页 / 共19页
vhdl四位密码锁课程设计eda文档格式.doc_第9页
第9页 / 共19页
vhdl四位密码锁课程设计eda文档格式.doc_第10页
第10页 / 共19页
vhdl四位密码锁课程设计eda文档格式.doc_第11页
第11页 / 共19页
vhdl四位密码锁课程设计eda文档格式.doc_第12页
第12页 / 共19页
vhdl四位密码锁课程设计eda文档格式.doc_第13页
第13页 / 共19页
vhdl四位密码锁课程设计eda文档格式.doc_第14页
第14页 / 共19页
vhdl四位密码锁课程设计eda文档格式.doc_第15页
第15页 / 共19页
vhdl四位密码锁课程设计eda文档格式.doc_第16页
第16页 / 共19页
vhdl四位密码锁课程设计eda文档格式.doc_第17页
第17页 / 共19页
vhdl四位密码锁课程设计eda文档格式.doc_第18页
第18页 / 共19页
vhdl四位密码锁课程设计eda文档格式.doc_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

vhdl四位密码锁课程设计eda文档格式.doc

《vhdl四位密码锁课程设计eda文档格式.doc》由会员分享,可在线阅读,更多相关《vhdl四位密码锁课程设计eda文档格式.doc(19页珍藏版)》请在冰点文库上搜索。

vhdl四位密码锁课程设计eda文档格式.doc

系统操作过程中,只要密码锁没有打开,如果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:

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='

)then

state<

=ss;

--出厂状态,用来初始化密码锁的各项设置

user_code<

0001001000110100"

--1234

admin_code<

0000000000000000"

--0000

n:

s_ua<

='

0'

c_ua<

chg_c<

new_ctime<

alarm<

elsifclk'

EVENTANDclk='

then

casestateis

whenss=>

=s0;

whens0=>

ifback='

state<

=sw;

elsif(ifnum='

andalarm='

andchg_c='

)then

code3<

=one_key;

out_code<

0001"

=s1;

andc_ua='

andchg_c='

old_code<

=user_code;

ands_ua='

=admin_code;

elsif(one_key="

0011"

andchg_c='

)then

s_ua<

0100"

)then

endif;

whens1=>

elsif(ifnum='

)then

code2<

=s2;

0000"

)then--clear

)then--user

)then--admin

whens2=>

then

code1<

0111"

=s3;

whens3=>

code0<

1111"

=s4;

)then

)then

whens4=>

)then--enter

=s5;

andm="

if(old_code=temp_code)then

m:

01"

state<

elsestate<

endif;

out_code<

new1_code:

=temp_code;

10"

new2_code:

if(new1_code=new2_codeandc_ua='

user_code<

=new2_code;

state<

elsif(new1_code=new2_codeandc_ua='

admin_code<

elsif(new1_code/=new2_code)then

elsif(one_key="

)then--clear

endif;

whens5=>

if(s_ua='

andtemp_code=user_code)then

openlock<

=s6;

elsif(s_ua='

andtemp_code/=user_code)then

n:

=n+1;

ifn="

11"

alarm<

state<

out_code<

else

endif;

andtemp_code=admin_code)then

elsif(s_ua='

andtemp_code/=admin_code)then

whens6=>

elsif(one_key="

)then--enter

andalarm='

)then--clear

alarm<

0010"

chg_c<

=s7;

whens7=>

m:

c_ua<

whensw=>

alarm<

s_ua<

c_ua<

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2