可编程器件及数字系统设计实习报告DOCWord格式.docx
《可编程器件及数字系统设计实习报告DOCWord格式.docx》由会员分享,可在线阅读,更多相关《可编程器件及数字系统设计实习报告DOCWord格式.docx(10页珍藏版)》请在冰豆网上搜索。
二、设计方案
电子密码锁,主要由三部分组成:
密码输入电路、密码锁控制电路和密码锁显示电路。
作为电子密码锁的输入电路,可选用的方案有拨码与按键来控制输入和触摸式键盘输入等多种。
拨码与按键和触摸式2*4键盘相比简单方便而且成本低,构成的电路简单,本设计中采用拨码与按键来作为该设计的输入设备。
数字电子密码锁的显示信息电路可采用LED数码显示管和液晶屏显示两种。
液晶显示具有高速显示、可靠性高、易于扩展和升级的特点,但是普通的液晶存在亮度低、对复杂环境适应能力差的特点,但是在本设计中任意使用LED数码管。
根据以上选定的输入设备与与显示器件,并考虑到现实各项密码锁功能的具体要求,与系统的设计要求,系统设计采用自顶向下的设计方案。
整个密码锁系统的总体总体框图如图1.1所示。
输入模块
寄存器与清零信号发生电路
数值比较器
LED灯
扫描电路
六选一选择器
开/关锁电路
控制模块
显示模块
图1.1电子密码锁系统总体框图
三、设计实现
1、密码锁的显示模块
七段数码管是电子开发过程中常用的输出显示设备。
在本设计中使用的是8个四位一体、共阳极型七段数码管。
由于七段数码管公共端连接到GND(共阴极型),当数码管的中的一个段被输入高电平,则相应的这一段被点亮。
反之则不亮。
共阳极性的数码管与之相反。
四位一体的七段数码管在单个静态数码管的基础上加入了用于选择哪一位数码管的位选信号端口。
八个数码管的a、b、c、d、e、f、g、h、dp都连在了一起,8个数码管分别由各自的位选信号来控制,被选通的数码管显示数据,其余关闭。
2、密码锁控制模块
该模块的作用是将输入的密码(暂时寄存于
ACC中)跟已经存储的密码(REG中的密码信息)进行对比,如果一样,则密码锁开锁。
而在通过密码验证后可以按按键设定密码。
在这里值得注意的是有一个密码“000000”为开始密码,如果改名密码了但是又忘记了密码,重新下载之后的初始密码只要输入的密码为“000000”则都可通过密码锁。
“当输入代码的位数和位值与锁内给定的密码一致
且按规定程序开锁时
方可开锁
并点亮开锁指示灯(緑灯)亮。
否则
系统进入
“错误”状态
并发出报警信号。
串行数字锁的报警方式是点亮指示灯(红灯)。
该6位串行电子密码锁设置6位二进制密码
要求锁内给定的密码是可调的
且设置方便
保密性好。
其具体操作分为输入密码和修改密码两部分。
2.1输入密码
密码输入值的比较主要有两部分
密码位数和内容
任何一个条件不满足
都不能打开锁。
若锁内密码为
“000000”
key2和key1置低电平
分别表示输入
“1”
和
“0”
。
输入密码时按着从密码最低位到最高位的顺序依次正确输入000000,会在数码管逐一显示。
经检验
输入的密码等于锁内预先设置的密码密码锁开启信号,锁开启。
同时,密码修改控制信号ctrl置低电平。
若在输入密码的过程中
6位二进制密码出现输入错误
那么锁不能开启
同时
指示灯红灯亮
2.2修改密码
为防止任意进行密码修改
必须在正确输入密码后
才能重新设置密码。
输入正确密码后
锁打开
密码修改控制信号按键ctrl置低电平
就可直接进行修改密码的操作。
修改密码实质就是用输入的新密码去取代原来的旧密码,按确定按键ok存储新密码。
四、实验结果及分析
这次密码锁的设计过程表明,用VHDL可以快速、灵活地设计出符合要求的密码锁控制器,而且操作简单。
可以实现密码输入、密码校验、密码设置和更改等功能。
设计过程能够在设计完成后在QuartusⅡ环境下进行电路的模拟仿真,反馈结果可以验证程序设计的可行性与可靠性。
本密码锁控制器设置的是6位密码,在系统复位后,输入一个完整的密码串,输入完后,系统会进行比对,如果发现密码吻合,则开门,否则要求用户继续输入,如果输入的密码串都是错误的,则系统报警,直到输入正确的密码,报警停止。
这样的设计可以很好的满足人们的日常需求。
同时,密码锁还具有密码修改功能,方便操作,使得密码锁的使用更加安全、便捷。
五、实习总结
历时四周的可编程逻辑器件及数字系统设计终于结束。
实习过程中,无论在电路板焊接、软硬件设计还是仿真过程中我都遇到不少问题。
其中经常遇到的问题就是VHDL编程问题,有时候经过几天呕心沥血编出来的程序依然会出现各种各样的阻碍,无论如何修改编译都无法通过,搞得自己连续几天都特别失落。
当然如果修改成功还是会特别的高兴。
可以说,四周的实习是苦远远大于甜。
其实归根结底都是我对VHDL语言的掌握不够扎实,才导致每次编译都不能顺利通过。
以后我会在这方面多花一些时间。
在这段时间里我所获得的成功除了自己思考设计取得之外,与同学的同心协力的合作与讨论是分不开的。
相互的探讨使得我们的思路更加开阔,解决问题的办法也更多。
总之,此次实习让我收益良多,同时因为有了实践操作,对《数字电路与逻辑设计》课程所学内容也有了更深的记忆和理解,对EDA技术能够更好的掌握和应用,也让我及时发现了自身的不足。
从中懂得了理论知识与实践有机结合的重要性,谢谢学院为我们提供这样珍贵的实习机会!
六、附录(程序或电路图)
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entitymimais
port(clk,clr,sure,ctrl:
instd_logic;
fmq:
outstd_logic;
green,red:
bufferstd_logic;
seg:
outstd_logic_vector(6downto0);
com:
outstd_logic_vector(5downto0);
keyl:
instd_logic_vector(3downto0);
keyh:
bufferstd_logic_vector(1downto0));
endmima;
architectureasofmimais
typestateis(s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11);
signals:
state;
signaln:
std_logic_vector(3downto0);
signalclk1:
std_logic;
signalq:
integerrange0to1;
signalq1:
integerrange0to5;
signalq2:
integerrange0to20480;
signalw0,w1,w2,w3,w4,w5,z0,z1,z2,z3,z4,z5,b,c:
std_logic_vector(5downto0);
begin
b<
=keyh&
keyl;
process(clk)
begin
if(clk'
eventandclk='
1'
)then
q1<
=q1+1;
ifq2<
20480then
q2<
=q2+1;
else
=0;
endif;
endif;
endprocess;
clk1<
='
whenq2=0else
'
0'
;
process(clk1)
ifclk1'
eventandclk1='
then
casesis
whens0=>
if(m<
"
1111"
)thens<
=s1;
elses<
=s0;
whens1=>
=s2;
whens2=>
=s3;
whens3=>
=s4;
whens4=>
=s5;
whens5=>
=s6;
whens6=>
=s7;
whens7=>
=s8;
whens8=>
=s9;
whens9=>
=s10;
whens10=>
=s11;
whens11=>
whenothers=>
s<
endcase;
endprocess;
n<
=mwhens=s11else
"
ifclk'
ifkeyl<
q<
=q;
else
=q+1;
endif;
endif;
keyh<
="
01"
whenq=0else
10"
ifclr='
if(s=s10andb="
010111"
)or(s=s10andb="
011011"
)or(s=s10andb="
011101"
)
or(s=s10andb="
011110"
100111"
101011"
101101"
101110"
ifctrl='
w0<
=b;
w1<
=w0;
w2<
=w1;
w3<
=w2;
w4<
=w3;
w5<
=w4;
elsifctrl='
z0<
z1<
=z0;
z2<
=z1;
z3<
=z2;
z4<
=z3;
z5<
=z4;
else
z0<
000000"
withq1select
com<
100000"
when0,
010000"
when1,
001000"
when2,
000100"
when3,
000010"
when4,
000001"
when5,
whenothers;
c<
=w0whenq1=5andctrl='
w1whenq1=4andctrl='
w2whenq1=3andctrl='
w3whenq1=2andctrl='
w4whenq1=1andctrl='
w5whenq1=0andctrl='
z0whenq1=5andctrl='
z1whenq1=4andctrl='
z2whenq1=3andctrl='
z3whenq1=2andctrl='
z4whenq1=1andctrl='
z5whenq1=0andctrl='
c;
seg<
1111001"
whenc="
0100100"
0110000"
0011001"
0010010"
0000010"
1111000"
0000000"
1000000"
green<
when(z0=w0andz1=w1andz2=w2andz3=w3andz4=w4and
z5=w5andctrl='
andsure='
)else
red<
whengreen='
andsure='
fmq<
endas;