首页 EDA电子锁课程设计报告

EDA电子锁课程设计报告

举报
开通vip

EDA电子锁课程设计报告课 程 设 计 报 告 电子与信息工程学院 EDA课程设计报告 ( 2011 — 2012 学年 第 一 学期) 班 级: 学 号: 姓 名: _____ 指导教师: __ 2011 年 9 月 课程设计题目:电子密码锁的设计仿真实验 实验目的: 1. 掌握VHDL语言的使用,学会用VHDL语言来编程解决实际问题; 2. 学会使用EDA开发软件设计小型综合电路,掌握仿...

EDA电子锁课程设计报告
课 程 设 计 报 告 电子与信息工程学院 EDA课程设计报告 ( 2011 — 2012 学年 第 一 学期) 班 级: 学 号: 姓 名: _____ 指导教师: __ 2011 年 9 月 课程设计题目:电子密码锁的设计仿真实验 实验目的: 1. 掌握VHDL语言的使用,学会用VHDL语言来编程解决实际问题; 2. 学会使用EDA开发软件设计小型综合电路,掌握仿真的技巧; 3. 学会应用开发系统实现硬件电路,检验电路的功能。 实验要求: 功能描述:用于模仿密码锁的工作过程。完成密码锁的核心控制功能。 功能要求:设计一个密码锁,平时处于等待状态。管理员可以设置或更改密码。如果不预置密码,密码缺省为“1234”。用户如果需要开锁,按相应的按键进入输入密码状态,输入4位密码,按下确定键后,若密码正确,锁打开;若密码错误,将提示密码错误,要求重新输入,三次输入都错误,将发出报警信号。报警后,只有管理员作相应的处理才能停止报警。用户输入密码时,若输入错误,在按下确定键之前,可以通过按取消键重新输入。正确开锁后,用户处理完毕后,按下确定键,系统回到等待状态。系统操作过程中,只要密码锁没有打开,如果60秒无操作,系统回到等待状态。要求密码在输入过程中被依次显示,即先输入的为密码的第一位,总是显示在最左边。用两个发光二极管模拟显示,其中一个显示当前的工作模式,灭表示用户模式,亮表示管理员模式;另外一个指示锁的状态,灭表示锁处于锁定,亮表示锁被开启。 功能描述: 用户开锁: 默认情况下,密码锁处于用户使用状态。如果当前为管理员状态,则按下user键回到用户状态。用户开锁时,输入四位数用户密码,可以从out_code6的输出状态确定密码输入状态。如输入错误则按下clear清除前一位输入。输入完毕后按enter,如果密码正确,则开锁,否则重新输入密码。开锁后再次按下enter键则关锁,回到等待状态。三次密码输入错误,警报器alarming为1。输入管理员密码 解除警报。 管理员解除警报:当用户三次密码输入错误的时候,alarming为1,此时,只要管理员密码输入正确后,按下clear键,alarming为0,报警取消。 管理员修改密码: 在非警报和为开锁状态下,任何时候按admin键进入管理员状态。按chgcode选择修改密码,先选择修改的是用户密码还是管理员密码。修改用户密码则按user键,修改管理员密码则按admin键。然后分别输入旧密码,新密码,新密码要输入两次。旧密码与所要修改的密码对应。如旧密码输入错误,则无法修改;当验证不成功即两次新密码不相同时,修改密码失败。返回等待状态。成功后也返回等待状态。 定时返回: 用户在未开锁状态下,60s没有按键输入,则返回等待状态,但不包括alarming状态。只要是alarming,则只有管理输入管理员密码才能解锁并按下clear消除警报。 设计过程: 1:设计分析 EDA基本特点之一是自顶向下,设计时将基本功能要求模块化,据此,我将功能要求转化为四个较为清晰的模块:输入输出模块,控制模块,按键设置,60s计时模块。 控制模块:整个程序的主要部分,采用状态循环的办法,以用户每按下一次按键为计量单位,划分状态,以实现各种功能。 60s计时器模块:完成60s没有按键则返回等待状态这一功能的主要模块。这个模块的核心思想是一个变量numtime计数。变量numtime的初始值为0,在无报警为开锁的情况下,时钟每秒发出一个上升沿信号,计数一次,如有按键则numtime清零,否则计数到60即“111100”则返回信号back变为1,返回等待状态。 按键设置模块:将各种功能按键用高低电平赋值,便于调用。 2:设计过程 确定整个系统的输入输出: 输入:num ---- 数字键; rst ---- 复位键; user ---- 用户键; admin ---- 管理员键; chagcode ---- 更改密码键; clear ---- 清除键; enter ---- 确认键 输出: alarming ----- 报警; out_code4 ----- 显示密码; o_ua, ----- 判定当前状态是管理员状态还是用户状态; o_chgcode -----判定当前状态是修改密码状态; chgcode_ua ---- 判定当前修改的是管理员密码还是用户密码。 3:程序代码: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; --*****************************输入输出模块********************************** ENTITY E_lock IS PORT( clk,user,admin,clear,enter,chgcode,rst:IN STD_LOGIC; number:IN STD_LOGIC_VECTOR(9 downto 0); openlock:buffer std_logic; alarming,o_ua,o_chgcode,chgcode_ua:OUT STD_LOGIC; out_code4:out std_logic_vector(3 downto 0) ); END E_lock; --***************************************************************************** ARCHITECTURE behave OF E_lock IS TYPE STATES IS (chushi,sw,s0,s1,s2,s3,s4,s5,s6,s7); SIGNAL state:STATES; SIGNAL one_key,code0,code1,code2,code3:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL user_code,admin_code:STD_LOGIC_VECTOR(15 DOWNTO 0); SIGNAL temp_code,old_code:STD_LOGIC_VECTOR(15 DOWNTO 0); SIGNAL new_ctime:STD_LOGIC_VECTOR(1 DOWNTO 0); SIGNAL key:std_logic_vector(14 downto 0); SIGNAL alarm,inkey,ifnumber,s_ua,chg_c,c_ua,back:std_logic; SIGNAL out_code:std_logic_vector(3 downto 0); SIGNAL numbertime:std_logic_vector(9 downto 0); --***************************状态控制模块************************************ BEGIN temp_code<=code0&code1&code2&code3; key<=user&admin&chgcode&enter&clear&number; inkey<=user or admin or chgcode or enter or clear or number(0) or number(1) or number(2) or number(3) or number(4) or number(5) or number(6) or number(7) or number(8) or number(9); ifnumber<=not(one_key(3) and ((one_key(2) or one_key(1)))); --ifnumber='1',the key is a number o_ua<=s_ua; chgcode_ua<=c_ua; o_chgcode<=chg_c; out_code4<=out_code; alarming<=alarm; main:PROCESS(rst,clk) variable n,m:std_logic_vector(1 downto 0):="00"; variable new1_code,new2_code:std_logic_vector(15 downto 0); BEGIN if (rst='1')then state<=chushi; user_code<="0001001000110100";--1234 admin_code<="0000000000000000";--0000 n:="00"; s_ua<='0'; c_ua<='0'; chg_c<='0'; new_ctime<="00"; alarm<='0'; elsif clk'EVENT AND clk='1' then case state is when chushi=> state<=s0; when s0=> if back='1' then state<=sw; elsif (ifnumber='1' and alarm='0' and chg_c='0' ) then code3<=one_key; out_code<="0001"; state<=s1; elsif (ifnumber='1' and c_ua='0' and chg_c='1' ) then old_code<=user_code; code3<=one_key; out_code<="0001"; state<=s1; elsif (ifnumber='1' and alarm='1' and s_ua='1' and chg_c='0' ) then code3<=one_key; out_code<="0001"; state<=s1; elsif (ifnumber='1' and c_ua='1' and chg_c='1' ) then old_code<=admin_code; code3<=one_key; out_code<="0001"; state<=s1; elsif (one_key="1101"and chg_c='0' )then s_ua<='1'; state<=s0; elsif (one_key="1110"and chg_c='0' and alarm='0') then s_ua<='0'; state<=s0; end if; when s1=> if back='1' then state<=sw; elsif(ifnumber='1')then code2<=one_key; out_code<="0011"; state<=s2; elsif (one_key="1010")then --clear out_code<="0000"; state<=s0; elsif (one_key="1110" and chg_c='0') then --user out_code<="0000"; s_ua<='0'; state<=s0; elsif (one_key="1101" and chg_c='0') then --admin out_code<="0000"; s_ua<='1'; state<=s0; end if; when s2=> if back='1' then state<=sw; elsif(ifnumber='1')then code1<=one_key; out_code<="0111"; state<=s3; elsif (one_key="1010")then out_code<="0001"; state<=s1; elsif (one_key="1110" and chg_c='0') then out_code<="0000"; s_ua<='0'; state<=s0; elsif (one_key="1101" and chg_c='0') then out_code<="0000"; s_ua<='1'; state<=s0; end if; when s3=> if back='1' then state<=sw; elsif(ifnumber='1')then code0<=one_key; out_code<="1111"; state<=s4; elsif (one_key="1010")then out_code<="0011"; state<=s2; elsif (one_key="1110" and chg_c='0') then out_code<="0000"; s_ua<='0'; state<=s0; elsif (one_key="1101" and chg_c='0') then out_code<="0000"; s_ua<='1'; state<=s0; end if; when s4=> if back='1' then state<=sw; elsif (one_key="1011" and chg_c='0')then --enter state<=s5; out_code<="0000"; elsif (one_key="1011" and chg_c='1'and m="00")then --enter out_code<="0000"; if (old_code=temp_code) then m:="01"; state<=s0; else state<=sw; end if; elsif (one_key="1011" and chg_c='1'and m="01")then --enter out_code<="0000"; new1_code:=temp_code; m:="10"; state<=s0; elsif (one_key="1011" and chg_c='1'and m="10")then --enter out_code<="0000"; new2_code:=temp_code; if (new1_code=new2_code and c_ua='0') then user_code<=new2_code; state<=sw; elsif(new1_code=new2_code and c_ua='1')then admin_code<=new2_code; state<=sw; elsif(new1_code/=new2_code) then state<=sw; end if; elsif (one_key="1010")then --clear out_code<="0111"; state<=s3; end if; when s5=> if (s_ua='0' and temp_code=user_code) then openlock<='1'; state<=s6; elsif (s_ua='0'and temp_code/=user_code) then n:=n+1; if n="11" then alarm<='1'; state<=s0; out_code<="0000"; else state<=s0; out_code<="0000"; end if; elsif (s_ua='1' and temp_code=admin_code) then state<=s6; elsif(s_ua='1' and temp_code/=admin_code) then state<=sw; end if; when s6=> if back='1' then state<=sw; elsif(one_key="1011")then state<=sw; elsif(one_key="1010"and alarm='1') then alarm<='0'; state<=s0; out_code<="0000"; elsif(one_key="1100") then chg_c<='1'; state<=s7; end if; when s7=> m:="00"; if back='1' then state<=sw; elsif(one_key="1110")then c_ua<='0'; old_code<=user_code; state<=s0; elsif(one_key="1101")then c_ua<='1'; old_code<=admin_code; state<=s0; end if; when sw=> alarm<='0'; s_ua<='0'; c_ua<='0'; m:="00"; n:="00"; openlock<='0'; out_code<="0000"; chg_c<='0'; state<=s0; end case; END if; END PROCESS main; --*******************************按键设置模块********************************* INPUT:PROCESS(clk) BEGIN if clk'event and clk='0' then CASE key IS WHEN "000000000000001"=>one_key<="0000"; --0 WHEN "000000000000010"=>one_key<="0001"; --1 WHEN "000000000000100"=>one_key<="0010"; --2 WHEN "000000000001000"=>one_key<="0011"; --3 WHEN "000000000010000"=>one_key<="0100"; --4 WHEN "000000000100000"=>one_key<="0101"; --5 WHEN "000000001000000"=>one_key<="0110"; --6 WHEN "000000010000000"=>one_key<="0111"; --7 WHEN "000000100000000"=>one_key<="1000"; --8 WHEN "000001000000000"=>one_key<="1001"; --9 WHEN "000010000000000"=>one_key<="1010"; --clear WHEN "000100000000000"=>one_key<="1011"; --enter WHEN "001000000000000"=>one_key<="1100"; --chgcode WHEN "010000000000000"=>one_key<="1101"; --admin WHEN "100000000000000"=>one_key<="1110"; --user WHEN OTHERS =>one_key<="1111"; END CASE; end if; END PROCESS INPUT; --********************************60s计时模块******************************** PROCESS(inkey,rst,clk,alarm,openlock) variable numbertime:std_logic_vector(5 downto 0):="000000"; BEGIN if(rst='1') then numbertime:="000000"; back<='0'; elsif ((openlock='1' or inkey='1')or alarm='1') then back<='0'; numbertime:="000000"; elsif ((clk'event and clk='1')and inkey='0' and alarm='0' and openlock='0')then numbertime:=numbertime+1; if numbertime="111100" then back<='1'; numbertime:="000000"; end if; end if; end process ; END behave; 4:仿真验证: 基于GW48的按键数目有限(只有8个),保证以上的基本思路不变,我将仿真和在实验箱上的操作设为6个功能键加上2个数字键(0,1),这样则需在程序中将inkey<=user or admin or chgcode or enter or clear or number(0) or number(1) or number(2) or number(3) or number(4) or number(5) or number(6) or number(7) or number(8) or number(9);改为inkey<=user or admin or chgcode or enter or clear or number(0) or number(1) or number(2) or number(3) or number(4) or number(5) or number(6) or number(7) or number(8) or number(9);并将按键设置中的2~9的设置清除即可。另外管理员密码初始为0000,用户密码初始为1111. eq \o\ac(○,1):测试文件描述:输入1110,清除0,输入1,开锁。回到等待状态,修改用户密码为1100,并重新输入验证是否正确。 测试文件代码: LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_unsigned.all; USE ieee.numeric_std.ALL; ENTITY E_LOCK_TB_vhd IS END E_LOCK_TB_vhd; ARCHITECTURE behavior OF E_LOCK_TB_vhd IS -- Component Declaration for the Unit Under Test (UUT) COMPONENT E_lock PORT( clk : IN std_logic; user : IN std_logic; admin : IN std_logic; clear : IN std_logic; enter : IN std_logic; chgcode : IN std_logic; rst : IN std_logic; number : IN std_logic_vector(1 downto 0); openlock : BUFFER std_logic; alarming : OUT std_logic; o_ua : OUT std_logic; o_chgcode : OUT std_logic; chgcode_ua : OUT std_logic; out_code4 : OUT std_logic_vector(3 downto 0) ); END COMPONENT; --Inputs SIGNAL clk : std_logic := '0'; SIGNAL user : std_logic := '0'; SIGNAL admin : std_logic := '0'; SIGNAL clear : std_logic := '0'; SIGNAL enter : std_logic := '0'; SIGNAL chgcode : std_logic := '0'; SIGNAL rst : std_logic := '0'; SIGNAL number : std_logic_vector(1 downto 0) := (others=>'0'); --Outputs SIGNAL openlock : std_logic:='0'; SIGNAL alarming : std_logic; SIGNAL o_ua : std_logic; SIGNAL o_chgcode : std_logic; SIGNAL chgcode_ua : std_logic; SIGNAL out_code4 : std_logic_vector(3 downto 0 ):=(others=>'0'); BEGIN -- Instantiate the Unit Under Test (UUT) uut: E_lock PORT MAP( clk => clk, user => user, admin => admin, clear => clear, enter => enter, chgcode => chgcode, rst => rst, number => number, openlock => openlock, alarming => alarming, o_ua => o_ua, o_chgcode => o_chgcode, chgcode_ua => chgcode_ua, out_code4 => out_code4 ); CLK<=not CLK after 5 ns; tb : PROCESS BEGIN rst<='1' ,'0' after 10 ns; user<='1' after 30 ns,'0' after 40 ns,'1' after 440 ns,'0' after 450 ns; number(1)<='1' after 50 ns,'0' after 60 ns,'1' after 70 ns,'0' after 80 ns,'1' after 90 ns,'0' after 100 ns,'1' after 170 ns,'0' after 180 ns,'1' after 460 ns,'0' after 470 ns,'1' after 480 ns,'0' after 490 ns,'1' after 500 ns,'0' after 510 ns,'1' after 520 ns,'0' after 530 ns,'1' after 580 ns,'0' after 590 ns,'1' after 600 ns,'0' after 610 ns, '1' after 680 ns,'0' after 690 ns,'1' after 700 ns,'0' after 710 ns, '1' after 780 ns,'0' after 790 ns,'1' after 800 ns,'0' after 810 ns; number(0)<='1' after 130 ns,'0' after 140 ns,'1' after 320 ns,'0' after 330 ns,'1' after 340 ns,'0' after 350 ns,'1' after 360 ns,'0' after 370 ns,'1' after 380 ns,'0' after 390 ns,'1' after 620 ns,'0' after 630 ns,'1' after 640 ns,'0' after 650 ns,'1' after 720 ns,'0' after 730 ns,'1' after 740 ns,'0' after 750 ns,'1' after 820 ns,'0' after 830 ns,'1' after 840 ns,'0' after 850 ns; clear<='1' after 150 ns,'0' after 160 ns; enter<='1' after 190 ns,'0' after 200 ns,'1' after 230 ns,'0' after 240 ns,'1' after 400 ns,'0' after 410 ns,'1' after 540 ns,'0' after 550 ns,'1' after 660 ns,'0' after 670 ns,'1' after 760 ns,'0' after 770 ns,'1' after 860 ns,'0' after 870 ns,'1' after 880 ns,'0' after 890 ns; admin<='1' after 300 ns,'0' after 310 ns; chgcode<='1' after 420 ns,'0' after 430 ns;--将密码改为1100; wait; -- will wait forever; END PROCESS; END; 输入密码1110,使用clear键清除0,重新输入1,此时openlock为1,电子锁状态开锁。 就修改密码功能验证,进入管理员状态,输入两遍旧密码0000,输入新密码1100,输入enter,设定成功。 修改密码后重新输入修改过后的新密码1100,此时openclock为1,开锁。 eq \o\ac(○,2):测试文件2描述: 三次输入错误密码(按此分别为0000,1110,1100),检查alarming,并使用管理员密码按下clear键解除报警。 测试文件: tb : PROCESS BEGIN rst<='1' ,'0' after 10 ns; user<='1' after 30 ns,'0' after 40 ns; number(0)<='1' after 50 ns,'0' after 60 ns,'1' after 70 ns,'0' after 80 ns,'1' after 90 ns,'0' after 100 ns,'1' after 110 ns,'0' after 120 ns,'1' after 210 ns,'0' after 220 ns,'1' after 290 ns,'0' after 300 ns,'1' after 310 ns,'0' after 320 ns,'1' after 370 ns,'0' after 380 ns,'1' after 390 ns,'0' after 400 ns,'1' after 410 ns,'0' after 420 ns,'1' after 430 ns,'0' after 440 ns; number(1)<= '1' after 150 ns,'0' after 160 ns,'1' after 170 ns,'0' after 180 ns,'1' after 190 ns,'0' after 200 ns,'1' after 250 ns,'0' after 260 ns,'1' after 270 ns,'0' after 280 ns; enter<='1' after 130 ns,'0' after 140 ns,'1' after 230 ns,'0' after 240 ns,'1' after 330 ns,'0' after 340ns,'1' after 450 ns,'0' after 460 ns; admin<='1' after 350 ns,'0' after 360 ns; clear<='1' after 470 ns,'0' after 480 ns; wait; -- will wait forever END PROCESS; 三次输入密码错误(三次输入密码分别为0000,1110,1100),报警发生 按下admin,正确输入密码,输入进入管理员模式,按下clear键清除alarming; 实验小结: 本次课程设计主要EDA在实际中的应用,通过本次的设计也让之前学习的相关知识更加明晰,也使自己更加熟悉开发EDA设计的一般思路。本次设计用的专业软件是xilinx ISE 9.1,设计语言为VHDL. 本次设计充分体现了EDA模块化的特点,重点以及难点也在于功能需求转化为各种模块模型,刚开始接触题目,无从下手,不知道如何去将功能用EDA的模型表示出来,在经过苦苦思索,查询资料以及和同学讨论的漫长过程中,思路一点一滴浮现出来。我们使用了状态机的方法较为明晰的将整个过程表示了出来。在利用xilinx ISE 9.1建立测试文件并且调试的过程中,较为顺利,并且预期的功能可以得以实现。整个过程我们对实验要求有非常清晰的认识和理解。 本次试验最大的遗憾是在下载到GW48实验箱中,操作键按下五任何应有的反应,在检查管脚和其他操作步骤后,并没有错误,实验结束的日期渐渐逼近,我们在没有老师的帮助之下,终究还是没能找到问题所在,没有能够在试验箱中演示成功。 尽管如此,本次课程设计还是收获很多,包括对EDA地位和前景的认识,对模块化方法的愈发深刻的了解,思考问题的方式以及问题 规划 污水管网监理规划下载职业规划大学生职业规划个人职业规划职业规划论文 的重要性等等等等。 2011.9.20 审批老师: 电子锁的初始化,用户密码初始化为1234,管理员密码初始化为0000 PAGE - 18 -
本文档为【EDA电子锁课程设计报告】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_826881
暂无简介~
格式:doc
大小:236KB
软件:Word
页数:20
分类:互联网
上传时间:2012-11-27
浏览量:44