EDA数字密码锁的设计.docx
- 文档编号:9132430
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:16
- 大小:150.46KB
EDA数字密码锁的设计.docx
《EDA数字密码锁的设计.docx》由会员分享,可在线阅读,更多相关《EDA数字密码锁的设计.docx(16页珍藏版)》请在冰点文库上搜索。
EDA数字密码锁的设计
第一章概要
1.1背景简介
1.2设计要求:
第二章设计思路
2.1端口定义
2.2总体结构
2.3设计方案
第三章单元电路设计
3.1简述
3.2密码锁输入电路的设计
3.3密码控制电路的设计
3.3.1VHDL源程序
3.3.2仿真波形
3.4密码显示电路的设计
3.4.1密码锁显示电路设计简介
3.4.2VHDL程序
第四章整体组装
4.1VHDL源程序或原理图
4.2整体仿真波形
第五章设计体会
第一章概要
1.1背景简介:
数字密码锁随着电子工业的发展,数字电子技术已经深入到了人们生活的各个层面,而且各种各样的电子产品也正在日新月异地向着高精尖技术发展。
由于电子产品的功能不断增加,使用也越来越方便,有些产品已经成为了人们日常生活中不可缺少的必备物品。
发展历史悠久的机械式门锁,因其功能单一,安全性能较差等缺点,必将被新一代的电子门锁所代替。
新颖的多功能电子门锁,集电子门锁、防盗报警器,门铃等功能于一身,而且还具有定时器呼唤,断电自动报知,显示屋内有无人和自动留言等诸多附加功能。
在未来的生活中,数字密码锁必将在学领域再创新的成绩,将给我们的生活带来更大的便利,前景不可估量。
1.2设计要求
(1).具有密码输入功能;
(2).设计一个密码锁的控制电路,当输入正确代码时,输出开锁信号以推动执行机构工作,用红灯亮、绿灯熄灭表示关锁,用绿灯亮、红灯熄灭表示开锁;
(3).从第一个按钮触动后的5秒内若未将锁打开,则电路自动复位并进入自锁状态,使之无法再打开,并由扬声器发出持续20秒的报警信号。
第二章设计思路
2.1端口定义:
输入:
采样时钟clk;译码输入data[3..0];
输出:
七段数码管驱动q[6..0];数值译码q1[3..0].按键指示key.
2.2总体结构:
(1)显示器
(2)VHDL程序输入
(3)FPGA芯片扬声器
2.3设计方案
密码锁控制器是硬件测试密码锁控制器是硬件与软件的结合。
根据设计要求,决定以FPGA芯片和VHDL语言设计此电子密码锁。
用一片FPGA芯片实现,从而大大简化了系统结构,降低了成本,提高了系统的保密性和可靠性。
这种设计不仅简化了系统结构,降低了成本,更提高了系统的可靠性和保密性。
另外,采用可编程逻辑器件开发的数字系统,方便地升级和改进。
根据系统的设计要求,系统设计采用自顶向下的设计方法。
顶层设计采用原理图的设计方式和系统的整体组装,分别由密码锁输入模块、密码锁控制模块和密码锁显示译码模块等部分组成。
即按照这三个组成模块定义相应的芯片引脚和输入输出的参数。
第三章单元电路设计
3.1简述:
密码锁的内部结构及主要功能
密码锁的内部结构即密码锁控制器由密码锁主体部分和外部指示电路组成。
其中密码锁主要作用是接收输入的密码并进行密码的验证操作;外部指示电路的主要作用是用LED数码管显示输入的密码以及根据密码验证的结果给出不同的LED指示灯和数码管显示;当连续输入三次次错误密码时,启动报警装置,报警装置则采用扬声器。
密码锁控制器的主要功能有:
(1)密码输入:
每按下一个键,要求在数码管上显示,并依次左移。
(2)密码校验:
如果有按键按下,LED1亮起,直到松开该按键;用LED2指示门的状态,也就是密码校验结果,如果密码校验正确,LED2亮起,否则如果密码校验错误LED2闪烁4次,然后熄灭,表明密码错误。
(3)错误报警:
密码输入连续三次错误开始报警。
(4)密码修改:
输入密码正确后5秒内按*号键输入要设置和更改的密码,按#号键确认密码设置与更改,连续输入两次,则密码设置成功。
3.2密码锁输入电路的设计
密码锁输入模块由时序产生电路、键盘扫描电路、键盘译码电路和按键存储电路组成。
通过这几个部分的组成可以将键盘输入的信号有时序的扫描存储而后传入控制模块来控制密码锁的动作。
因此,定义键盘按键的位置和数码的关系如下表所示:
扫描
00
00
00
01
01
01
10
10
10
11
11
11
输出信号
0011
0101
0110
0011
0101
0110
0011
0101
0110
0011
0101
0110
按键号
1
2
3
4
5
6
7
8
9
*
0
#
备注:
扫描位置是CSR[1.0],键盘输出信号SEL[3.2.1.0],按键号即为键盘的位置
密码锁输入电路仿真图如下:
3.3密码锁控制器设计
密码锁控制电路软键盘的实现,通常在一个键盘中使用了一个瞬时接触开关,微处理器可以容易地检测到闭合。
当开关打开时,通过处理器的I/O口的一个上拉电阻提供逻辑1;当开关闭合时,处理器的I/O口的输入将被拉低得到逻辑0。
3.3.1VHDL源程序
libraryieee;
useieee.std_logic_1164.all;
entitydecoderisport(clk:
instd_logic;--译码器元件声明
data:
instd_logic_vector(3downto0);
q:
outstd_logic_vector(6downto0);
q1:
outstd_logic_vector(3downto0));
endentity;
architecturert1ofdecoderis
begin
process(clk,data)
begin
ifrising_edge(clk)
then
casedataiswhen"0000"=>q<="0111111";q1<="0000";
when"0001"=>q<="0000110";q1<="0001";
when"0010"=>q<="1011011";q1<="0010";
when"0011"=>q<="1001111";q1<="0011";
when"0100"=>q<="1100110";q1<="0100";
when"0101"=>q<="1101101";
q1<="0101";
when"0110"=>q<="1111101";q1<="0110";
endif;
endrtl;
3.3.2密码锁控制模块仿真图:
3.4密码显示电路的设计
3.4.1密码锁显示电路设计简介
七段数码管是电子开发过程中常用的输出显示设备。
在本设计中使用的是8个四位一体、共阴极型七段数码管。
由于七段数码管公共端连接到GND(共阴极型)当数码管的中的一个段被输入高电平,则相应的这一段被点亮。
反之则不亮。
共阳极性的数码管与之相反。
四位一体的七段数码管在单个静态数码管的基础上加入了用于选择哪一位数码管的位选信号端口。
八个数码管的a、b、c、d、e、f、g、h、dp都连在了一起,8个数码管分别由各自的位选信号来控制,被选通的数码管显示数据,其余关闭。
在键盘获取到行值和列值以后,组合成一个8位的数据,根据实现不同的编码在对每个按键进行匹配,找到键值后由7段码管显示即可。
3.4.2显示电路的VHDL程序如下:
libraryieee;
useieee.std_logic_1164.all;
entityled_dispis
port(
datain:
instd_logic_vector(3downto0);
dataout:
outstd_logic_vector(7downto0)
);
endled_disp;
architecturertlofled_dispis
begin
process(datain)
begin
casedatainis
when"1010"=>dataout<="11000000";--0
when"0001"=>dataout<="11111001";--1
when"0010"=>dataout<="10100100";--2
when"0011"=>dataout<="10110000";--3
when"0100"=>dataout<="10011001";--4
when"0101"=>dataout<="10010010";--5
when"0110"=>dataout<="10000010";--6
when"0111"=>dataout<="11111000";--7
when"1000"=>dataout<="10000000";--8
when"1001"=>dataout<="10010000";--9
whenothers=>null;
endcase;
endprocess;
endrtl;
第四章整体组装
4.1密码锁整体原理图
VHDL源程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityexp19is
port(Clk:
instd_logic;--时钟信号
Rst:
instd_logic;--复位信号
Kr:
instd_logic_vector(3downto0);--键盘行
Kc:
bufferstd_logic_vector(3downto0);--键盘列
SPK:
outstd_logic;--扬声器输出
KEY_State:
outstd_logic;--按键指示
Display:
outstd_logic_vector(7downto0);--七段码管显示
SEG_SEL:
bufferstd_logic_vector(2downto0));--七段码管片选
endexp19;
architecturebehaveofexp19is
signalkeyr,keyc:
std_logic_vector(3downto0);
signalkcount:
std_logic_vector(2downto0);
signalkflag1,kflag2:
std_logic;
signalbuff1,buff2,buff3,buff4,buff5,buff6:
integerrange0to15;
signalpush_num:
integerrange0to15;--按键次数
signalDisp_Temp:
integerrange0to15;
signalDisp_Decode:
std_logic_vector(7downto0);
signalSEC1,SEC10:
integerrange0to9;
signalClk_Count1:
std_logic_vector(3downto0);--1KHz时钟分频计数器
signalClk_Count2:
std_logic_vector(9downto0);--2Hz时钟分频计数器
signalClk1KHz:
std_logic;
signalClk2Hz:
std_logic;
signalClk1Hz:
std_logic;
signalError_Num:
integerrange0to3;
signalError_Flag:
std_logic;
signalError_Count:
std_logic_vector(2downto0);
signalMusic_Count:
std_logic_vector(2downto0);
begin
process(Clk)
begin
if(Clk'eventandClk='1')
then
if(Clk_Count1<10)
then
Clk_Count1<=Clk_Count1+1;
else
Clk_Count1<="0001";
endif;
endif;
endprocess;
Clk1KHz<=Clk_Count1
(2);
process(Clk1KHz)
begin
if(Clk1KHz'eventandClk1KHz='1')
then
if(Clk_Count2<1000)
then
Clk_Count2<=Clk_Count2+1;
else
Clk_Count2<="0000000001";
endif;
endif;
endprocess;
Clk2Hz<=Clk_Count2(9);
process(Clk2Hz)
begin
if(Clk2Hz'eventandClk2Hz='1')
then
Clk1Hz<=notClk1Hz;
endif;
endprocess;
process(Clk1KHz)--扫描键盘
begin
if(Clk1KHz'eventandClk1KHz='1')
then
if(Kr="1111")
then
kflag1<='0';
kcount<=kcount+1;
if(kcount=0)
then
kc<="1110";
elsif(kcount=1)
then
kc<="1101";
elsif(kcount=2)
then
kc<="1011";
else
kc<="0111";
endif;
else
kflag1<='1';
keyr<=Kr;
keyc<=Kc;
endif;
kflag2<=kflag1;
endif;
endprocess;
KEY_State<=kflag1;
process(Clk1KHz,Rst)--扫描键盘
begin
if(Rst='0')
then
push_num<=0;
elsif(Clk1KHz'eventandClk1KHz='1')
then
if(push_num=6)
then
push_num<=0;
elsif(kflag1='0'andkflag2='1')
then
push_num<=push_num+1;
endif;
endif;
endprocess;
process(Clk2Hz,Rst)
begin
if(Rst='0'orError_Flag<='0')
then
Error_Count<="000";
elsif(Clk2Hz'eventandClk2Hz='1'andError_Flag<='1')then
Error_Count<=Error_Count+1;
endif;
endprocess;
process(Clk)--报警声音分频
begin
if(Clk'eventandClk='1')
then
Music_Count<=Music_Count+1;
endif;
endprocess;
process(Clk)--超出错误次数,开始报警
begin
if(Error_Num>=3)
then
if(Clk1Hz='1')then
SPK<=Music_Count
(2);
else
SPK<=Music_Count
(1);
endif;
endif;
endprocess;
process(Clk1KHz,Rst)--显示右移
begin
if(Rst='0'orpush_num=0)
then--复位时,全灭
buff1<=15;
buff2<=15;
buff3<=15;
buff4<=15;
buff5<=15;
elsif(Clk1KHz'eventandClk1KHz='1')then
if(kflag1='1'andkflag2='0'and(((keyr="1110"orkeyr="1011")andkeyc/="0111")orkeyr="1101"))then
buff1<=buff2;
buff2<=buff3;
buff3<=buff4;
buff4<=buff5;
buff5<=buff6;
endif;
endif;
endprocess;
process(clk,data)
begin
ifrising_edge(clk)
then
casedataiswhen"0000"=>q<="0111111";q1<="0000";
when"0001"=>q<="0000110";q1<="0001";
when"0010"=>q<="1011011";q1<="0010";
when"0011"=>q<="1001111";q1<="0011";
when"0100"=>q<="1100110";q1<="0100";
when"0101"=>q<="1101101";
q1<="0101";
when"0110"=>q<="1111101";q1<="0110";
endif;
endcase;
endprocess;
process(Clk)
begin
if(Clk'eventandClk='1')then--扫描累加
SEG_SEL<=SEG_SEL+1;
Display<=Disp_Decode;
endif;
endprocess;
process(Disp_Temp)--显示转换
begin
caseDisp_Tempis
when"1010"=>dataout<="11000000";--0
when"0001"=>dataout<="11111001";--1
when"0010"=>dataout<="10100100";--2
when"0011"=>dataout<="10110000";--3
when"0100"=>dataout<="10011001";--4
when"0101"=>dataout<="10010010";--5
when"0110"=>dataout<="10000010";--6
when"0111"=>dataout<="11111000";--7
when"1000"=>dataout<="10000000";--8
when"1001"=>dataout<="10010000";--9
whenothers=>null;
endcase;
endprocess;
endbehave;
4.2整体仿真波形图:
第五章设计体会
此次设计中,学到了很多东西,懂得了做任何事情都要认真严谨。
非常感谢XXX老师给我们讲授的EDA。
如果没有她严谨细致、孜孜不倦的讲授精神。
这表示真诚的感谢!
在应用VHDL的过程中让我真正领会到了其并行运行与其他软件(C语言)顺序执行的差别及其在电路设计上的优越性。
用VHDL硬件描述语言的形式来进行数字系统的设计方便灵活,利用EDA软件进行编译优化仿真极大地减少了电路设计时间和可能发生的错误,降低了开发成本,这种设计方法必将在未来的数字系统设计中发挥越来越重要的作用。
2011.11.06
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 数字 密码锁 设计
![提示](https://static.bingdoc.com/images/bang_tan.gif)