1、电子密码锁EDA课程设计162020年4月19日文档仅供参考,不当之处,请联系改正。青岛农业大学电子设计自动化课程设计报告 第2学期 实习题目: 电子密码锁 姓 名 :_ _ 学 号 :_ _ _ _ 专业班级:_电自化1003_ 指导老师:_ _ _ 6月8日EDA课程设计一、设计任务 1、基本要求(1)、设计一个密码锁的控制电路,当输入正确代码时,输出开锁信号以推动执行机构工作,用红灯亮、绿灯熄灭表示关锁,用绿灯亮、红灯熄灭表示开锁;(2)、在锁的控制电路中储存一个能够修改的4位代码,当开锁按钮开关(可设置成6位至8位,其中实际有效为4位,其余为虚设)的输入代码等于储存代码时,开锁;(3)
2、、从第一个按钮触动后的5秒内若未将锁打开,则电路自动复位并进入自锁状态,使之无法再打开,并由扬声器发出持续20秒的报警信号。2、要解决的关键问题(1)、该题的主要任务是产生一个开锁信号,而开锁信号的形成条件是,输入代码和已设密码相同。实现这种功能的电路构思有多种,例如,用两片8位锁存器,一片存入密码,另一片输入开锁的代码,经过比较的方式,若两者相等,则形成开锁信号。(2)、在产生开锁信号后,要求输出声、光信号,声音的产生由开锁信号触动扬声器工作,光信号由开锁信号点亮LED指示灯;(3)、用按钮开关的第一个动作信号触发一个5秒定时器,若5秒内无开锁信号产生,让扬声器发出特殊音响,以示警告,并输出
3、一个信号推动LED不断闪烁。二、设计方案1、总体设计思想本设计采用VHDL语言进行编程,把所有的功能都整合到一个程序,采用不同的进程将不同的功能区分开来。该程序主要由密码输入进程、密码修改进程、密码锁操作进程、报警计时进程和报警动作进程等组成。这样设计的好处是不用设计顶层文件或者顶层原理图,没有复杂的连线。当然,仅仅是对于一些功能简单,代码较短的程序采用该种方法编程,而该题目正好符合这个条件。该功能共有两个时钟信号,一个是键盘扫描和系统时钟,采用的是1Hz的时钟信号,该信号不但能够防止键盘抖动引起的误操作,还有助于系统计时。因为报警电路中的蜂鸣器为无源蜂鸣器,因此需要一个方波信号来驱动蜂鸣器,
4、使其发出声音。因此又采用了一个1KHz的信号用于驱动蜂鸣器。为了编程简单,本设计采用的是八个独立键盘,四个按键用于输入密码,四个按键作为功能键。四位0000到9999可任意改变的密码,输入密码或者更改密码时,采用的是自加运算,当数字加到10以后,自动清零。另外四个功能健分别是开锁键、关锁键、修改密码键、清除自锁健。本设计采用LED显示和数码管显示,LED主要用于表示现在的密码锁的开关状态,数码管用于显示输入的数值。该种显示清晰明了,能够防止误操作的发生。另外还采用蜂鸣器和LED闪烁报警,当从输入第一个密码开始计时,如果5秒内没有开锁,密码锁会自动报警20S,并让一个LED灯闪烁,直到自锁信号解
5、除。2、系统设计实现的基本功能(1) 密码输入:每按下一个数字键,就输入一个数值,并在显示器相应位置上显示出该数值。(2) 密码清除:按下开锁键和关锁键进入锁定和开锁状态后,系统自动可清除前面所有的输入值,清除成为“0000”。(3) 密码更改:当密码锁位于开锁状态下,按下更改键能够设定新的密码(4) 密码上锁:按下上锁键可将密码锁上锁。(5) 密码解除:按下解除键首先检查输入的密码是否正确,密码正确即解锁。(6) 密码自锁:从输入第一个密码开始计时,如果5秒内没有开锁,密码锁会自动报警,并进入自锁状态,此时不允许任何操作。(7) 自锁清除:经过自锁清除键能够清除自锁状态,使密码锁进入正常工作
6、状态。3、系统程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY LOCK ISPORT(CLK,CLK5:IN STD_LOGIC; KEY1,KEY2,KEY3,KEY4,KEY5,KEY6,KEY7,KEY8:IN STD_LOGIC; Q1,Q2,Q3,Q4:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); LED_G,LED_R,LED,BEEP:OUT STD_LOGIC);END LOCK;ARCHITECTURE BEHAV OF LOCK IS S
7、IGNAL PASSWORD1:STD_LOGIC_VECTOR(3 DOWNTO 0):=0001; SIGNAL PASSWORD2:STD_LOGIC_VECTOR(3 DOWNTO 0):=0001; SIGNAL PASSWORD3:STD_LOGIC_VECTOR(3 DOWNTO 0):=0001; SIGNAL PASSWORD4:STD_LOGIC_VECTOR(3 DOWNTO 0):=0001; SIGNAL JISHI5:STD_LOGIC_VECTOR(3 DOWNTO 0):=0000; SIGNAL JISHI20:STD_LOGIC_VECTOR(4 DOWNT
8、O 0):=00000; SIGNAL ZISUO,FLAG,BEEP_FLAG,KAI,LED_TMP:STD_LOGIC:=0; SIGNAL CODE1,CODE2,CODE3,CODE4:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN PROCESS(clk,key1,key2,key3,key4,key6)BEGINIF ZISUO=0 AND KEY6=0 AND KAI=0 THEN IF KEY1EVENT AND KEY1=1 THEN -用来输入代码,在关锁状况下,而且无开锁和设置密码信号下有效 IF CODE19 THEN CODE1=CODE1+
9、1; ELSE CODE10); END IF; END IF; IF KEY2EVENT AND KEY2=1 THEN IF CODE29 THEN CODE2=CODE2+1; ELSE CODE20); END IF; END IF; IF KEY3EVENT AND KEY3=1 THEN IF CODE39 THEN CODE3=CODE3+1; ELSE CODE30); END IF; END IF; IF KEY4EVENT AND KEY4=1 THEN IF CODE49 THEN CODE4=CODE4+1; ELSE CODE40); END IF; END IF;
10、ELSIF(ZISUO=0 AND KEY7=1 AND KAI=1)THEN CODE1=0000;CODE2=0000;CODE3=0000;CODE4=0000; -这一步很重要,重新上锁必须将密码值清零,不然会显示上次输入的密码 IF KEY6=1 AND KAI=1 THEN -显示密码 Q1=PASSWORD1; Q2=PASSWORD2; Q3=PASSWORD3; Q4=PASSWORD4; END IF; IF KEY6=0 AND KAI=0 THEN -显示要更改的密码 Q1=CODE1; Q2=CODE2; Q3=CODE3; Q4=CODE4; END IF; IF
11、KEY6=0 AND KAI=1 THEN -开锁后显示零 Q1=0000; Q2=0000; Q3=0000; Q4=0000; END IF; ELSIF ZISUO=0 AND KEY6=1 AND KAI=1 THEN -按住KEY6设置密码,此时必须是开锁状态 IF KEY1EVENT AND KEY1=1 THEN IF PASSWORD19 THEN PASSWORD1=PASSWORD1+1; ELSE PASSWORD10); END IF; END IF; IF KEY2EVENT AND KEY2=1 THEN IF PASSWORD29 THEN PASSWORD2=P
12、ASSWORD2+1; ELSE PASSWORD20); END IF; END IF; IF KEY3EVENT AND KEY3=1 THEN IF PASSWORD39 THEN PASSWORD3=PASSWORD3+1; ELSE PASSWORD30); END IF; END IF; IF KEY4EVENT AND KEY4=1 THEN IF PASSWORD49 THEN PASSWORD4=PASSWORD4+1; ELSE PASSWORD40); End IF; END IF; END IF; END PROCESS; PROCESS (CLK,key5,key7)
13、 BEGIN IF CLKEVENT AND CLK=1 THEN IF KEY5=1 AND ZISUO=0 AND KEY6=0 THEN IF PASSWORD1=CODE1 AND PASSWORD2=CODE2 AND PASSWORD3=CODE3 AND PASSWORD4=CODE4 THEN KAI=1; -按下开锁键后,如果密码正确,开锁 ELSE KAI=0; END IF; END IF; END IF; IF KAI=1 THEN LED_G=1;LED_R=0; -开锁后红灯灭绿灯亮,否则红灯亮绿灯灭 ELSE LED_G=0;LED_R=1; END IF; IF
14、 KEY7=1 AND KEY6=0 THEN -关锁按钮按下后关锁 KAI=0 ;LED_G=0;LED_R=1; END IF; END PROCESS; PROCESS(CLK,KEY1,KEY8) BEGIN IF(KEY1EVENT AND KEY1=1)THEN FLAG=1; END IF; IF CLKEVENT AND CLK=1 THEN -按下第一个按键时 置位标志位FLAG,开始计时 IF(FLAG=1)THEN IF ZISUO=0 AND KEY6=0 AND KAI=0 THEN IF JISHI55 THEN JISHI5=JISHI5+1; ELSE JISH
15、I5=0000; END IF; END IF; END IF; IF (JISHI5=5 AND KAI=0) THEN -如果5秒后未开锁则进入自锁状态 ZISUO=1; END IF; END IF; IF KAI=1 THEN -5秒内开锁 计时清零,标志位清零 JISHI5=0000;FLAG=0; END IF; IF KEY8=1 AND ZISUO=1 THEN -K8按下后清除自锁 ZISUO=0;FLAG=0; END IF; END PROCESS; PROCESS(CLK,KEY8,CLK5) BEGIN IF CLKEVENT AND CLK=1 THEN -如果自锁
16、则蜂鸣器持续20秒发声 IF ZISUO=1 THEN IF JISHI2020 THEN JISHI20=JISHI20+1; BEEP_FLAG=1; -置位蜂鸣器标志位 ELSE BEEP_FLAG=0; END IF; LED_TMP=NOT LED_TMP; -进入自锁后灯闪烁提示 LED=LED_TMP; END IF; IF ZISUO=0 THEN -自锁解除,清零计时值和标志位 JISHI20=00000;LED=0;BEEP_FLAG=0;LED_TMP=0;JISHI20=00000; END IF; END IF; IF BEEP_FLAG=1 THEN -判断蜂鸣器标
17、志位是否为1 IF CLK5=1 THEN -CLK5给无源蜂鸣器提供1K的时钟信号 BEEP=1; ELSE BEEP=0; END IF; END IF;END PROCESS;END BEHAV;三、心得体会一周的EDA实习结束,经过自己的努力和团队之间的合作,我们圆满的完成了课程设计的各项要求,当看到自己的成果,心里的成就感让自己感到喜悦。但这次实习带给我们的不但仅是这些,还有就是从中学到的其它的东西。在自己没有进行实习前,自认为自己的EDA学得还不错,而且平常的实验室表现也能够,大部分的实验都能独立完成并顺利经过验收。但当自己真正开始做一个实际的东西时,发现自己所学的知识还是远远不够
18、的,毕竟理论和实践之间还是存在很大的差距的。刚发下题目的时候,觉得有些无从下手,根本就找不到一个合理的方案。于是开始从图书馆借书,从网上找资料。经过半天的研究,自己才算是有一些思路。因此,该次实习让我看到自己的水平还有待提升,而且让我明白,从理论到实际,并不是那么简单。另外,方案的确定也让我学到很多东西。刚开始的时候,我们采用的两种方案并行,到最后哪种方案合适采用哪种,而这两种方案都是从网上和书上找来的。于是我和队友分头工作,一人编写一种方案。可是当自己忙活了一天,程序编的差不多的时候,才发现,别人的方案在实验室的实验箱上不可行。因为方案中采用的是矩阵键盘,而实验箱采用的独立键盘,而且数目也只
19、有八个。当然能够采用自己连线的方式外接一个矩阵键盘,但这样的话,稳定性不高,只要任何一根线没有连接合适,整个系统就无法工作了。因此,这个时候我们只有更换方案,但问题又出来了,根本找不到有关独立键盘的任何例程,如果更换方案的话,所有的程序必须自己编写。可是,自己是否能完成程序的编写自己都不确定。后来,我们决定试一试,舍掉以前所有的方案,根据要求自己编写程序。幸运的是,最后我们把程序编了出来,而且还实现了各种要求。经过这件事,让自己认识到自己的两点不足。一个是方案的确定太过仓促。确定方案时,必须做好前期调查,正确分析,做出正确的判断,确保方案能够正确实施。因为自己时间有限,因此最好不要采用多种方案
20、,这样会分散你的经历,确定一个最佳的方案,然后把全部的经历用在这个方案上。另外就是,不要对自己太过自信,也不要太没有自信。不尝试一下,谁也不会知道结果会是怎样,有时候压力确实会让你的潜力发挥出来,高效的完成一个任务。在一个就是对于EDA方面的提升,因为自己有过编程的基础,因此对于编程来说,并不是很陌生。但当自己真正的去编写VHDL程序时,还是有一定的困难。毕竟VHDL和C语言还是有很多不同的。其中在编写程序时,有个问题就困扰了我很久。就是在两个互不影响的进程中对同一个信号进行赋值,也就是说这两个进程能够同时满足,但里面有个相同的信号,这样的话,这个信号可能会被多次赋值,这时候编译的时候就会出错。但自己没有意识到这个问题。后来经过查阅,才找出问题所在。后来发现,不但是进程,两个互不影响的顺序语句也不能对同一个信号或变量进行赋值。经过自己编程的经历,让自己意识到,有些东西,你不自己亲手做,问题永远发现不了,那自己也不可能会有进步。实习结束了,但在实习中学到的东西却还没有结束,就是经过这样的实践操作,才会让自己真正把理论应用于实践,才会真正的学以致用。