eda数字密码锁_第1页
eda数字密码锁_第2页
eda数字密码锁_第3页
eda数字密码锁_第4页
eda数字密码锁_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、摘要:随着数字技术飞速发展,具有防盗报警功能的数字密码锁代替安全性差的机械锁已成为必然的趋势。数字密码锁不但可以用来保管物品,还可以防止越权操作,例如银行自动柜员机、自动售货机、门卡系统等。基于EDA技术设计的电子密码锁,以其价格便宜、安全可靠、使用方便,受到了人们的普遍关注。而以现场可编程逻辑器件(FPGA)为设计载体,以硬件描述语言(VHDE)为主要表达方式,以Quartus开发软件和KHF-3型CPLD/FPGA实验开发系统为设计工具设计的电子密码锁,由于其能够实现数码输入、数码清除、密码解除、密码更改、密码上锁和密码解除等功能,因此,能够满足社会对安全防盗的要求。 关键词:FPGA;V

2、HDL;数字密码锁;原理图;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模块、寄存器模块、比较器模块以及编码器模块六个部分组成。比较器寄存器计数器I输入编码计数器II

6、控制模块 图(1)系统整体组装设计结构图4.2.1编码器部分 其共有三个输入和两个输出端口,如图(2) 图(2)编码器部分在时钟脉冲信号的作用下,当“en=1”时,表示此时可以输入三个十进制数码,分别对应关系如下: "0000000001"=>"0000" "0000000010"=>"0001" "0000000100"=>"0010" "0000001000"=>"0011" "0000010000

7、"=>"0100" "0000100000"=>"0101" "0001000000"=>"0110" "0010000000"=>"0111" "0100000000"=>"1000" "1000000000"=>c"1001"。即当“key_in=左边数”时,“code_out=右边数”。而当输入的数码等于系统设置密码时,“ps

8、_i=1”,否则“ps_i=0”。4.2.2计数器I部分其部分有两个输入端和两个输出端,如图(3) 图(3)计数器I部分其脉冲信号为编码器的“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”,则可以输入数据。

9、此时,如果“addr”为when"01"=>if reg_wr='1' then m0<=data_in;else data_out<=m0;when "10"=>if reg_wr='1' then m1<=data_in;else data_out<=m1;when "11"=>if reg_wr='1' then m2<=data_in;else data_out<=m2;when OTHERS=>NULL。4.2.4比较

10、器部分此部分较为简单,其只有两个输入端和一个输出端,如图(5) 图(5)比较器部分当从编码器“code_out”端输出的数a与储存在寄存器中的数b相等时,c端输出“1”,否则为“0”。4.2.5计数器II部分此部分也只有两个输入端和一个输出端,如图(6) 图(6)计数器II部分其主要是用来计算连续输入错误的次数。当清零端“clr=1”时计数器II清零,“wro_count”自然也为零;当“clr=0”时,控制器的“cnt_clk2”端的输出信号作为此部分的脉冲信号,遇到上升沿时计数器加1,计到3次时“wro_count”端输出“1”,否则为“0”。4.2.6中心控制部分此部分是整个系统的核心部

11、分,其管脚也甚多,共有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”,连续输错三次,则“warn=1”,系统报警,按下“off_al=1”键则取消报警,而此过程中“key”始终为“1”。5. VHDL源程序5.1底层文件VHDL源程序5.1.1编码

12、器部分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 std_logic; code_out: out std_logic_vector(3 downto 0);end dl_coder;architecture behave

13、 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="0000000000" then key_in_1<=key_in; key_in_2<=key_in; else key_in_2<=key_in_1; key_in_1<

14、=key_in; end if; end if; end if;end process;ps_i<='1' when key_in_2/=key_in_1 else '0'U2:process(clk)begin if rising_edge(clk) then if en='1' and key_in/="000000000" then case key_in is when "0000000001"=>code_out<="0000" when "0000

15、000010"=>code_out<="0001" when "0000000100"=>code_out<="0010" when "0000001000"=>code_out<="0011" when "0000010000"=>code_out<="0100" when "0000100000"=>code_out<="0101" when

16、"0001000000"=>code_out<="0110" when "0010000000"=>code_out<="0111" when "0100000000"=>code_out<="1000" when "1000000000"=>code_out<="1001" when OTHERS=>code_out<="0000" end case; e

17、nd if; end if;end process;end behave;5.1.3寄存器部分library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity dl_reg isport(clk:in std_logic;reg_wr:in std_logic;en:in std_logic;addr:in std_logic_vector(1 downto 0);data_in:in std_logic_vector(3 downto 0);

18、data_out:out std_logic_vector(3 downto 0);end entity;architecture behave of dl_reg issignal m0:std_logic_vector(3 downto 0);signal m1:std_logic_vector(3 downto 0);signal m2:std_logic_vector(3 downto 0);beginprocess(clk)beginif falling_edge(clk) thenif en='1' thencase addr iswhen "01&quo

19、t;=>if reg_wr='1' thenm0<=data_in;elsedata_out<=m0;end if;when "10"=>if reg_wr='1' thenm1<=data_in;elsedata_out<=m1;end if;when "11"=>if reg_wr='1' thenm2<=data_in;elsedata_out<=m2;end if;when OTHERS=>NULL;end case;end if;end

20、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 isbeginc<=&#

21、39;1' when a=b else'0'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

22、0);begin process(clk,clr)beginif clr='1' thencnt<="00"wro_count<='0'elsif rising_edge(clk) thenif cnt="10" thencnt<="11"wro_count<='1'elsecnt<=cnt+'1'end if;end if;end process;end behave;5.1.6中心控制部分library ieee;use ieee.std

23、_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity dl_control isport(clk:in std_logic;lock:in std_logic;start:in std_logic;off_al:in std_logic;ps_ch:in std_logic;enter:in std_logic;wro_count:in std_logic;ps_i:in std_logic;cmp_r:in std_logic;cin:in std_logic;code_en:o

24、ut std_logic;cnt_clr:out std_logic;cnt_clr2:out std_logic;cnt_clk2:out std_logic;reg_wr:out std_logic;key:out std_logic;warn:out std_logic);end dl_control;architecture behave of dl_control isCONSTANT KEY_ACTIVE:STD_LOGIC:='1'type state_type is (OUTLOCK,INLOCK,PS_INPUT,PS_RIGHT,PS_WRONG,ALARM

25、,PS_CHANGE);signal state:state_type;beginprocess(clk)beginif rising_edge(clk) thencase state iswhen OUTLOCK=>key<='0'if lock=KEY_ACTIVE thenstate<=INLOCK;ELSIF ps_ch=KEY_ACTIVE thenstate<=PS_CHANGE;ELSEstate<=OUTLOCK;end if;when INLOCK=>key<='1'code_en<='0

26、'cnt_clr<='1'reg_wr<='0'warn<='0'if start=KEY_ACTIVE thenstate<=PS_INPUT;elsestate<=INLOCK;end if;when PS_INPUT=>code_en<='1'cnt_clr<='0'reg_wr<='0'if cin='1' and ps_i='1' and cmp_r='1' thencode_en

27、<='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&l

28、t;='0'cnt_clr<='1'cnt_clr2<='0'cnt_clk2<='1'state<=ALARM;elsestate<=PS_INPUT;end if;when PS_RIGHT=>if enter=KEY_ACTIVE thenstate<=OUTLOCK;elsestate<=PS_RIGHT;end if;when PS_WRONG=>if enter=KEY_ACTIVE and wro_count='1' thencnt_clk2<

29、;='0'state<=ALARM;elsif enter=KEY_ACTIVE thencnt_clk2<='0'state<=INLOCK;elsestate<=PS_WRONG;end if;when ALARM=>if off_al=KEY_ACTIVE thenwarn<='0'state<=INLOCK;elsecnt_clk2<='0'warn<='1'state<=ALARM;end if;when PS_CHANGE=>code_e

30、n<='1'cnt_clr<='0'reg_wr<='1'if cin='1' then code_en<='0'cnt_clr<='1'state<=OUTLOCK;end if;WHEN OTHERS=>state<=INLOCK;end case;end if;end process;end behave;6. 系统仿真与分析6.1系统整体组装设计原理图 图(8)系统整体组装设计原理图6.2系统仿真波形图 图(9)系统仿真波形图6.3波形图分析当

31、系统刚开始工作时,处于开锁状态。输入“ps_ch”信号后,系统进入手动设置或修改密码状态;输入三位十进制数后按下“lock”键,进入安锁状态,锁闭合,上锁指示灯亮;在安锁状态下,若输入“start”信号,进入密码输入状态;在状态下,由“ps_i”密码脉冲作为计数时钟,计数值输出作为寄存器地址,当计数器计到3时,返回计数满信号“cin”,如果密码内容和长度均正确,进入密码初验正确状态,如果密码错误,进入密码初验错误状态;在密码初验错误状态,输入确认信号“enter”时,进入开锁状态;在密码初验错误状态,输入确认信号“enter”时,如果错误次数没有达到3次,则进入安锁状态并输出错误信号(“wro

32、_count”加1),如果错误次数达到3次,进入报警状态;在报警状态,“ warn”信号等于1,此时报警指示灯亮,如果输入清除警报信号“off_al”则取消报警,继续保持安锁状态。7. 硬件验证将上述系统工程文件用CPLDDN2005下载到KHF-3型CPLD/FPGA实验开发系统中去进行硬件验证。其对应的绑定管脚如下:clk-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. 设计问题与解决方法说真的,这次的课程设计真的很不容易,在过程中遇到了不少的问题。如:问题1:编写源程序时,经常不能通过。就如在写顶层文件的程序时,遇到了不少的问题,各元件之间的连接、顶层文件程序与底层文件程序之间的连接以及信号的定义,总是有错

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论