EDA技术与VHDL语言课程设计.docx
《EDA技术与VHDL语言课程设计.docx》由会员分享,可在线阅读,更多相关《EDA技术与VHDL语言课程设计.docx(19页珍藏版)》请在冰豆网上搜索。
EDA技术与VHDL语言课程设计
课程设计
EDA技术与VHDL语言
课程设计报告
班级:
电信11-2班
姓名:
董元伟
学号:
1106110205
指导教师:
李铁
成绩:
电子与信息工程学院
信息与通信工程系
目录
摘要-3-
一、设计目的 -4-
二、设计内容和要求 -4-
1、用户开锁-5-
2、管理员解除警报-5-
3、管理员修改密码-5-
4、定时返回-6-
三、设计思路和系统结构-6-
1、设计模块-6-
2、系统结构和数字密码锁原理图-7-
3、设计思路-8-
四、实验设计程序如 -9-
五、创建测试平台仿真结果-21-
参考文献-25-
摘要
本文介绍一种利用EDA技术和VHDL语言,在MAX+PLUSⅡ环境下,设计了一种新型的智能密码锁。
它体积小、功耗低、价格便宜、安全可靠,维护和升级都十分方便,具有较好的应用前景。
随着社会物质财富的日益增长,安全防盗已成为全社会问题。
人们对锁的要求越来越高,既要安全可靠地防盗,又要使用方便。
弹子锁由于结构上的局限已难以满足当前社会管理和防盗要求,特别是在人员经常变动的公共场所,如办公室、宾馆等地方。
电子密码锁由于其自身的优势,越来越受到人们的青睐,但是目前使用的电子密码锁大部分是基于单片机用分离元件实现的,其成本较高且可靠性得不保证。
本文采用先进的EDA技术,利用MAX+PLUXⅡ工作平台和VHDL语言,设计了一种新型的智能密码锁。
该密码锁具有密码预置和误码报警等功能,用一片FPGA芯片实现,从而大大简化了系统结构,降低了成本,提高了系统的保密性和可靠性。
采用这种器件开发的数字系统,其升级与改进极其方便。
一、设计目的
1.掌握VHDL语言的使用,学会用VHDL语言来编程解决实际问题。
2.学会使用EDA开发软件设计小型综合电路,掌握仿真的技巧。
3.学会应用开发系统实现数字密码锁的设计。
二、设计内容和要求
用VHDL语言设计一个密码锁,用波形仿真验证其功能后,实现到GW48实验系统。
1、功能描述:
用于模仿密码锁的工作过程。
完成密码锁的核心控制功能。
2、功能要求:
设计一个密码锁,平时处于等待状态。
管理员可以设置或更改密码。
如果不预置密码,密码缺省为“1234”。
用户如果需要开锁,按相应的按键进入输入密码状态,输入4位密码,按下确定键后,若密码正确,锁打开;若密码错误,将提示密码错误,要求重新输入,三次输入都错误,将发出报警信号。
报警后,只有管理员作相应的处理才能停止报警。
用户输入密码时,若输入错误,在按下确定键之前,可以通过按取消键重新输入。
正确开锁后,用户处理完毕后,按下确定键,系统回到等待状态。
系统操作过程中,只要密码锁没有打开,如果60秒没有对系统操作,系统回到等待状态。
要求密码在输入过程中被依次显示,即先输入的为密码的第一位,总是显示在最左边。
用两个发光二极管模拟显示,其中一个显示当前的工作模式,灭表示用户模式,亮表示管理员模式;另外一个指示锁的状态,灭表示锁处于锁定,亮表示锁被开启。
注意:
用两个按键实现密码输入,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键。
然后分别输入旧密码,新密码,新密码要输入两次。
旧密码与所要修改的密码对应。
如旧密码输入错误,则无法修改;当验证不成功即两次新密码不相同时,修改密码失败。
返回等待状态。
成功后也返回等待状态。
(4)定时返回:
用户在未开锁状态下,60s没有按键输入,则返回等待状态,但不包括alarming状态。
只要是alarming,则只有管理输入管理员密码才能解锁并按下clear消除警报。
三、设计思路和系统结构
1、设计模块
设计密码锁时,采用自顶向下的设计方法。
将整个系统分成几个子模块:
输入输出模块,控制模块,按键设置模块和60s计时器模块。
控制模块是整个程序的主要部分,采用状态循环的办法,以用户每按下一次按键为计量单位,划分状态,以实现各种功能。
60s计时器模块是完成60s没有按键则返回等待状态这一功能的主要模块。
这个模块的核心思想是一个变量numtime计数。
变量numtime的初始值为0,在无报警为开锁的情况下,时钟每秒发出一个上升沿信号,计数一次,如有按键则numtime清零,否则计数到60即“111100”则返回信号back变为1,返回等待状态。
按键设置模块是将各种功能按键用高低电平赋值,便于调用。
2、系统结构和数字密码锁原理图
结合实际实验板的资源分配和考虑到数字密码锁的实现较为简易,故整个系统的设计根据功能要求,将系统分为keyread、stating、showing三个进程,系统结构图大概如下图所示:
进程
keyread
Clk时钟输入
拨码开关输入code
进程
starting
进程
showing
Led-7数码管输出
Led-list数码管位选
Controlled灯输出
Alam蜂鸣器输出
数字密码锁原理图如下:
3、设计思路
利用实验本上的四个按键实现四个密码数列的输入以及密码输入的最终确认,这部分功能的实现由进程keyread实现完成;
利用实验本上四个拨码开关的不同组合区分密码锁的不同功能状态,包括密码重置、密码重置清除、密码输入、密码输入清除、密码锁锁闭、钥匙插入开锁,这部分由进程stating实现,进程stating还实现了相应状态下,蜂鸣器、数码管、led灯控制信号的输出以实现相应提示和显示。
四、实验设计程序如下:
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 is
PORT(
clk,user,admin,clear,enter,chgcode,res,numenter ,number:
IN STD_LOGIC;
openlock:
buffer std_logic;
alarming,model:
OUT STD_LOGIC;
shuma2,shuma1,shuma0:
out std_logic_vector(6 downto 0)
);
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