EDA4位密码锁的课程设计要点.docx
- 文档编号:24485532
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:24
- 大小:341.28KB
EDA4位密码锁的课程设计要点.docx
《EDA4位密码锁的课程设计要点.docx》由会员分享,可在线阅读,更多相关《EDA4位密码锁的课程设计要点.docx(24页珍藏版)》请在冰豆网上搜索。
EDA4位密码锁的课程设计要点
信息技术学院
《可编程逻辑器件原理及应用》课程
综合设计报告书
姓名:
景显冬
班级:
B1106
学号:
04
时间:
2013.12.31
指导教师:
李海成
设计
题目
密码锁设计
设
计
要
求
和
任
务
数据输入:
每按一个数字键,就输入一个数值,并在显示器上的最右方显示出该数值,并将先前已经输入的数据依序左移一个数字位置。
数码清除:
按下此键可清除前面所有的输入值,清除成为“0000”。
密码更改:
按下此键时将目前的数字设定成新的密码。
激活电锁:
按下此键可将密码锁上锁。
解除电锁:
按下此键会检查输入的密码是否正确,密码正确即开锁。
设
计
过
程
设计方案
本系统采用模块化的设计,整个系统分为数字按键输入、时钟输入、功能按键输入、数字译码块、功能译码模块、核心处理模块、输出处理模块、显示译码电路八个模块。
整体电路如图1.1所示。
图1.1数字密码锁总方框图
硬件电路的设计
4位数字密码锁包括五个基本逻辑模块,分别为:
数字按键输入模块(numinput)、功能按键输入模块(funcinput)、核心处理模块(core)、输出处理模块(allout)、七段译码器模块(dataout)。
数字按键输入--numinput
说明:
读取数字键0~9。
按键为矩阵形式,高电平表示按键未按下,低电平表示按键按下。
经数字按键输入模块处理后输出4位二进制代码,“0000”~“1001”分别表示0~9,用“1010”表示其他无效输入。
如表2.1所示。
设
计
过
程
表2.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)数字按键输入模块仿真图:
设
计
过
程
图2.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符号文件:
图2.2数字按键输入--numinput符号文件
功能按键输入模块--funcinput
读取矩阵按键区控制功能按键-—清除键、改密键、上锁键、解锁键。
高电平表示按键未按下,低电平表示按键按下。
按照“清除,改
设
计
过
程
密,上锁,解锁”顺序读取按键时,只能输出一位控制信号。
输出的信号为3位二进制代码,“001”~“100”,依次表示“清除按键、改密按键、上锁,解锁”,用“000”表示输入不为功能按键信号。
表2.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)功能按键输入模块仿真图:
图2.3功能按键输入模块仿真图
由图可知:
当功能按键输入模块的输入依次为“11100111”、“11101101”、“11101110”、“11101011”时,conout输出依次为“001”、“010”、“011”、“100”,当为其他按键输入时,conout输出均为“000”。
(3)功能按键输入模块--funcinput符号文件:
设
计
过
程
图2.4功能按键输入模块--funcinput符号文件
核心处理模块--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)
设
计
过
程
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为高电平,所以此时红灯闪烁一次,表示密码锁已上锁。
仿真波形图如下:
图2.5核心处理模块仿真图
(一)
图2.6核心处理模块仿真图
(二)
由图可知:
若conin输入为“100”时(解锁时),当再次输入密码“1234”,并此时ledg输出为低电平(绿灯亮)。
Dataa输出密码“1234”,则表示此时密码锁已解锁。
(3)核心处理模块--core符号文件:
设
计
过
程
图2.7处理核心模块--core符号文件
输出处理模块—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)输出处理模块仿真图:
图2.8输出处理模块仿真图
设
计
过
程
当输出密码为“0123”时,经过输出处理模块的处理后,能刷新输出密码“0123”对应的二进制“0000”、“0001”、“0010”、“0011”,当密码改为“5678”时,该模块也能对应刷新出新密码对应二进制“0101”、“0110”、“0111”、“1000”。
(3)输出处理模块—allout符号文件:
图2.9输出处理模块—allout符号文件
七段译码器模块—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--七段译码器模块仿真图:
图2.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”。
表2.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)输出处理模块—Dataout符号文件:
图2.11输出处理模块—allout符号文件
软件设计
四位密码锁的电路设计原理图如下:
设
计
过
程
设
计
过
程
图3.1四位密码锁的电路设计原理图
系统仿真
该四位数字密码锁的设计是一个实时的系统,对于每一个按键的操作都是在时钟的上升沿完成的,是一个动态的逻辑关系;而系统输出为数码管显示的实时输出,不便于分析该系统电路的功能,且系统电路中存在自动刷新的功能模块,因而电路仿真时不能较好地观察输出结果,为了解决这一问题,故修改电路的原理图如下:
图4.1便于观察输出结果的原理图
图4.2系统仿真图
(一)
设
计
过
程
由图可知,当功能按键的输入(funcin)为“11100111”(即按下功能按键“清除键”)时,系统输出(dataa,datab,datac,datad)均为“0000”,表示密码锁的密码已清除,数码管显示输出为“1111110”,即此时4个数码管均显示数字“0”。
图4.3系统仿真图
(二)
由图可知,功能按键的输入(funcin)先为“11100111”(即按下功能按键“清除键”),后为“11101110”(即按下功能按键“改密键”)后,系统输出(dataa,datab,datac,datad)为“0001”、“0010”、“0011”、“0100”,表示密码已修改为“1234”,且先ledg输出为低电平,表示为在开锁状态下修改密码,后ledr输出为高电平,表示密码已接受,数字密码锁已上锁。
结
束
结束语
本文设计的基于VHDL语言的串行电子密码锁系统,硬件电路简单,微功耗,同时也提高了系统的可靠性和精度。
锁的密码是可调的,且设置方便。
锁内设置的密码值可以选取00至FF中任一个,共计28种。
本设计占用芯片资源少,可在此基础上变二进制输入为十进制输入,或外加LED七段显示等一些外围电路,以设计更大的系统。
在FPGA中,不同电路系统的设计往往采用自顶向下的设计方法,亦即将一个大的系统分解成单元电路。
在每个单元电路的设计完成后,采用专门的仿真工具进行功能仿真是很有必要的,可节省不少设计时间。
对于这一整个电子密码锁系统,设计的程序已经基本实现了预期的所有功能,充分利用了EDA设计中的优点,将各模块以文件顶层设计的方式让所有子程序串联在了一起,通过满足某个条件而实现相关功能.显然这个系统的设计已经完成,也基本达到了作为数字密码锁的绝大部分功能。
在本次设计中,总是遇到这样或那样的问题,有时发现一个问题的时候需要做大量的工作,画大量的时间才能解决。
自然而然,我的耐心便在其中建立起来了。
为以后的工作积累了经验,增强了信心。
在此也感谢李老师对我的指导,以及同学们对我的帮助。
成绩
评定
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA4 密码锁 课程设计 要点