《eda数字密码锁(共15页).doc》由会员分享,可在线阅读,更多相关《eda数字密码锁(共15页).doc(15页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上摘要:随着数字技术飞速发展,具有防盗报警功能的数字密码锁代替安全性差的机械锁已成为必然的趋势。数字密码锁不但可以用来保管物品,还可以防止越权操作,例如银行自动柜员机、自动售货机、门卡系统等。基于EDA技术设计的电子密码锁,以其价格便宜、安全可靠、使用方便,受到了人们的普遍关注。而以现场可编程逻辑器件(FPGA)为设计载体,以硬件描述语言(VHDE)为主要表达方式,以Quartus开发软件和KHF-3型CPLD/FPGA实验开发系统为设计工具设计的电子密码锁,由于其能够实现数码输入、数码清除、密码解除、密码更改、密码上锁和密码解除等功能,因此,能够满足社会对安全防盗的要
2、求。 关键词:FPGA;VHDL;数字密码锁;原理图;VHDL源程序1. 设计题目:数字密码锁2. 设计要求:设计一个数字密码锁,用户可输入4位的二进制数,连续3次不正确则报警。开锁密码可手动预置,并可进行修改密码,取消报警。3. 设计系统的功能要求与分析3.1系统的功能要求本次的设计主要是采用先进的EDA技术,利用Quartus II工作平台和VHDL设计语言的设计。为了更好地满足实际的需要,将4位二进制改为3位十进制。根据系统设计的要求,可以用自顶向下的设计思路设计一个简易的数字密码锁,该锁应在收到3位与规定码相符的十进制数码时打开,使相应的指示灯点亮;若收到的代码与规定的不符或者开锁程序
3、有误,表示错误的指示灯点亮。由于设计的这个密码锁密码位数较少,所以必须给操作的人严格的次数限制。若连续三次没有输对,则表示操作的人不是该锁的使用者。此时报警铃长响,这时只有锁的使用者才能关取消报警。由于开锁密码可手动预置,故可在输入端加多一个按键,在开锁状态下按下此按键后可以进行密码设置和修改密码。3.2系统的功能分析(1) 系统接通电源后处于开锁状态,此时可以通过手动预置三位十进制数密码,再按上锁键将密码锁上锁,通过指示灯显示出上锁状态。(2) 开锁密码是3位十进制数,可以通过系统预先设定。开锁时输入密码不足三位或超过三位,又或者密码错误均不能开锁。(3)开锁程序由设计者确定,用户必须严格执
4、行所规定的程序,方可开锁。(4)开锁密码和程序正确,表示密码锁上锁的指示灯熄灭,此时处于开锁状态。(5)系统允许用户在开锁过程中有3次错误,连续输入密码错误或三次以后,报警灯亮而上锁灯也依然在亮,此时必须通过取消报警键解除报警才能进行其他操作。4. 设计思路分析与方案选择4.1方案选择:要设计一个数字密码锁,可以有多种实现方法,下面列出其中的两种:方案一:采用键盘扫描的方法扫描键盘输入信号,扫描信号变化的顺序依次为11101101101101111110,周而复始。键盘一个数字输入键,每次扫描产生新的按键数据,即采取串行左移输入数据。设计系统由密码锁输入模块、密码锁控制模块和错误报警模块三个部
5、分组成。方案二:直接采用并行输入数据,每一个按键代表一个十进制数。此系统则由密码锁控制模块、计数器I模块、计数器II模块、寄存器模块、比较器模块以及编码器模块六个部分组成。其中,控制模块是核心。经过比较,虽然方案一结构模块少,但程序过于复杂,难于理解和编译,而方案二虽然结构模块多了点,但易于读懂,而且操作过程简单,不易出现错误,故采用方案二设计本系统。4.2设计方案分析根据系统设计要求,系统设计采用自顶向下的设计方法。顶层设计采用原理图设计方式,系统整体组装设计结构图如图(1)所示,它由密码锁控制模块、计数器I模块、计数器II模块、寄存器模块、比较器模块以及编码器模块六个部分组成。比较器寄存器
6、计数器I输入编码计数器II控制模块 图(1)系统整体组装设计结构图4.2.1编码器部分 其共有三个输入和两个输出端口,如图(2) 图(2)编码器部分在时钟脉冲信号的作用下,当“en=1”时,表示此时可以输入三个十进制数码,分别对应关系如下: =0000; =0001; =0010; =0011; =0100; =0101; =0110; =0111; =1000; =c1001。即当“key_in=左边数”时,“code_out=右边数”。而当输入的数码等于系统设置密码时,“ps_i=1”,否则“ps_i=0”。4.2.2计数器I部分其部分有两个输入端和两个输出端,如图(3) 图(3)计数器I
7、部分其脉冲信号为编码器的“code_out”的输出数值,|“clr”是清零端,当“clr=1”时“cout=0”;当“clr=0”时,“cnt=cnt+1”,若“cnt=10”时,再遇到下一个脉冲信号后则变成“11”,并使“cout=1”,最后将“cnt”的值赋给“addr”输出。 4.2.3寄存器部分此部分有5个输入端和一个输出端,如图(4) 图(4)寄存器部分寄存器主要用来储存输入的三位十进制数码,即密码。在时钟脉冲下降沿时若“en=1”,则可以输入数据。此时,如果“addr”为when01=if reg_wr=1 then m0=data_in;else data_outif reg_w
8、r=1 then m1=data_in;else data_outif reg_wr=1 then m2=data_in;else data_outNULL。4.2.4比较器部分此部分较为简单,其只有两个输入端和一个输出端,如图(5) 图(5)比较器部分当从编码器“code_out”端输出的数a与储存在寄存器中的数b相等时,c端输出“1”,否则为“0”。4.2.5计数器II部分此部分也只有两个输入端和一个输出端,如图(6) 图(6)计数器II部分其主要是用来计算连续输入错误的次数。当清零端“clr=1”时计数器II清零,“wro_count”自然也为零;当“clr=0”时,控制器的“cnt_c
9、lk2”端的输出信号作为此部分的脉冲信号,遇到上升沿时计数器加1,计到3次时“wro_count”端输出“1”,否则为“0”。4.2.6中心控制部分此部分是整个系统的核心部分,其管脚也甚多,共有10个输入端和7个输出端。如图(7) 图(7)中心控制部分在“OUTLOCK”即开锁状态下,“key=0”,上锁指示灯熄灭;在“INLOCK”即安锁状态下,“key=1”,上锁指示灯亮,并且有“code_en=0;cnt_clr=1;reg_wr=0;warn=0”。按下“start”键后,系统可以输入三位十进制密码,再按“enter”键确认,如果密码正确,则开锁,否则“wro_count=1”,连续输
10、错三次,则“warn=1”,系统报警,按下“off_al=1”键则取消报警,而此过程中“key”始终为“1”。5. VHDL源程序5.1底层文件VHDL源程序5.1.1编码器部分library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity dl_coder is port( clk:in std_logic; en:in std_logic; key_in:in std_logic_vector(9 downto 0); ps_i:out
11、std_logic; code_out: out std_logic_vector(3 downto 0);end dl_coder;architecture behave of dl_coder issignal key_in_1:std_logic_vector(9 downto 0);signal key_in_2:std_logic_vector(9 downto 0);beginU1:process(clk) begin if rising_edge(clk) then if en=1 then if key_in= then key_in_1=key_in; key_in_2=ke
12、y_in; else key_in_2=key_in_1; key_in_1=key_in; end if; end if; end if;end process;ps_icode_outcode_outcode_outcode_outcode_outcode_outcode_outcode_outcode_outcode_outcode_outif reg_wr=1 thenm0=data_in;elsedata_outif reg_wr=1 thenm1=data_in;elsedata_outif reg_wr=1 thenm2=data_in;elsedata_outNULL;end
13、case;end if;end if;end process;end behave;5.1.4比较器部分library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity dl_cmp isport(a:in std_logic_vector(3 downto 0);b:in std_logic_vector(3 downto 0);c:out std_logic);end dl_cmp;architecture behave of dl_cmp
14、 isbeginc=1 when a=b else0;end behave;5.1.5计数器II部分library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity dl_counter2 isport(clk:in std_logic;clr:in std_logic;wro_count:out std_logic);end entity;architecture behave of dl_counter2 issignal cnt:std_logic_vector(1 downto 0);begi
15、n process(clk,clr)beginif clr=1 thencnt=00;wro_count=0;elsif rising_edge(clk) thenif cnt=10 thencnt=11;wro_count=1;elsecntkey=0;if lock=KEY_ACTIVE thenstate=INLOCK;ELSIF ps_ch=KEY_ACTIVE thenstate=PS_CHANGE;ELSEstatekey=1;code_en=0;cnt_clr=1;reg_wr=0;warn=0;if start=KEY_ACTIVE thenstate=PS_INPUT;els
16、estatecode_en=1;cnt_clr=0;reg_wr=0;if cin=1 and ps_i=1 and cmp_r=1 thencode_en=0;cnt_clr=1;cnt_clr2=1;state=PS_RIGHT;elsif ps_i=1 and cmp_r=0 thencode_en=0;cnt_clr=1;cnt_clr2=0;cnt_clk2=1;state=PS_WRONG;elsif enter=KEY_ACTIVE and cin=0 thencode_en=0;cnt_clr=1;cnt_clr2=0;cnt_clk2=1;state=ALARM;elsest
17、ateif enter=KEY_ACTIVE thenstate=OUTLOCK;elsestateif enter=KEY_ACTIVE and wro_count=1 thencnt_clk2=0;state=ALARM;elsif enter=KEY_ACTIVE thencnt_clk2=0;state=INLOCK;elsestateif off_al=KEY_ACTIVE thenwarn=0;state=INLOCK;elsecnt_clk2=0;warn=1;statecode_en=1;cnt_clr=0;reg_wr=1;if cin=1 then code_en=0;cn
18、t_clr=1;statestate=INLOCK;end case;end if;end process;end behave;6. 系统仿真与分析6.1系统整体组装设计原理图 图(8)系统整体组装设计原理图6.2系统仿真波形图 图(9)系统仿真波形图6.3波形图分析当系统刚开始工作时,处于开锁状态。输入“ps_ch”信号后,系统进入手动设置或修改密码状态;输入三位十进制数后按下“lock”键,进入安锁状态,锁闭合,上锁指示灯亮;在安锁状态下,若输入“start”信号,进入密码输入状态;在状态下,由“ps_i”密码脉冲作为计数时钟,计数值输出作为寄存器地址,当计数器计到3时,返回计数满信号“
19、cin”,如果密码内容和长度均正确,进入密码初验正确状态,如果密码错误,进入密码初验错误状态;在密码初验错误状态,输入确认信号“enter”时,进入开锁状态;在密码初验错误状态,输入确认信号“enter”时,如果错误次数没有达到3次,则进入安锁状态并输出错误信号(“wro_count”加1),如果错误次数达到3次,进入报警状态;在报警状态,“ warn”信号等于1,此时报警指示灯亮,如果输入清除警报信号“off_al”则取消报警,继续保持安锁状态。7. 硬件验证将上述系统工程文件用CPLDDN2005下载到KHF-3型CPLD/FPGA实验开发系统中去进行硬件验证。其对应的绑定管脚如下:clk
20、-p195,enter-p46,lock-p47,off_al-p53,ps_sh-p54,start-p55,key-p190,warn-p195,key_in0-p28,key_in1-p29,key_in2-p30,key_in3-p31,key_in4-p38,key_in5-p39,key_in6-p40,key_in7-p41,key_in8-p44,key_in9-p45。经过验证,证明所设计的系统是可行的。数字0-9分别绑定于10不同的管脚方便于密码的输入。系统的工作方式和顺序同上面仿真出来的结果基本一致。8. 设计问题与解决方法说真的,这次的课程设计真的很不容易,在过程中遇到
21、了不少的问题。如:问题1:编写源程序时,经常不能通过。就如在写顶层文件的程序时,遇到了不少的问题,各元件之间的连接、顶层文件程序与底层文件程序之间的连接以及信号的定义,总是有错误。解决方法:编译出错时,我并不灰心,我一个错误一个错误地找,有些语句不懂的就翻阅书本或请教老师和同学,在我细心的检查预计老师同学的帮助下,终于找出了全部的错误,改正过后,程序编译总算通过了。问题2:对控制模块仿真时,虽然语法正确,但连最基本的输入输出都进不去,我弄了很多遍都不行。解决方法:还是通过查找资料和请教老师同学我才解决了这个问题。原来我原来的时钟周期太小的,只有20ns,这样按键按下后系统都还未反应过来就已经进
22、入下一个输入了,这当然仿真不出数据了,后来我改大时钟周期后终于成功仿真出来。问题3:在进行硬件验证时失败,所有按键没反应。解决方法:按按键没反应原来是因为我犯了一个很低级的错误,没有绑定引脚,经过我一一验证绑定后还是不行,后来才知道原来是因为在创建工程时用错了芯片,本来应该用ACEX1K系列的EP1K30QC208-3的,但我却用了ACEX1K系列的EP1K10TC100-3了,这样根本上连下载都下载不了。经过改正后终于成功了。9. 设计总结 通过这次的课程设计,使我对EDA这门课程产生了浓厚的兴趣,并且对EDA这门课程、对Quartus开发软件和KHF-3型CPLD/FPGA实验开发系统有了
23、一个更加深刻的认识。我深深地被EDA的强大所震撼,Quartus开发软件虽然使用起来有些麻烦,但它的功能真的很强大,而且设计很自由,设计方式很多,能极大地满足当今社会高速发展的需要。通过这次课程设计,我还懂得了理论与实际相结合的重要性。我明白到只有理论知识是远远不够的,我们还需要大量的实践,我们只有把所学的理论知识与实践相结合起来,从实践中检验理论,才能真正为社会服务,并且我们也可以在实践中提高自己的实际动手能力和独立思考的能力,使自己更加适合当今社会的需要。这次关于密码锁的课程设计,总的来说,还是比较成功的。虽然过程中遇到了许多问题,但在老师的指导下,再加上自己不懈的努力,最终还是算比较顺利地做了出来。经过这次的课程设计,使我以后的学习和生活受益匪浅,让我在以后的学习中更加注重理论与实践的结合,我应该感谢这次的设计。10. 参考文献(1)陈先朝,硬件描述语言与EDA技术实践指导书,2010年11月(2)曹昕燕等编著,EDA技术实验与课程设计,清华大学出版社,2006年5月(3)刘欲晓等编著,EDA技术与VHDL电路开发应用实践,电子工业出版社,2009年4月(4)刘昌华等编著,数字逻辑EDA设计与实践:MAX+plus与Quartus双剑合璧,国防工业出版社,2009年(5)刘江海主编,EDA技术课程设计,华中科技大学出版社,2009年1月专心-专注-专业
限制150内