数电实验报告.docx
- 文档编号:2420510
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:28
- 大小:943.11KB
数电实验报告.docx
《数电实验报告.docx》由会员分享,可在线阅读,更多相关《数电实验报告.docx(28页珍藏版)》请在冰豆网上搜索。
数电实验报告
数字电路与逻辑设计实验报告
1、设计课题的任务要求
题目六简易智能密码锁
设计并实现一个数字密码锁,密码锁有四位数字密码和一个确认开锁按键,密码输入正确,密码锁打开,密码输入错误进行警示。
基本要求:
1、密码设置:
通过键盘进行4位数字密码设定输入,在数码管上显示所输入数字。
通过密码设置确定键(BTN键)进行锁定。
2、开锁:
在闭锁状态下,可以输入密码开锁,且每输入一位密码,在数码管上显示“-”,提示已输入密码的位数。
输入四位核对密码后,按“开锁”键,若密码正确则系统开锁,若密码错误系统仍然处于闭锁状态,并用蜂鸣器或led闪烁报警。
3、在开锁状态下,可以通过密码复位键(BTN键)来清除密码,恢复初始密码“0000”。
闭锁状态下不能清除密码。
4、用点阵显示开锁和闭锁状态。
提高要求:
1、输入密码数字由右向左依次显示,即:
每输入一数字显示在最右边的数码管上,同时将先前输入的所有数字向左移动一位。
2、密码锁的密码位数(4~6位)可调。
3、自拟其它功能。
出于对于此密码锁安全性、可控性及便利性的优化,本人对于题目要求做了如下调整:
1、通过一个拨码开关VISIBLE(可视化),来实现对数码管输入数字是否可见的控制:
开时,输入密码数字由右向左依次显示,即每输入一数字显示在最右边的数码管上,同时将先前输入的所有数字向左移动一位;关时,数码管显示“-”提示输入密码的位数,并有四个LED灯用8421码提示输入密码的键值。
2、将密码复位键在功能上优化成密码更改键CHGPW(changepassword的缩写),当处于开锁状态时,按下此键即在开锁状态下获得设置密码的权限,点阵显示为不同颜色的开锁图案。
因为原要求中相当于设定过一次密码后只能通过密码复位键将密码设置为0000,这既不合理又不方便。
3、对于提高要求的取舍:
(1)将移位显示结合在了开关VISIBLE中,并拓展了四个LED的键值显示。
(2)舍弃了对于密码位数可调的扩展性。
(3)自拟了输入时的退格键DEL以及全清键CLR,用以避免在输入时误操作导致报警,一定程度上增强了密码锁的可控性和实用性。
二、系统设计
1.设计思路
整体思路上用有限状态机实现该课题(set,unlocked,locked)。
具体需要如下模块:
分频模块、键值读取模块、状态机主控制模块、点阵显示模块、数码管显示模块以及报警模块。
2.对外界口说明
(1)输入:
CLK:
时钟信号。
VISIBLE(SW0):
控制密码可视化的拨码开关。
RST(SW7):
重置密码锁内部很多进程,但并不重置密码锁本身。
LOCK(BTN1):
由开锁状态转换为闭锁状态的闭锁键。
CHGPW(BTN4):
在开锁状态下跳至开锁并设置密码状态。
OK(BTN0):
设置或输入密码后的确认键。
DEL(BTN2):
在设置或输入密码时清除一位的退格键。
CLR(BTN3):
在设置或输入密码时清除全部的全清键。
KEYROW:
四位输入行信号。
(2)输出:
KEYCOL:
四位输出列扫描信号。
DISP:
六位输出数码管位数显示信号。
SHOWAN:
8位输出数码管内容显示信号。
CODE:
四位LED输出用8421码表示键值。
DISROW:
点阵行输出信号。
DISCOLR:
点阵红列输出信号。
DISCOLG:
点阵绿列输出信号。
SOUND:
报警声音输出信号。
LIGHTS:
报警闪灯输出信号。
3.总体框图
设置密码
确定?
时钟上升沿
N
Y
NY
N
YNY
4.分块设计
块间信号说明
typestate_typeis(set,unlocked,locked);--定义状态机状态类型
signalstate:
state_type:
=set;--状态机的状态
signalpwed,pwing:
std_logic_vector(15downto0);--已设定的密码和正在输入的密码
signalcount:
integerrange0to4:
=0;--输入密码位数计数器
signaldiv:
std_logic_vector(29downto0);--30位分频器
signalkeycode:
std_logic_vector(3downto0);--键值
signalkeyscan:
std_logic_vector(3downto0);--键盘列扫描信号
signalkeyrow:
std_logic_vector(3downto0);--键盘行信号
signalkeyloc:
std_logic_vector(7downto0);--键位信号
signalalarm:
std_logic:
='0';--报警信号及退格键防抖辅助信号
(1)分频模块
process(clk,rst)--divider
begin
if(rst='1')then
div<="000000000000000000000000000000";--2^30
elsif(clk'eventandclk='1')then
div<=div+1;
endif;
endprocess;
用一个30位标准逻辑向量的div信号实现任意2的N次幂分频,对于时间精度要求不高的系统,无需过于准确的分频,这种精度是完全够用的,而避免了过多对于分频器的编程。
使用该分频器时,用DIV(N)或DIV(NDOWNTON-M)就可以实现所需要的分频。
如DIV(9)为原时钟信号的29+1约等于1000分频。
(2)键值读取模块
keycol<=keyscan;
process(div(21downto20))--keyscaning
begin
casediv(21downto20)is
when"00"=>keyscan<="0111";
when"01"=>keyscan<="1011";
when"10"=>keyscan<="1101";
when"11"=>keyscan<="1110";
endcase;
endprocess;
process(keyscan,keyrow,keycode,keyloc)--keycode
begin
keyloc<=keyrow&keyscan;
casekeylocis
when"01111110"=>keycode<="0001";
when"01111101"=>keycode<="0010";
when"01111011"=>keycode<="0011";
when"01110111"=>keycode<="0100";
when"10111110"=>keycode<="0101";
when"10111101"=>keycode<="0110";
when"10111011"=>keycode<="0111";
when"10110111"=>keycode<="1000";
when"11011110"=>keycode<="1001";
when"11011101"=>keycode<="0000";
whenothers=>keycode<="1111";
endcase;
endprocess;
按一定频率输出列扫描,并返回行信号,当行列信号同时有一列为零时,表示该键被按下,用连接的行列信号确定按键位置进一步确定键值,当没有按键按下时,键值为“1111”即15。
(3)状态机主控制模块(代码见于源代码部分)
分频信号上升沿时,判断状态机状态,进入不同的处理,set状态设定密码,count计数输入位数,满四位后确认则设置成功进入解锁状态,直至闭锁进入闭锁状态,可输入密码并确认,正确则开锁,错误则继续闭锁并且报警直至输入正确进入开锁状态。
开锁状态下也可选择更改密码选项进入设置密码状态,设置密码状态和闭锁输入密码状态下可通过退格键和全清键对以输入的密码进行清除。
密码储存于16位标准逻辑向量PWING,每四位以8421码存储一位密码,输入时通过对密码后12位和新输入的键值连接,使该位密码存入PWING(3DOWNTO0),删除时通过对1111和密码前12位连接,使原来的PWING(15DOWNTO4)移位至PWING(11DOWNTO0),密码设置成功时PWED<=PWING,保存密码,留以输入密码时对比。
(4)点阵显示模块(代码见于源代码部分)
判断三种状态分别在点阵上扫描显示不同的内容(颜色或图案)。
(5)数码管显示模块(代码见于源代码部分)
判断三种状态,开锁状态时数码管不显示,闭锁输入密码或设置密码状态下判断VISIBLE,不可视时判断COUNT值,显示不同位数的“-”,可视时判断COUNT循环扫描当前位数的几位密码。
(6)报警模块(代码见于源代码部分)
但密码错误时ALARM信号置一,直至密码正确时再置为零。
另一进程以ALARM为输入信号,控制LIGHTS和SOUND的报警。
3、仿真波形及波形分析
对于该部分,由于仿真存在的延时以及仿真需要的时间过长,而控制密码锁(设置密码闭锁输入密码等)需要的时间过长,因此对CLK时钟信号做一定调整并适当改变分频比,而后进行分模块的仿真。
(1)分频模块
时钟信号CLK为25MHz,周期40ns。
即可实现任意2N分频。
(2)键值读取模块
为了不用过长的时间仿真,将列扫描信号的频率增大到时钟频率,但由于仿真延时等问题存在,所以仿真结果并不完全准确,但仍可见列信号为扫描输出信号,行信号均为1时,键值为“1111”即15,而当有按键按下时,相应行信号为“0”,即CODEOUT出现了0~9的各种数字,其余时候没有键摁下,键值为“1111”。
(3)点阵显示模块
显示内容为橙色的开锁图标,表示设置密码。
0110000000011000
1001000000100100
1001000000100100
1001000000100100
0011111101111110
0011111101111110
0011111101111110
0011111101111110
开锁状态为绿色的开锁图标,闭锁状态为红色的闭锁图标,同理。
(4)报警模块
当报警信号为“1”时,两只LED灯以DIV(18)的频率轮流闪烁,蜂鸣器以该频率作为间隔发生,而决定声音音高的频率为DIV(14)。
4、源程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityelecpwlockis
port
(
clk,chgpw,lock,visible,ok,clr,rst,del:
instd_logic;--外部端口说明已在上述内容中写过
keyrow:
instd_logic_vector(3downto0);--故此处不再赘述
keycol:
outstd_logic_vector(3downto0);
lights:
outstd_logic_vector(1downto0):
="00";
code:
outstd_logic_vector(3downto0):
="0000";
sound:
outstd_logic:
='0';
discolr,discolg,disrow,showan
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)