东北石油大学课程设计2011年3月11日课程EDA技术课程设计题目电子密码锁院系电子科学学院专业班级电子信息工程学生姓名徐进学生学号070901140207指导教师东北石油大学课程设计任务书课程EDA技术课程设计题目电子密码锁专业电子信息工程姓名徐进学号070901140207主要内容:设计一个密码锁的控制电路,第一个按钮触动后的5秒内若未将锁打开,则电路自动复位并进入自锁状态,当输入正确代码时,输出开锁信号以推动执行机构工作。设计内容、技术条件和要求1、设计一个密码锁的控制电路,当输入正确代码时,输出开锁信号以推动执行机构工作,用红灯亮、绿灯熄灭表示关锁,用绿灯亮、红灯熄灭表示开锁;2、在锁的控制电路中储存一个可以修改的4位二进制代码,当开锁按钮开关的输入代码等于储存代码时,开锁;3、从第一个按钮触动后的5秒内若未将锁打开,则电路自动复位并进入自锁状态,使之无法再打开,并由扬声器发出持续20秒的报警信号,并输出一个信号推动LED不断闪烁4、主要参考文献[1]潘松著.EDA技术实用教程(第二版).北京:科学出版社,2005.[2]康华光主编.电子技术基础模拟部分.北京:高教出版社,2006.[3]阎石主编.数字电子技术基础.北京:高教出版社,2003.[4]谭会生、瞿遂春,《EDA技术综合应用实例与分析》,西安电子科技大学出版社,2004[5]高有堂,《EDA技术及应用实践》,清华大学出版社,2006完成期限2010.3.11指导教师专业负责人2010年3月7日一、设计思路根据设计要求,该电子密码锁主要有设置密码,5秒时间输入密码(即第一个按键按下后的5秒内输入密码),报警(即超出5秒后若未将锁开启则扬声器发出20秒的报警信号,同时一个LED不断闪烁),开锁时输出声光信号(即扬声器发出5秒的信号,同时对应的指示灯发生变换)的功能。因此,我的设计思路是输入datain(3downto0)为四位密码按键,其对应的二进制序列为密码(当然也可以设置6位或8位,其中实际有效为4位,其余为虚设),enter1为设置密码确认键(上升沿有效),enter2为输入密码确认键(上升沿有效),set为模式选择键(0为设置密码,1为输入密码),系统时钟clk_1k设置为1024Hz;输出有led_r(红灯)、led_g(绿灯)、led_alert(报警指示灯)、speaker(扬声器)。首先在set为0的情况下,将4位按键设置成想要的密码(例如1001),然后按一下enter1将密码锁存起来,这时对应的指示灯由红灯灭、绿灯灭变成红灯亮、绿灯灭(表示关锁),接着将set设为1,此时将4位按键设置成输入的密码(初始值都还原为0),按enter2进行确认,第一个按键按下后会产生一个5秒计时信号,若5秒内将锁开启,则对应的指示灯由红灯亮、绿灯灭变成红灯灭、绿灯亮(表示开锁),同时扬声器发出短暂的提示信号,若5秒后没有将锁开启,则报警,扬声器发出20秒的信号,报警指示灯闪烁20秒。二、设计步骤(一)分频由于要产生5秒、20秒的计时信号,故对系统时钟clk_1k进行分频来得到1Hz的时钟clk。其模块及部分程序如下:process(clk_1k)variablecount:std_logic_vector(9downto0);beginif(clk_1k'eventandclk_1k='1')thencount:=count+1;endif;clk=count(9);endprocess;仿真波形如下:(二)设置密码本模块主要是将设置的密码锁存到中间变量ram中去,同时控制灯的变化,由于这里的灯并不能作为最终的输出,所以这里先用led_r_temp1、led_r_temp2代替。其模块及部分程序如下:process(enter1,set)beginif(enter1'eventandenter1='1')thenif(set='0')thenram=datain;led_r_temp1='1';led_g_temp1='0';elseled_r_temp1='0';led_g_temp1='0';endif;endif;endprocess;仿真波形如下:(三)输入密码时第一个按键判断信号clk_1ksetdatain[3..0]judgejudgeinst本模块主要在密码输入下,当第一个按键按下时产生一个judge信号(高电平有效),其模块及部分程序如下:process(set,clk_1k,datain)beginif(clk_1k'eventandclk_1k='1')thenif(set='0')thenjudge='0';elsif(set='1')thenif((datain(0)ordatain(1)ordatain(2)ordatain(3))='0')thenjudge='0';elsif((datain(0)ordatain(1)ordatain(2)ordatain(3))='1')thenjudge='1';elsejudge='0';endif;endif;endif;endprocess;仿真波形如下:judgejudge_loadjudge_loadinstclkjudge_loadsetstatetime_5inst从仿真波形上看,当按键按下后judge信号由0变为1,但是当按键重新弹回0时,judge信号又回到0,所以需对judge高电平信号进行锁存:signaltemp:std_logic:='0';beginprocess(judge)beginif(judge'eventandjudge='1')thentemp='1';endif;endprocess;judge_load=temp;(四)5秒计时信号该模块是产生一个5秒计时的信号state,5秒期间为‘1’,当5秒时间过去后state变为‘0’,并作为报警信号。其模块及部分程序如下:signalcount_5:std_logic_vector(2downto0);signalstate1:std_logic;beginprocess(clk)beginif(clk'eventandclk='1')thenif(judge_load='1')then——第一个按键按下if(count_5=101)thencount_5=101;elsecount_5=count_5+1;endif;endif;endif;endprocess;process(count_5)begincasecount_5iswhen000=state1='1';when001=state1='1';when010=state1='1';when011=state1='1';when100=state1='1';whenothers=state1='0';endcase;endprocess;state=state1andset;——确保在set置为‘1’而第一个按键没有按下时,state为高电平,即刚进入输入密码状态而第一个按键没有按下时state为高电平。仿真波形如下:根据仿真波形可以看出,set为‘0’时设置密码,当set为‘1’时,在judge_load(按键识别信号)为‘0’的情况下,state为‘1’,保证下面将要提及的报警模块不会工作,而只有当judge_load为‘1’,且5秒过后state变为‘0’时才有可能发出报警信号(密码输错的情况下)。(五)开锁信号的产生本模块主要是对输入的密码进行判断,一旦密码输入正确,产生一个开锁信号unlock(高电平有效)。其模块与部分程序如下:process(enter2)beginif(enter2'eventandenter2='1')then——输入密码确认if(set='1')thenif(state='1')then——5秒期间if(datain=ram)thensetenter2statedatain[3..0]ram[3..0]unlockunlockinstunlock='1';——开锁信号elseunlock='0';endif;endif;endif;endif;endprocess;输入正确密码仿真波形:输入错误密码仿真波形:(六)报警模块本模块主要是在5秒限制时间结束时,如果还没有开锁,就产生报警信号。即长达20秒的声光信号。这里的报警信号指示灯用led_r_temp3表示,扬声器用speaker_temp2表示。其模块及部分程序如下:stateclkclk_1ksetunlockled_r_temp3speaker_temp2alertinstsignalcount_20:std_logic_vector(4downto0);signaltemp:std_logic;beginprocess(clk)beginif(clk'eventandclk='1')thenif(set='0')thentemp='0';elsif(set='1')thenif(state='0')thenif(count_20=10100)thencount_20=10100;temp='0';elsecount_20=count_20+1;temp='1';speaker_temp2=clk_1k;endif;endif;endif;endif;endprocess;led_r_temp3=tempandclkand(notunlock);speaker_temp2=tempandclk_1kand(notunlock);仿真波形如下:stateunlockclk_1kled_r_temp2led_g_temp2unlock_ledinst可见当state由‘1’变为‘0’且没有unlock信号时,输出20秒的声光信号以示报警。(七)开锁信号控制指示灯变化模块本模块是实现当开锁信号产生时,相应的指示灯由红亮绿灭变成红灭绿亮。这里同样先用led_r_temp2、led_g_temp2代表红灯和绿灯。其模块及部分程序如下:process(clk_1k,state)beginif(clk_1k'eventandclk_1k='1')thenif(state='1')thenif(unlock='1')thenled_r_temp2='0';led_g_temp2='1';elseled_r_temp2='1';led_g_temp2='0';endif;endif;endif;endprocess;clkunlockclk_1kspeaker_temp1unlock_soundinst仿真波形如下:(八)开锁信号产生2秒提示音模块当开锁信号产生时,扬声器发出两秒的提示音。这里用speaker_temp2代替。其模块及部分程序如下:signalcount_2:std_logic_vector(1downto0);signaltemp:std_logic;beginprocess(clk)beginif(clk'eventandclk='1')then——1秒Hzif(unlock='1')thenif(count_2=10)thencount_2=10;temp='0';elsecount_2=count_2+1;temp='1';endif;endif;endif;endprocess;led_r_temp1led_r_temp2led_g_temp1led_g_temp2setled_rled_gledinstspeaker_temp1=clk_1kandtemp;仿真波形如下:(九)指示灯综合输出模块本模块主要是将led_r_temp1、led_g_temp1、led_r_temp2、led_g_temp2经过条件判断选择输出,设置密码(set=‘0’)时输出led_r_temp1、led_g_temp1,输入密码(set=‘1’)时输出le