当前位置:文档之家› EDA技术与VHDL语言课程设计

EDA技术与VHDL语言课程设计

EDA技术与VHDL语言课程设计课程设计EDA技术与VHDL语言课程设计报告班级: 电信11-2班姓名: 董元伟学号: 1106110205指导教师: 李铁成绩:电子与信息工程学院信息与通信工程系- 2 - 课程设计;数字密码锁目录摘要 ..................................................................... .......................................... - 3 - 一、设计目的 ..................................................................... ............................ - 4 - 二、设计内容和要求 ..................................................................... .................. - 4 -1、用户开锁 ..................................................................... ......................... - 5 -2、管理员解除警报 ..................................................................... .............. - 5 -3、管理员修改密码 ..................................................................... .............. - 5 -4、定时返回 ..................................................................... ......................... - 6 - 三、设计思路和系统结构...................................................................... ............ - 6 -1、设计模块 ..................................................................... ......................... - 6 -2、系统结构和数字密码锁原理图 .............................................................. - 7 -3、设计思路 ..................................................................... ......................... - 8 - 四、实验设计程序如 ..................................................................... ................... - 9 - 五、创建测试平台仿真结果 ..................................................................... ....... - 21 - 参考文献 ..................................................................... ................................... - 24 -- 2 -- 3 - 课程设计;数字密码锁摘要本文介绍一种利用 EDA 技术和 VHDL 语言,在 MAX+PLUS?环境下,设计了一种新型的智能密码锁。

它体积小、功耗低、价格便宜、安全可靠,维护和升级都十分方便,具有较好的应用前景。

随着社会物质财富的日益增长,安全防盗已成为全社会问题。

人们对锁的要求越来越高,既要安全可靠地防盗,又要使用方便。

弹子锁由于结构上的局限已难以满足当前社会管理和防盗要求,特别是在人员经常变动的公共场所,如办公室、宾馆等地方。

电子密码锁由于其自身的优势,越来越受到人们的青睐,但是目前使用的电子密码锁大部分是基于单片机用分离元件实现的,其成本较高且可靠性得不保证。

本文采用先进的 EDA 技术,利用 MAX +PLUX?工作平台和 VHDL 语言,设计了一种新型的智能密码锁。

该密码锁具有密码预置和误码报警等功能,用一片FPGA 芯片实现,从而大大简化了系统结构,降低了成本,提高了系统的保密性和可靠性。

采用这种器件开发的数字系统,其升级与改进极其方便。

- 3 -- 4 - 电子与信息董元伟 1106110205 一、设计目的1.掌握VHDL语言的使用,学会用VHDL语言来编程解决实际问题。

2.学会使用EDA开发软件设计小型综合电路,掌握仿真的技巧。

3.学会应用开发系统实现数字密码锁的设计。

二、设计内容和要求用VHDL语言设计一个密码锁,用波形仿真验证其功能后,实现到GW48实验系统。

1、功能描述:用于模仿密码锁的工作过程。

完成密码锁的核心控制功能。

2、功能要求:设计一个密码锁,平时处于等待状态。

管理员可以设置或更改密码。

如果不预置密码,密码缺省为“1234”。

用户如果需要开锁,按相应的按键进入输入密码状态,输入4位密码,按下确定键后,若密码正确,锁打开;若密码错误,将提示密码错误,要求重新输入,三次输入都错误,将发出报警信号。

报警后,只有管理员作相应的处理才能停止报警。

用户输入密码时,若输入错误,在按下确定键之前,可以通过按取消键重新输入。

正确开锁后,用户处理完毕后,按下确定键,系统回到等待状态。

系统操作过程中,只要密码锁没有打开,如果60秒没有对系统操作,系统回到等待状态。

要求密码在输入过程中被依次显示,即先输入的为密码的第一位,总是显示在最左边。

用两个发光二极管模拟显示,其中一个显示当前的工作模式,灭表示用户模式,亮表示管理员模式;另- 4 -- 5 - 课程设计;数字密码锁外一个指示锁的状态,灭表示锁处于锁定,亮表示锁被开启。

注意:用两个按键实现密码输入,Key1选择输入的是第几位密码,KEY2输入密码数字。

3、功能描述: 初始状态:初次使用密码锁时,要先用Reset键初始化。

初始状态下,用户密码为“1234”,管理员密码为“0000”。

(1)用户开锁:默认情况下,密码锁处于用户使用状态。

如果当前为管理员状态,则按下user 键回到用户状态。

用户开锁时,输入四位数用户密码,可以从out_code6的输出状态确定密码输入状态。

如输入错误则按下clear清除前一位输入。

输入完毕后按enter,如果密码正确,则开锁,否则重新输入密码。

开锁后再次按下enter键则关锁,回到等待状态。

三次密码输入错误,警报器alarming为1。

要管理员输入管理员密码解除警报。

此时哪怕用户再输对密码也没用。

(2)管理员解除警报:当用户三次密码输入错误的时候,alarming为1,此时,只要管理员密码输入正确后,按下clear键,alarming为0,报警取消。

(3)管理员修改密码:在非警报和为开锁状态下,任何时候按admin键进入管理员状态。

按chgcode选择修改密码,先选择修改的是用户密码还是管理员密码。

修改用户密码则按user键,修改管理员密码则按admin键。

然后分别输入旧密码,新密码,新密码要输入两次。

旧密码与所要修改的密码对应。

如旧密码输入错误,则无法修改;当验证不成功即两次新密- 5 -- 6 - 电子与信息董元伟 1106110205码不相同时,修改密码失败。

返回等待状态。

成功后也返回等待状态。

(4)定时返回:用户在未开锁状态下,60s没有按键输入,则返回等待状态,但不包括alarming状态。

只要是alarming,则只有管理输入管理员密码才能解锁并按下clear消除警报。

三、设计思路和系统结构1、设计模块设计密码锁时,采用自顶向下的设计方法。

将整个系统分成几个子模块:输入输出模块,控制模块,按键设置模块和60s计时器模块。

控制模块是整个程序的主要部分,采用状态循环的办法,以用户每按下一次按键为计量单位,划分状态,以实现各种功能。

60s计时器模块是完成60s没有按键则返回等待状态这一功能的主要模块。

这个模块的核心思想是一个变量numtime计数。

变量numtime的初始值为0,在无报警为开锁的情况下,时钟每秒发出一个上升沿信号,计数一次,如有按键则numtime清零,否则计数到60即“111100”则返回信号back变为1,返回等待状态。

按键设置模块是将各种功能按键用高低电平赋值,便于调用。

- 6 -- 7 - 课程设计;数字密码锁2、系统结构和数字密码锁原理图结合实际实验板的资源分配和考虑到数字密码锁的实现较为简易,故整个系统的设计根据功能要求,将系统分为 keyread、stating、showing 三个进程,系统结构图大概如下图所示:Clk时钟输入进程keyread拨码开关输入codeLed-7数码管输出进程showingLed-list数码管位选进程startingControl led灯输出Alam蜂鸣器输出- 7 -- 8 - 电子与信息董元伟 1106110205 数字密码锁原理图如下:3、设计思路利用实验本上的四个按键实现四个密码数列的输入以及密码输入的最终确认,这部分功能的实现由进程 keyread 实现完成;利用实验本上四个拨码开关的不同组合区分密码锁的不同功能状态,包括密码重置、密码重置清除、密码输入、密码输入清除、密码锁锁闭、钥匙插入开锁,这部分由进程 stating 实现,进程 stating 还实现了相应状态下,蜂鸣器、数码管、led 灯控制信号的输出以实现相应提示和显示。

- 8 -- 9 - 课程设计;数字密码锁四、实验设计程序如下:library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code.--library UNISIM;--use UNISIM.VComponents.all;entity lock isPORT(clk,user,admin,clear,enter,chgcode,res,numenter ,number:IN STD_L OGIC;openlock:buffer std_logic;alarming,model:OUT STD_LOGIC;shuma2,shuma1,shuma0:out std_logic_vector(6 downto 0));end lock;architecture Behavioral of lock isTYPE STATES IS (sw,s1,s2,s3,s4,s5,s6,s7); SIGNAL state:STATES;SIGNAL one_key,code0,code1,code2:STD_LOGIC_VECTOR(3 DOWNTO- 9 -- 10 - 电子与信息董元伟 11061102050);SIGNAL user_code,admin_code:STD_LOGIC_VECTOR(11 DOWNTO 0); SIGNAL temp_code,old_code:STD_LOGIC_VECTOR(11 DOWNTO 0);SIGNAL key:std_logic_vector(3 downto 0);signal alarm,ifnum,s_model,chg_c,c_ua:std_logic; signalk :std_logic_vector(3 downto 0);begintemp_code<=code2&code1&code0;model<=s_model;alarming<=alarm;main:PROCESS(res,admin,user,clear,chgcode,number,numenter,enter)variable n,m:std_logic_vector(1 downto 0):="00";variable new1_code,new2_code:std_logic_vector(11 downto 0); BEGIN if (res='1') thenstate<=s1;--出厂状态user_code<="001000010001";--211admin_code<="001000010000";--210n:="00";s_model<='0';c_ua<='0';chg_c<='0';K<="0000";- 10 -- 11 - 课程设计;数字密码锁openlock<='0';alarm<='0';shuma2<="0000000";shuma1<="0000000";shuma0<="0000000";ifnum<='0';elseif (number='1') thenk<=k+1;Elsif numenter='1' thenifnum<='1';End if;case state iswhen s1=>if ( admin='1' and chg_c='0' )thens_model<='1';state<=s1;elsif (user='1' and chg_c='0' and alarm='0') then s_model<='0';state<=s1;- 11 -- 12 - 电子与信息董元伟 1106110205elsif (ifnum='1' and alarm='0' and chg_c='0' ) then code2<=k;ifnum<='0';CASE k ISWHEN"0000"=>shuma2<="0111111";WHEN"0001"=> shuma2 <="0000110"; WHEN"0010"=> shuma2<="1011011";WHEN"0011"=> shuma2<="1001111";WHEN"0100"=> shuma2<="1100110";WHEN"0101"=> shuma2<="1101101";WHEN"0110"=> shuma2<="1111101";WHEN"0111"=> shuma2<="0000111";WHEN"1000"=> shuma2<="1111111";WHEN"1001"=> shuma2<="1101111";WHEN OTHERS=> shuma2<="0000000";END CASE;k<="0000";state<=s2;elsif (ifnum='1' and c_ua='0' and chg_c='1' ) then old_code<=user_code;code2<=k;- 12 -- 13 - 课程设计;数字密码锁ifnum<='0';CASE k ISWHEN"0000"=>shuma2<="0111111";WHEN"0001"=> shuma2 <="0000110"; WHEN"0010"=> shuma2<="1011011"; WHEN"0011"=> shuma2<="1001111"; WHEN"0100"=> shuma2<="1100110"; WHEN"0101"=> shuma2<="1101101"; WHEN"0110"=> shuma2<="1111101"; WHEN"0111"=> shuma2<="0000111"; WHEN"1000"=> shuma2<="1111111"; WHEN"1001"=> shuma2<="1101111";WHEN OTHERS=> shuma2<="0000000";END CASE;k<="0000";state<=s2;elsif (ifnum='1' and alarm='1' and s_model='1' and chg_c='0' ) then code2<=k;ifnum<='0';CASE k ISWHEN"0000"=>shuma2<="0111111";WHEN"0001"=> shuma2 <="0000110";WHEN"0010"=> shuma2<="1011011";WHEN"0011"=> shuma2<="1001111";WHEN"0100"=> shuma2<="1100110";- 13 -- 14 - 电子与信息董元伟 1106110205WHEN"0101"=> shuma2<="1101101";WHEN"0110"=> shuma2<="1111101";WHEN"0111"=> shuma2<="0000111";WHEN"1000"=> shuma2<="1111111";WHEN"1001"=> shuma2<="1101111";WHEN OTHERS=> shuma2<="0000000";END CASE;k<="0000";state<=s2;elsif (ifnum='1' and c_ua='1' and chg_c='1' ) thenold_code<=admin_code;code2<=k;ifnum<='0';CASE k ISWHEN"0000"=>shuma2<="0111111"; WHEN"0001"=> shuma2 <="0000110"; WHEN"0010"=> shuma2<="1011011"; WHEN"0011"=> shuma2<="1001111"; WHEN"0100"=> shuma2<="1100110"; WHEN"0101"=> shuma2<="1101101"; WHEN"0110"=> shuma2<="1111101"; WHEN"0111"=> shuma2<="0000111"; WHEN"1000"=> shuma2<="1111111"; WHEN"1001"=> shuma2<="1101111";WHEN OTHERS=> shuma2<="0000000";END CASE;- 14 -- 15 - 课程设计;数字密码锁k<="0000";state<=s2;elsif (clear='1')then --clearstate<=s1;end if;when s2=>if (user='1' and chg_c='0') then --users_model<='0';state<=s1;elsif (admin='1' and chg_c='0') then --admin s_model<='1';state<=s1;elsif(ifnum='1')thencode1<=k;ifnum<='0';CASE k ISWHEN"0000"=>shuma1<="0111111"; WHEN"0001"=> shuma1<="0000110"; WHEN"0010"=> shuma1<="1011011"; WHEN"0011"=> shuma1<="1001111"; WHEN"0100"=> shuma1<="1100110"; WHEN"0101"=> shuma1<="1101101"; WHEN"0110"=> shuma1<="1111101"; WHEN"0111"=> shuma1<="0000111";- 15 -- 16 - 电子与信息董元伟 1106110205 WHEN"1000"=> shuma1<="1111111"; WHEN"1001"=> shuma1<="1101111";WHEN OTHERS=> shuma1<="0000000";END CASE;k<="0000";state<=s3;elsif (clear='1')then --clearstate<=s1;end if;when s3=>if(user='1' and chg_c='0') thens_model<='0';state<=s1;elsif (admin='1' and chg_c='0') then s_model<='1';state<=s1;elsif (ifnum='1')thencode0<=k;ifnum<='0';CASE k ISWHEN"0000"=>shuma0<="0111111"; WHEN"0001"=> shuma0<="0000110"; WHEN"0010"=> shuma0<="1011011";- 16 -- 17 - 课程设计;数字密码锁WHEN"0011"=> shuma0<="1001111"; WHEN"0100"=> shuma0<="1100110"; WHEN"0101"=> shuma0<="1101101"; WHEN"0110"=> shuma0<="1111101";WHEN"0111"=> shuma0<="0000111";WHEN"1000"=> shuma0<="1111111";WHEN"1001"=> shuma0<="1101111";WHEN OTHERS=> shuma0<="0000000";END CASE;k<="0000";state<=s4;elsif(clear='1')thenstate<=s2;end if;when s4=>if (enter='1' and chg_c='0')then --enterstate<=s5;elsif (enter='1' and chg_c='1'and m="00")then --enter if (old_code=temp_code) thenm:="01";state<=s1;else state<=sw;- 17 -- 18 - 电子与信息董元伟 1106110205end if;elsif (enter='1' and chg_c='1'and m="01")then --enter new1_code:=temp_code;m:="10";state<=s1;elsif (enter='1' and chg_c='1'and m="10")then --enter new2_code:=temp_code;if (new1_code=new2_code and c_ua='0') thenuser_code<=new2_code;state<=sw;elsif(new1_code=new2_code and c_ua='1')thenadmin_code<=new2_code;state<=sw;elsif(new1_code/=new2_code) thenstate<=sw;end if;elsif(clear='1')thenstate<=s3;end if;when s5=>if (s_model='0' and temp_code=user_code) then openlock<='1';state<=s6;elsif (s_model='0'and temp_code/=user_code) then- 18 -- 19 - 课程设计;数字密码锁n:=n+1;if n="11" thenalarm<='1';state<=s1;elsestate<=s1;end if;elsif (s_model='1' and temp_code=admin_code) then state<=s6;elsif(s_model='1' and temp_code/=admin_code) then state<=sw;end if;when s6=>if(enter='1')then--enterstate<=sw;elsif(clear='1' and alarm='1') then --clearalarm<='0';state<=sw;elsif(chgcode='1') thenchg_c<='1';state<=s7;end if;when s7=>- 19 -- 20 - 电子与信息董元伟 1106110205m:="00";if(user='1')thenc_ua<='0';old_code<=user_code; state<=s1elsif(admin='1')then c_ua<='1';old_code<=admin_code; state<=s1;end if;when sw=>alarm<='0';s_model<='0';c_ua<='0';m:="00";n:="00";openlock<='0';chg_c<='0';shuma2<="0000000"; shuma1<="0000000"; shuma0<="0000000"; state<=s1;end case;END if;END PROCESS main;end Behavioral;- 20 -- 21 - 课程设计;数字密码锁五、创建测试平台仿真结果:1、输入密码,期间有清除,并且密码输入正确。

相关主题