EDA4位密码锁的课程设计.doc
《EDA4位密码锁的课程设计.doc》由会员分享,可在线阅读,更多相关《EDA4位密码锁的课程设计.doc(23页珍藏版)》请在冰豆网上搜索。
信息技术学院
《可编程逻辑器件原理及应用》课程
综合设计报告书
姓名:
景显冬
班级:
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--清除键按下
num