四位数字密码锁的设计.docx
- 文档编号:17408737
- 上传时间:2023-04-24
- 格式:DOCX
- 页数:22
- 大小:384.57KB
四位数字密码锁的设计.docx
《四位数字密码锁的设计.docx》由会员分享,可在线阅读,更多相关《四位数字密码锁的设计.docx(22页珍藏版)》请在冰豆网上搜索。
四位数字密码锁的设计
EDA课程设计报告书
课题名称
四位数字密码锁的设计
姓名
学号
院系
专业
指导教师
年月日
设计任务及要求:
(1)设计任务:
本课程设计要求设计的数字密码锁密码为4位,由密码锁输入电路、码锁控制电路、密码锁处理电路、显示电路四大部分组成,将各电路组合起来,构成了一个完整的电子密码锁。
(2)设计要求:
①、密码输入:
每按一个数字键,就输入一个数值,且将在显示器上的最右上方显示出该数字,并将先前已经输入的数据依序左移一位。
②、数码清除:
按下此键可以清除前面所有的输入值,清除成为“0000”。
③、密码修改:
按下此键时将目前的数字设定成新的密码。
④、激活电锁:
按下此键可将密码锁上锁,红色LED灯将闪烁一次。
⑤、解除电锁:
按下此键会检查输入的密码是否正确,若绿色LED亮则表示密码正确,密码锁将解锁。
指导教师签名:
年月日
二、指导教师评语:
指导教师签名:
年月日
三、成绩
验收盖章
年月日
四位数字密码锁的设计
1设计目的
随着人们生活水平的提高,如何实现家庭防盗这一问题也变的尤其的突出,传统的机械锁由于其构造简单,被撬的事件屡见不鲜,电子锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的喜爱,电子密码锁的使用也体现了人们消费水平、保安意识和科技水平的提高,而且避免了携带甚至丢失钥匙的麻烦。
2设计的主要内容和要求
设计一个简单的数字电子密码锁,密码为4位。
要求具备如下功能:
(1)如果输入数字键,第一个数字会从数码管的最右端开始显示,此后每按下一个数字键,数码管上的数字必须往左移动一格,以便将新的数字显示出来。
(2)本密码锁为四位密码锁,当输入的数字超过四个时,不会显示第四个以后的数字。
(3)按下密码清零键,清除所有输入的数字,清除成为“0000”,即做归零动作。
(4)按下解锁键,检查输入的密码是否正确,若解锁指示灯(绿色LED灯)闪烁一次,即表示密码正确(开锁)。
(5)按下改密键,将当前输入的数字设置成新密码,且上锁指示灯(红色LED灯)闪烁一次,即密码锁已上锁。
3整体设计方案
本系统采用模块化的设计,整个系统分为数字按键输入、时钟输入、功能按键输入、数字译码块、功能译码模块、核心处理模块、输出处理模块、显示译码电路八个模块。
整体电路如图3.1所示。
图3.1数字密码锁总方框图
4硬件电路的设计
4位数字密码锁包括五个基本逻辑模块,分别为:
数字按键输入模块(numinput)、功能按键输入模块(funcinput)、核心处理模块(core)、输出处理模块(allout)、七段译码器模块(dataout)。
4.1数字按键输入--numinput
说明:
读取数字键0~9。
按键为矩阵形式,高电平表示按键未按下,低电平表示按键按下。
经数字按键输入模块处理后输出4位二进制代码,“0000”~“1001”分别表示0~9,用“1010”表示其他无效输入。
如表4.1所示。
表4.1数字按键输入模块(numinput)的数据输入输出
按键数字
按键扫描输出
Numinput二进制输出
对应十进制数字
0
11011110
0000
0
1
01111101
0001
1
2
01111110
0010
2
3
10110111
0011
3
4
10111011
0100
4
5
10111101
0101
5
6
10111110
0110
6
7
11010111
0111
7
8
11011011
1000
8
9
11011101
1001
9
其他按键
其他
1010
10
(1)numinput--数字按键输入模块程序:
libraryieee;
useieee.std_logic_1164.all;
entitynuminputis
port(numin:
INstd_logic_vector(7downto0);
numstate,clk:
INstd_logic;
numout:
OUTstd_logic_vector(3downto0));
endnuminput;
architectureoneofnuminputis
signalstate:
std_logic;
signalmem:
std_logic_vector(7downto0);
begin
process(clk)
begin
ifclk'eventandclk='1'then
ifstate/=numstatethen
ifmem/=numinthen
casenuminis
when"11011110"=>numout<="0000";---"0"
when"01111101"=>numout<="0001";---"1"
when"01111110"=>numout<="0010";---"2"
when"10110111"=>numout<="0011";---"3"
when"10111011"=>numout<="0100";---"4"
when"10111101"=>numout<="0101";---"5"
when"10111110"=>numout<="0110";---"6"
when"11010111"=>numout<="0111";---"7"
when"11011011"=>numout<="1000";---"8"
when"11011101"=>numout<="1001";---"9"
whenothers=>numout<="1010";
endcase;
state<=numstate;
elsenumout<="1010";
endif;
mem<=numin;
endif;
endif;
endprocess;
endone;
(2)数字按键输入模块仿真图:
图4.1数字按键输入模块仿真图
由图可知,当数字按键输入模块的输入依次为"11011110"、"01111101"、"01111110"、"10110111"、"10111011"、"10111101"、"10111110"、"11010111"、"11011011"、"11011101"时,numout输出依次输出“0000”、“0001”、“0010”、“0011”、“0100”、“0101”、“0110”、“0111”、“1000”、“1001”;当为其他按键输入时,numout输出均为“1010”。
(3)数字按键输入--numinput符号文件:
图4.2数字按键输入--numinput符号文件
4.2功能按键输入模块--funcinput
读取矩阵按键区控制功能按键-—清除键、改密键、上锁键、解锁键。
高电平表示按键未按下,低电平表示按键按下。
按照“清除,改密,上锁,解锁”顺序读取按键时,只能输出一位控制信号。
输出的信号为3位二进制代码,“001”~“100”,依次表示“清除按键、改密按键、上锁,解锁”,用“000”表示输入不为功能按键信号。
表4.2控制功能按键输入模块(funcinput)的输出输入数据
功能按键
功能按键扫描输出
Funcinput二进制输出
对应十进制数字
清除键
11100111
001
1
改密键
11101101
010
2
上锁键
11101110
011
3
解锁键
11101011
100
4
其他按键
其他
000
0
(1)Funcinput--功能按键输入模块程序:
libraryieee;
useieee.std_logic_1164.all;
entityfuncinputis
port(funcin:
INstd_logic_vector(7downto0);
constate,clk:
INstd_logic;
conout:
OUTstd_logic_vector(2downto0));
endfuncinput;
architectureoneoffuncinputis
signalstate:
std_logic;
signalmem:
std_logic_vector(7downto0);
begin
process(clk)
begin
ifclk'eventandclk='1'then
ifconstate/=statethen
state<=constate;
ifmem/=funcinthen
withfuncinselect
conout<="001"when"11100111",--清除键
"010"when"11101101",--改密键
"011"when"11101110",--上锁键
"100"when"11101011",--解锁键
"000"whenothers;
mem<=funcin;
elseconout<="000";
endif;
endif;
endif;
endprocess;
endone;
(2)功能按键输入模块仿真图:
图4.3功能按键输入模块仿真图
由图可知:
当功能按键输入模块的输入依次为“11100111”、“11101101”、“11101110”、“11101011”时,conout输出依次为“001”、“010”、“011”、“100”,当为其他按键输入时,conout输出均为“000”。
(3)功能按键输入模块--funcinput符号文件:
图4.4功能按键输入模块--funcinput符号文件
4.3核心处理模块--core
核心处理模块将根据输入(数字按键输入以及功能按键输入)来改变存储器状态、数码管显示以及LED灯显示(红灯亮为上锁,绿灯亮为解锁)。
(1)Core--核心处理程序:
libraryieee;
useieee.std_logic_1164.all;
entitycoreis
port(numin:
instd_logic_vector(3downto0);
conin:
instd_logic_vector(2downto0);
clk:
instd_logic;
dataa,datab,datac,datad:
outstd_logic_vector(3downto0);
ledr,ledg,numout,conout:
outstd_logic);
endentity;
architectureoneofcoreis
typelockstateis(unlock,locked);
signalnuma,numb,numc,numd,codea,codeb,codec,coded:
std_logic_vector(3downto0);
signalnumstate,constate:
std_logic;
signallocksta:
lockstate;
begin
process(clk,numin,conin)
begin
ifclk'eventandclk='1'then--上升沿
ifnumin/="1010"then
numd<=numc;
numc<=numb;
numb<=numa;
numa<=numin;
endif;
ifconin/="000"then
ifconin="001"then--清除键按下
numa<="0000";--全部清零
numb<="0000";
numc<="0000";
numd<="0000";
elsifconin="010"then--改密键按下
iflocksta/=lockedthen--锁并不是上锁状态
codea<=numa;
codeb<=numb;
codec<=numc;
coded<=numd;
endif;
elsifconin="011"then--上锁键按下
iflocksta/=lockedthen
numa<="0000";
numb<="0000";
numc<="0000";
numd<="0000";
locksta<=locked;--锁定密码锁
endif;
elsifconin="100"then--解锁键按下
iflocksta=lockedthen
ifnuma=codeaandnumb=codebthen--输入正确密码
ifnumc=codecandnumd=codedthen
locksta<=unlock;--锁开
endif;
endif;
endif;
endif;
endif;
iflocksta=lockedthen--若锁锁定
ledr<='1';--led等高电平,红灯闪烁
ledg<='0';
else
ledr<='0';
ledg<='1';
endif;
dataa<=numa;
datab<=numb;
datac<=numc;
datad<=numd;
ifnumstate='1'thennumstate<='0';
elsenumstate<='1';
endif;
ifconstate='1'thenconstate<='0';
elseconstate<='1';
endif;
numout<=numstate;
conout<=constate;
endif;
endprocess;
endone;
(2)核心处理模块仿真图:
当数字按键输入为有效输入(即输入的按键为数字按键0~9时),此时虽输入9位数字,但只有前四位有效,所以密码应为“1234”。
若conin输入为“011”(即按下上锁键),此时可以看到ledr为高电平,所以此时红灯闪烁一次,表示密码锁已上锁。
仿真波形图如下:
图4.5核心处理模块仿真图
(一)
图4.6核心处理模块仿真图
(二)
由图可知:
若conin输入为“100”时(解锁时),当再次输入密码“1234”,并此时ledg输出为低电平(绿灯亮)。
Dataa输出密码“1234”,则表示此时密码锁已解锁。
(3)核心处理模块--core符号文件:
图4.7处理核心模块--core符号文件
4.4输出处理模块—allout
对处理核心模块—core输出的数据进行刷新,使数码管及时显示刷新的数字。
(1)Allout--输出处理程序:
libraryieee;
useieee.std_logic_1164.all;
entityalloutis
port(dataa,datab,datac,datad:
instd_logic_vector(3downto0);
clk:
instd_logic;
dataout:
outstd_logic_vector(3downto0);
outsel:
outstd_logic_vector(1downto0));
endallout;
architectureoneofalloutis
signaltimer:
std_logic_vector(1downto0);
begin
process(clk)
begin
ifclk'eventandclk='1'then--上升沿
iftimer="00"then
dataout<=dataa;
outsel<="00";
timer<="01";
elsiftimer="01"then
dataout<=datab;
outsel<="01";
timer<="10";
elsiftimer="10"then
dataout<=datac;
outsel<="10";
timer<="11";
else
ataout<=datad;
outsel<="11";
timer<="00";
endif;
endif;
endprocess;
endone;
(2)输出处理模块仿真图:
图4.8输出处理模块仿真图
当输出密码为“0123”时,经过输出处理模块的处理后,能刷新输出密码“0123”对应的二进制“0000”、“0001”、“0010”、“0011”,当密码改为“5678”时,该模块也能对应刷新出新密码对应二进制“0101”、“0110”、“0111”、“1000”。
(3)输出处理模块—allout符号文件:
图4.9输出处理模块—allout符号文件
4.5七段译码器模块—dataout
把4位2进制数翻译成数码管代码,使输入的密码或修改的密码能及时显示在数码管上。
(1)Dataout--七段译码器模块程序:
libraryieee;
useieee.std_logic_1164.all;
entitydataoutis
port(datain:
INstd_logic_vector(3downto0);
dataout:
OUTstd_logic_vector(6downto0));
enddataout;
architectureoneofdataoutis
begin
process(datain)
begin
casedatainis
when"0000"=>dataout<="1111110";--数码管显示0
when"0001"=>dataout<="0110000";--数码管显示1
when"0010"=>dataout<="1101101";--数码管显示2
when"0011"=>dataout<="1111001";--数码管显示3
when"0100"=>dataout<="0110011";--数码管显示4
when"0101"=>dataout<="1011011";--数码管显示5
when"0110"=>dataout<="1011111";--数码管显示6
when"0111"=>dataout<="1110000";--数码管显示7
when"1000"=>dataout<="1111111";--数码管显示8
when"1001"=>dataout<="1111011";--数码管显示9
whenothers=>dataout<="0000000";--不显示
endcase;
endprocess;
endone;
(2)Dataout--七段译码器模块仿真图:
图4.10七段译码器模块仿真图
由图可知:
当七段译码器的输入信号(datain)为“0000”、“0001”、“0010”、“0011”、“0100”、“0101”、“0110”、“0111”、“1000”、“1001”,输出信号(dataout)依次为:
“1111110”、“0110000”、“1101101”、“1111001”、“0110011”、“1011011”、“1011111”、“1110000”、“1111111”、“1111011”,当conin输入信号为其他时,译码输出为“0000000”。
表4.3七段译码器的输入及译码对照表
二进制译码输入
二进制译码输出
数码管显示数字
0000
1111110
0
0001
0110000
1
0010
1101101
2
0011
1111001
3
0100
0110011
4
0101
1011011
5
0110
1011111
6
0111
1110000
7
1000
1111111
8
1001
1111011
9
其他输入
0000000
无显示
(3)输出处理模块—allout符号文件:
图4.11输出处理模块—allout符号文件
5软件设计
四位密码锁的电路设计原理图如下:
图5.1四位密码锁的电路设计原理图
6系统仿真
该四位数字密码锁的设计是一个实时的系统,对于每一个按键的操作都是在时钟的上升沿完成的,是一个动态的逻辑关系;而系统输出为数码管显示的实时输出,不便于分析该系统电路的功能,且系统电路中存在自动刷新的功能模块,因而电路仿真时不能较好地观察输出结果,为了解决这一问题,故修改电路的原理图如下:
图6.1便于观察输出结果的原理图
图6.2系统仿真图
(一)
由图可知,当功能按键的输入(funcin)为“11100111”(即按下功能按键“清除键”)时,系统输出(dataa,datab,datac,datad)均为“0000”,表示密码锁的密码已清除,数码管显示输出为“1111110”,即此时4个数码管均显示数字“0”。
图6.3系统仿真图
(二)
由图可知,功能按键的输入(funcin)先为“11100111”(即按下功能按键“清除键”),后为“11101110”(即按下功能按键“改密键”)后,系统输出(dataa,datab,datac,datad)为“0001”、“0010”、“0011”、“0100”,表示密码已修改为“1234”,且先ledg输出为低电平,表示为在开锁状态下修改密码,后ledr输出为高电平,表示密码已接受,数字密码锁已上锁。
7设计总结
通过两星期的紧张工作,最后完成了我的设计任务——基于VHDL语言的四位密码锁设计。
通过本次课程设计的学习,我深深的体会到EDA设计课的重要性和目的性所在。
本次设计课不仅仅培养了我们实际操作能力,也培养了我们灵活运用课本知识,理论联系实际,独立自主的进行设计的能力。
它不仅仅是一个学习新知识新方法的好机会,同时也是对我所学知识的一次综合的检验和复习,使我明白了自己的缺陷所在,从而查漏补缺。
课程设计要求我要有耐心和毅力,还要细心,稍有不慎,一个小小的错误就会导致结果的不正确,而对错误的检查要求我要有足够的耐心,通过这次设计和设计中遇到的问题,也积累了一定的经验,对以后从事集成电路设计工作会有一定的帮助。
在应用VHDL的过程中让我真正领会到了其并行运行与其他软件(C语言)顺序执行的差别及其在电路设计上的优越性。
用VHDL硬件描述语言的形式来进行数字系统的设计方便灵活,利用EDA软件进行编译优化仿真极大地减少了电路设计时间和可能发生的错误,降低了开发成本,这种设计方法必将在未来的数字系统设计中发挥越来越
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 密码锁 设计