《VHDL四位密码锁课程设计EDA2.doc》由会员分享,可在线阅读,更多相关《VHDL四位密码锁课程设计EDA2.doc(13页珍藏版)》请在三一办公上搜索。
1、电子与信息工程学院电子线路课程设计报告( 2011 2012 学年 第 一 学期) 课程设计题目:四位密码锁内容和要求:1. 掌握VHDL语言的使用,学会用VHDL语言来编程解决实际问题;2. 学会使用EDA开发软件设计小型综合电路,掌握仿真的技巧;3. 学会应用开发系统实现硬件电路,检验电路的功能。4.用VHDL语言设计一个密码锁,用波形仿真验证其功能后,实现到GW48实验系统。功能描述:用于模仿密码锁的工作过程。完成密码锁的核心控制功能。功能要求: 设计一个密码锁,平时处于等待状态。管理员可以设置或更改密码。如果不预置密码,密码缺省为“1234”。用户如果需要开锁,按相应的按键进入输入密码
2、状态,输入4位密码,按下确定键后,若密码正确,锁打开;若密码错误,将提示密码错误,要求重新输入,三次输入都错误,将发出报警信号。报警后,只有管理员作相应的处理才能停止报警。用户输入密码时,若输入错误,在按下确定键之前,可以通过按取消键重新输入。正确开锁后,用户处理完毕后,按下确定键,系统回到等待状态。系统操作过程中,只要密码锁没有打开,如果60秒没有对系统操作,系统回到等待状态。要求密码在输入过程中被依次显示,即先输入的为密码的第一位,总是显示在最左边。用两个发光二极管模拟显示,其中一个显示当前的工作模式,灭表示用户模式,亮表示管理员模式;另外一个指示锁的状态,灭表示锁处于锁定,亮表示锁被开启
3、。注意:用两个按键实现密码输入,Key1选择输入的是第几位密码,KEY2输入密码数字。 功能描述:初始状态:初次使用密码锁时,要先用Reset键初始化。初始状态下,用户密码为“1234”,管理员密码为“0000”。用户开锁:默认情况下,密码锁处于用户使用状态。如果当前为管理员状态,则按下user键回到用户状态。用户开锁时,输入四位数用户密码,可以从OutCode6的输出状态确定密码输入状态。如输入错误则按下clear清除前一位输入。输入完毕后按enter,如果密码正确,则开锁,否则重新输入密码。开锁后再次按下enter键则关锁,回到等待状态。三次密码输入错误,警报器AlarmSignaling
4、为1。要管理员输入管理员密码解除警报。此时哪怕用户再输对密码也没用。管理员解除警报:当用户三次密码输入错误的时候,AlarmSignaling为1,此时,只要管理员密码输入正确后,按下clear键,AlarmSignaling为0,报警取消。管理员修改密码:在非警报和为开锁状态下,任何时候按admin键进入管理员状态。按chgcode选择修改密码,先选择修改的是用户密码还是管理员密码。修改用户密码则按user键,修改管理员密码则按admin键。然后分别输入旧密码,新密码,新密码要输入两次。旧密码与所要修改的密码对应。如旧密码输入错误,则无法修改;当验证不成功即两次新密码不相同时,修改密码失败。
5、返回等待状态。成功后也返回等待状态。定时返回:用户在未开锁状态下,60s没有按键输入,则返回等待状态,但不包括AlarmSignaling状态。只要是AlarmSignaling,则只有管理输入管理员密码才能解锁并按下clear消除警报。设计内容(原理图以及相关说明、调试过程、结果)设计思路:设计密码锁时,采用自顶向下的设计方法。将整个系统分成几个子模块:输入输出模块,控制模块,按键设置模块和60s计时器模块。 控制模块是整个程序的主要部分,采用状态循环的办法,以用户每按下一次按键为计量单位,划分状态,以实现各种功能。60s计时器模块是完成60s没有按键则返回等待状态这一功能的主要模块。这个模
6、块的核心思想是一个变量NumTime计数。变量NumTime的初始值为0,在无报警为开锁的情况下,时钟每秒发出一个上升沿信号,计数一次,如有按键则NumTime清零,否则计数到60即“111100”则返回信号back变为1,返回等待状态。按键设置模块是将各种功能按键用高低电平赋值,便于调用。程序设计:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY E_lock IS PORT( Clk,user,admin,clear,enter,chgcode,res:IN STD_LOGIC;
7、num:IN STD_LOGIC_VECTOR(9 DOWNTO 0); LockOpen:buffer std_logic; AlarmSignaling,o_ua,o_chgcode,chgcode_ua:OUT STD_LOGIC; OutCode6:out std_logic_vector(3downto 0) ); END E_lock;ARCHITECTURE behave OF E_lock ISTYPE STATES IS (ss,sw,s0,s1,s2,s3,s4,s5,s6,s7,s8,s9);SIGNAL state:STATES;SIGNAL key1,code0,co
8、de1,code2,code3,code4,code5:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL UserPassword,AdminPassword:STD_LOGIC_VECTOR(23 DOWNTO 0);SIGNAL TempCode,OldCode:STD_LOGIC_VECTOR(23 DOWNTO 0);SIGNAL new_ctime:STD_LOGIC_VECTOR(1 DOWNTO 0);SIGNAL key:std_logic_vector(14 downto 0);SIGNAL AlarmSignal,inkey,IfNum,s_ua,ch
9、g_c,c_ua,back:std_logic;SIGNAL OutCode:std_logic_vector(5 downto 0);SIGNAL NumTime:std_logic_vector(9 downto 0);BEGIN TempCode=code0&code1&code2&code3&code4&code5; key=user&admin&chgcode&enter&clear# inkey=user or admin or chgcode or enter or clear or num(0) or num(1) or num(2) or num(3) or num(
10、4) or num(5) or num(6) or num(7) or num(8) or num(9); IfNum=not(key1(3) and (key1(2) or key1(1); o_ua=s_ua; chgcode_ua=c_ua; o_chgcode=chg_c; OutCode6=OutCode; AlarmSignaling=AlarmSignal; main:PROCESS(res,Clk) variable n,m:std_logic_vector(1 downto 0):=00; variable NewCode1,NewCode2:std_logic_vector
11、(23 downto 0); BEGIN if (res=1)then state=ss; UserPassword=100110011001100110011001; AdminPassword=000000000000000000000000; n:=00; s_ua=0; c_ua=0; chg_c=0; new_ctime=00; AlarmSignal state if back=1 then state=sw; elsif (IfNum=1 and AlarmSignal=0 and chg_c=0 ) then code5=key1; OutCode=0001; state=s1
12、; elsif (IfNum=1 and c_ua=0 and chg_c=1 ) then OldCode=UserPassword; code5=key1; OutCode=0001; state=s1; elsif (IfNum=1 and AlarmSignal=1 and s_ua=1 and chg_c=0 ) then code5=key1; OutCode=0001; state=s1; elsif (IfNum=1 and c_ua=1 and chg_c=1 ) then OldCode=AdminPassword; code5=key1; OutCode=0001; st
13、ate=s1; elsif (key1=1101and chg_c=0 )then s_ua=1; state=s0; elsif (key1=1110and chg_c=0 and AlarmSignal=0) then s_ua=0; state if back=1 then state=sw; elsif(IfNum=1)then code4=key1; OutCode=0011; state=s2; elsif (key1=1010)then OutCode=0000; state=s0; elsif (key1=1110 and chg_c=0) then OutCode=0000;
14、 s_ua=0; state=s0; elsif (key1=1101 and chg_c=0) then OutCode=0000; s_ua=1; state if back=1 then state=sw; elsif(IfNum=1)then code3=key1; OutCode=0111; state=s3; elsif (key1=1010)then OutCode=0001; state=s1; elsif (key1=1110 and chg_c=0) then OutCode=0000; s_ua=0; state=s0; elsif (key1=1101 and chg_
15、c=0) then OutCode=0000; s_ua=1; state if back=1 then state=sw; elsif(IfNum=1)then code2=key1; OutCode=1111; state=s4; elsif (key1=1010)then OutCode=0011; state=s2; elsif (key1=1110 and chg_c=0) then OutCode=0000; s_ua=0; state=s0; elsif (key1=1101 and chg_c=0) then OutCode=0000; s_ua=1; state if bac
16、k=1 then state=sw; elsif(IfNum=1)then code1=key1; OutCode=1111; state=s5; elsif (key1=1010)then OutCode=0111; state=s3; elsif (key1=1110 and chg_c=0) then OutCode=0000; s_ua=0; state=s0; elsif (key1=1101 and chg_c=0) then OutCode=0000; s_ua=1; state if back=1 then state=sw; elsif(IfNum=1)then code0=
17、key1; OutCode=1111; state=s6; elsif (key1=1010)then OutCode=1111; state=s4; elsif (key1=1110 and chg_c=0) then OutCode=0000; s_ua=0; state=s0; elsif (key1=1101 and chg_c=0) then OutCode=0000; s_ua=1; state if back=1 then state=sw; elsif (key1=1011 and chg_c=0)then state=s7; OutCode=0000; elsif (key1
18、=1011 and chg_c=1and m=00)then OutCode=0000; if (OldCode=TempCode) then m:=01; state=s0; else state=sw; end if; elsif (key1=1011 and chg_c=1and m=01)then OutCode=0000; NewCode1:=TempCode; m:=10; state=s0; elsif (key1=1011 and chg_c=1and m=10)then OutCode=0000; NewCode2:=TempCode; if (NewCode1=NewCod
19、e2 and c_ua=0) then UserPassword=NewCode2; state=sw; elsif(NewCode1=NewCode2 and c_ua=1)then AdminPassword=NewCode2; state=sw; elsif(NewCode1/=NewCode2) then state=sw; end if; elsif (key1=1010)then OutCode=1111; state if (s_ua=0 and TempCode=UserPassword) then LockOpen=1; state=s8; elsif (s_ua=0and
20、TempCode/=UserPassword) then n:=n+1; if n=11 then AlarmSignal=1; state=s0; OutCode=0000; else state=s0; OutCode=0000; end if; elsif (s_ua=1 and TempCode=AdminPassword) then state=s8; elsif(s_ua=1 and TempCode/=AdminPassword) then state if back=1 then state=sw; elsif(key1=1011)then-enter state=sw; el
21、sif(key1=1010and AlarmSignal=1) then AlarmSignal=0; state=s0; OutCode=0000; elsif(key1=1100) then chg_c=1; state m:=00; if back=1 then state=sw; elsif(key1=1110)then c_ua=0; OldCode=UserPassword; state=s0; elsif(key1=1101)then c_ua=1; OldCode=AdminPassword; state AlarmSignal=0; s_ua=0; c_ua=0; m:=00
22、; n:=00; LockOpen=0; OutCode=0000; chg_c=0; statekey1key1key1key1key1key1key1key1key1key1key1key1key1key1key1key1=1111; END CASE; end if;END PROCESS INPUT;PROCESS(inkey,res,Clk,AlarmSignal,LockOpen)variable NumTime:std_logic_vector(5 downto 0):=0000;BEGINif(res=1) then NumTime:=0000; back=0;elsif (L
23、ockOpen=1 or inkey=1)or AlarmSignal=1) then back=0; NumTime:=0000;elsif (Clkevent and Clk=1)and inkey=0 and AlarmSignal=0 and LockOpen=0)then NumTime:=NumTime+1; if NumTime=1100 then back=1; NumTime:=0000; end if;end if;end process ; END behave;实验小结:这个学期的前两周我们就被安排了这次的EDA实验,本次试验是用VHDL设计出的密码锁控制器。通过这次试
24、验我又一次巩固了ISE软件的运用,由于很长时间没用了,刚开始时着实有点生疏,后来在同学和老师的帮助下还算可以的用起来了。用VHDL操作相对其他还是比较简单的,可实现密码输入、密码校检、密码设置和更改等功能。完成后可进行电路的模拟仿真,反馈结果可验证程序设计的可行性和可靠性。本密码锁控制器设置的是四位密码,在系统复位后,用户按键四次,输入一个完整的密码串,输入完后系统会进行比对,若密码吻合就实施;若不吻合就要求用户继续输入,如果连续三次输入的密码串都是错的就系统报警。 在该次试验中遇到的问题不算少,同学的帮忙和老师的辅导是不可或缺的。相互的探讨使得我们的思路更加开阔,解决其问题来也变得省力多了。在这次的课程设计中我收获不少,在实践的同时也对以前的知识有了更深的记忆和理解。