VHDL四位密码锁课程设计EDA.docx

上传人:b****6 文档编号:7404976 上传时间:2023-05-11 格式:DOCX 页数:17 大小:89.22KB
下载 相关 举报
VHDL四位密码锁课程设计EDA.docx_第1页
第1页 / 共17页
VHDL四位密码锁课程设计EDA.docx_第2页
第2页 / 共17页
VHDL四位密码锁课程设计EDA.docx_第3页
第3页 / 共17页
VHDL四位密码锁课程设计EDA.docx_第4页
第4页 / 共17页
VHDL四位密码锁课程设计EDA.docx_第5页
第5页 / 共17页
VHDL四位密码锁课程设计EDA.docx_第6页
第6页 / 共17页
VHDL四位密码锁课程设计EDA.docx_第7页
第7页 / 共17页
VHDL四位密码锁课程设计EDA.docx_第8页
第8页 / 共17页
VHDL四位密码锁课程设计EDA.docx_第9页
第9页 / 共17页
VHDL四位密码锁课程设计EDA.docx_第10页
第10页 / 共17页
VHDL四位密码锁课程设计EDA.docx_第11页
第11页 / 共17页
VHDL四位密码锁课程设计EDA.docx_第12页
第12页 / 共17页
VHDL四位密码锁课程设计EDA.docx_第13页
第13页 / 共17页
VHDL四位密码锁课程设计EDA.docx_第14页
第14页 / 共17页
VHDL四位密码锁课程设计EDA.docx_第15页
第15页 / 共17页
VHDL四位密码锁课程设计EDA.docx_第16页
第16页 / 共17页
VHDL四位密码锁课程设计EDA.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

VHDL四位密码锁课程设计EDA.docx

《VHDL四位密码锁课程设计EDA.docx》由会员分享,可在线阅读,更多相关《VHDL四位密码锁课程设计EDA.docx(17页珍藏版)》请在冰点文库上搜索。

VHDL四位密码锁课程设计EDA.docx

VHDL四位密码锁课程设计EDA

 

电子与信息工程学院

EDA课程设计报告

(2011—2012学年第一学期)

 

课程名称:

EDA课程设计与实现

班级:

电子0903

学号:

姓名:

****************

 

2011年09月

一、目的

1.掌握VHDL语言的使用,学会用VHDL语言来编程解决实际问题;

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

3.学会应用开发系统实现硬件电路,检验电路的功能。

二、内容和要求

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

功能描述:

用于模仿密码锁的工作过程。

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

功能要求:

设计一个密码锁,平时处于等待状态。

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

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

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

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

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

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

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

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

用两个发光二极管模拟显示,其中一个显示当前的工作模式,灭表示用户模式,亮表示管理员模式;另外一个指示锁的状态,灭表示锁处于锁定,亮表示锁被开启。

注意:

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

 

功能描述:

初始状态:

初次使用密码锁时,要先用Reset键初始化。

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

用户开锁:

默认情况下,密码锁处于用户使用状态。

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

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

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

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

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

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

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

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

管理员解除警报:

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

管理员修改密码:

在非警报和为开锁状态下,任何时候按admin键进入管理员状态。

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

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

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

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

如旧密码输入错误,则无法修改;当验证不成功即两次新密码不相同时,修改密码失败。

返回等待状态。

成功后也返回等待状态。

定时返回:

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

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

设计思路:

设计密码锁时,采用自顶向下的设计方法。

将整个系统分成几个子模块:

输入输出模块,控制模块,按键设置模块和60s计时器模块。

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

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

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

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

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

 

实验设计程序如下:

libraryIEEE;

useIEEE.STD_LOGIC_1164.ALL;

useIEEE.STD_LOGIC_ARITH.ALL;

useIEEE.STD_LOGIC_UNSIGNED.ALL;

----Uncommentthefollowinglibrarydeclarationifinstantiating

----anyXilinxprimitivesinthiscode.

--libraryUNISIM;

--useUNISIM.VComponents.all;

entitylockis

PORT(

clk,user,admin,clear,enter,chgcode,res,numenter,number:

INSTD_LOGIC;

openlock:

bufferstd_logic;

alarming,model:

OUTSTD_LOGIC;

shuma2,shuma1,shuma0:

outstd_logic_vector(6downto0)

);

endlock;

architectureBehavioraloflockis

TYPESTATESIS(sw,s1,s2,s3,s4,s5,s6,s7);

SIGNALstate:

STATES;

SIGNALone_key,code0,code1,code2:

STD_LOGIC_VECTOR(3DOWNTO0);

SIGNALuser_code,admin_code:

STD_LOGIC_VECTOR(11DOWNTO0);

SIGNALtemp_code,old_code:

STD_LOGIC_VECTOR(11DOWNTO0);

SIGNALkey:

std_logic_vector(3downto0);

signalalarm,ifnum,s_model,chg_c,c_ua:

std_logic;

signalk:

std_logic_vector(3downto0);

begin

temp_code<=code2&code1&code0;

model<=s_model;

alarming<=alarm;

main:

PROCESS(res,admin,user,clear,chgcode,number,numenter,enter)

variablen,m:

std_logic_vector(1downto0):

="00";

variablenew1_code,new2_code:

std_logic_vector(11downto0);

BEGIN

if(res='1')then

state<=s1;--出厂状态

user_code<="001000010001";--211

admin_code<="001000010000";--210

n:

="00";

s_model<='0';

c_ua<='0';

chg_c<='0';

K<="0000";

openlock<='0';

alarm<='0';

shuma2<="0000000";

shuma1<="0000000";

shuma0<="0000000";

ifnum<='0';

else

if(number='1')then

k<=k+1;

Elsifnumenter='1'then

ifnum<='1';

Endif;

casestateis

whens1=>

if(admin='1'andchg_c='0')then

s_model<='1';

state<=s1;

elsif(user='1'andchg_c='0'andalarm='0')then

s_model<='0';

state<=s1;

elsif(ifnum='1'andalarm='0'andchg_c='0')then

code2<=k;

ifnum<='0';

CASEkIS

WHEN"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";

WHENOTHERS=>shuma2<="0000000";

ENDCASE;

k<="0000";

state<=s2;

elsif(ifnum='1'andc_ua='0'andchg_c='1')then

old_code<=user_code;

code2<=k;

ifnum<='0';

CASEkIS

WHEN"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";

WHENOTHERS=>shuma2<="0000000";

ENDCASE;

k<="0000";

state<=s2;

elsif(ifnum='1'andalarm='1'ands_model='1'andchg_c='0')then

code2<=k;

ifnum<='0';

CASEkIS

WHEN"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";

WHENOTHERS=>shuma2<="0000000";

ENDCASE;

k<="0000";

state<=s2;

elsif(ifnum='1'andc_ua='1'andchg_c='1')then

old_code<=admin_code;

code2<=k;

ifnum<='0';

CASEkIS

WHEN"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";

WHENOTHERS=>shuma2<="0000000";

ENDCASE;

k<="0000";

state<=s2;

elsif(clear='1')then--clear

state<=s1;

endif;

whens2=>

if(user='1'andchg_c='0')then--user

s_model<='0';

state<=s1;

elsif(admin='1'andchg_c='0')then--admin

s_model<='1';

state<=s1;

elsif(ifnum='1')then

code1<=k;

ifnum<='0';

CASEkIS

WHEN"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";

WHEN"1000"=>shuma1<="1111111";

WHEN"1001"=>shuma1<="1101111";

WHENOTHERS=>shuma1<="0000000";

ENDCASE;

k<="0000";

state<=s3;

elsif(clear='1')then--clear

state<=s1;

endif;

whens3=>

if(user='1'andchg_c='0')then

s_model<='0';

state<=s1;

elsif(admin='1'andchg_c='0')then

s_model<='1';

state<=s1;

elsif(ifnum='1')then

code0<=k;

ifnum<='0';

CASEkIS

WHEN"0000"=>shuma0<="0111111";

WHEN"0001"=>shuma0<="0000110";

WHEN"0010"=>shuma0<="1011011";

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";

WHENOTHERS=>shuma0<="0000000";

ENDCASE;

k<="0000";

state<=s4;

elsif(clear='1')then

state<=s2;

endif;

whens4=>

if(enter='1'andchg_c='0')then--enter

state<=s5;

elsif(enter='1'andchg_c='1'andm="00")then--enter

if(old_code=temp_code)then

m:

="01";

state<=s1;

elsestate<=sw;

endif;

elsif(enter='1'andchg_c='1'andm="01")then--enter

new1_code:

=temp_code;

m:

="10";

state<=s1;

elsif(enter='1'andchg_c='1'andm="10")then--enter

new2_code:

=temp_code;

if(new1_code=new2_codeandc_ua='0')then

user_code<=new2_code;

state<=sw;

elsif(new1_code=new2_codeandc_ua='1')then

admin_code<=new2_code;

state<=sw;

elsif(new1_code/=new2_code)then

state<=sw;

endif;

elsif(clear='1')then

state<=s3;

endif;

whens5=>

if(s_model='0'andtemp_code=user_code)then

openlock<='1';

state<=s6;

elsif(s_model='0'andtemp_code/=user_code)then

n:

=n+1;

ifn="11"then

alarm<='1';

state<=s1;

else

state<=s1;

endif;

elsif(s_model='1'andtemp_code=admin_code)then

state<=s6;

elsif(s_model='1'andtemp_code/=admin_code)then

state<=sw;

endif;

whens6=>

if(enter='1')then--enter

state<=sw;

elsif(clear='1'andalarm='1')then--clear

alarm<='0';

state<=sw;

elsif(chgcode='1')then

chg_c<='1';

state<=s7;

endif;

whens7=>

m:

="00";

if(user='1')then

c_ua<='0';

old_code<=user_code;

state<=s1;

elsif(admin='1')then

c_ua<='1';

old_code<=admin_code;

state<=s1;

endif;

whensw=>

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;

endcase;

ENDif;

ENDPROCESSmain;

endBehavioral;

 

创建测试平台仿真结果:

一:

输入密码,期间有清除,并且密码输入正确。

仿真波形图如下:

二:

在管理员状态下输入密码,之后切换到用户状态,输入三次,最后输入密码正确,开锁。

仿真波形图如下:

三:

输入密码错误三次,拉起警报。

管理员状态下,管理员输入正确密码解除警报。

仿真波形图如下:

 

四:

输入密码一次,密码错误,切换到管理员状态。

仿真波形图如下:

 

实验小结

这次的实习,让我学到了掌握了很多EDA的知识,这两周的实习我通过复习跟大量的查询,终于完成了这次课程的设计,让我对以前所学专业知识不足的地方有了进一步的掌握改正,让我对这门专业有了更深的理解。

这次的EDA实习任务是编写密码锁的程序并且下载在硬件实现密码锁功能,这次实习任务是我大学以来做过的最难的。

在编写密码锁程序时,有很多的难点。

一:

密码锁的功能复杂,编写程序容易混乱;二:

硬件要去实验程序中只可以设置八个按键;三:

题目要求用两个按键实现密码输入,一个按键控制选择输入的是第几位密码,另一位按键控制输入密码。

经过与同学以及老师的讨论,采取以下方法解决问题。

一:

将整个系统分成输入输出模块,控制模块,按键设置模块和60s计时器模块来解决功能复杂导致的程序逻辑关系不清的问题;二:

将确认键和enter键合并,切换键与user键合并解决按键不足的问题:

三:

采用计数法实现

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 人力资源管理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2