EDA课程设计电子密码锁.docx
《EDA课程设计电子密码锁.docx》由会员分享,可在线阅读,更多相关《EDA课程设计电子密码锁.docx(17页珍藏版)》请在冰点文库上搜索。
EDA课程设计电子密码锁
课程设计(论文)任务书
电气与电子工程学 院 电子信息工程专 业2021-1 班
一、课程设计(论文)题目电子密码锁二
二、课程设计(论文)工作自2021年1月5日起至2021年1月16日止。
三、课程设计(论文)地点:
电子测控实验室
四、课程设计(论文)内容要求:
课程设计任务:
1.具有上锁键和开锁键,每次上锁之前要先按上锁键,然后自设密码〔3位〕,开锁时要先按开锁键,然后输入上锁时设定的密码开锁;
2.用led灯亮灭代表开锁和上锁;
3.密码错误报警并锁定电子锁;
2〕课程设计论文编写要求
〔1〕课程设计任务及要求
〔2〕总体电路设计
〔3〕模块设计---给出各个模块的详细设计思路
〔4〕管脚绑定---列表或截图给出管脚绑定情况
〔5〕仿真及FPGA开发板调试---给出运行仿真波形截图,分析运行结果。
〔6〕设计体会与小结---设计遇到的问题及解决方法,通过设计学到了哪些新知识,
稳固了哪些知识,有哪些提高。
〔7〕参考文献〔必须按标准格式列出,可参考教材后面的参考文献格式〕
〔8〕报告按规定排版打印,要求装订平整,否那么要求返工;
〔9〕课设报告的装订顺序如下:
封面---任务书---中文摘要---目录----正文---附录
(代码及相关图片)
〔10〕严禁抄袭,如有发现,按不及格处理。
3〕课程设计评分标准:
〔1〕学习态度:
10分;
〔2〕系统设计:
20分;
〔3〕代码调试:
20分;
〔4〕答复以下问题:
20分;
〔5〕论文撰写:
30分。
4〕课程设计进度安排
进度安排:
本设计持续10天,其中最后一天为辩论时间。
第1-2天:
讲解题目,准备参考资料,检查、调试实验软硬件,进入设计环境,开场
设计方案和验证方案的准备;
第3-4天:
完成设计与验证方案,经指导教师验收后进入模块电路设计;
第5-7天:
完成模块电路设计,进展代码输入,并完成代码的初步仿真;
第8-9天:
代码功能仿真正确,约束设计,综合、下载,实现设计目标,并指导教师
验收设计;整理设计资料,撰写报告、准备辩论;
第10天:
验收合格后进展辩论。
学生签名:
2021年1月5日
课程设计(论文)评审意见
〔1〕学习态度〔10分〕:
优〔 〕、良〔 〕、中〔 〕、一般〔 〕、差〔 〕;
〔2〕系统设计〔20分〕:
优〔〕、良〔 〕、中〔 〕、一般〔 〕、差〔 〕;
〔3〕代码调试〔20分〕:
优〔 〕、良〔 〕、中〔 〕、一般〔 〕、差〔 〕;
〔4〕答复以下问题〔20分〕:
优〔 〕、良〔 〕、中〔 〕、一般〔 〕、差〔 〕;
〔5〕论文撰写〔30分〕:
优〔 〕、良〔 〕、中〔 〕、一般〔 〕、差〔 〕;
评阅人:
职称:
2021年1月17日
中文摘要
作为最方便最经济的,当属应用编程方法实现电子密码锁。
无论C语言还是c++,也无论是java还是VHDL,编程的思路大致一样。
利用所学到的知识VHDL,在这我将设计一个具有较低本钱的电子密码锁,本课设报告讲述了我整个设计过程及收获。
本密码锁在上锁开关为1,开锁开关为0时进入上锁状态,此时上锁状态指示灯亮,在三个开关上输入三个初始密码,此时上锁成功指示灯亮,当上锁开关为0,开锁开关为1时进入开锁状态,此时开锁状态指示灯亮,在三个开关上输入三个开锁密码,如果这三个开锁密码与三个初始密码一样那么开锁成功指示灯亮,并且蜂鸣器不报警,如果这三个开锁密码与三个初始密码不一样那么开锁成功指示灯不亮,并且蜂鸣器报警。
由于电路板所提供的开关个数只有八个,所以上锁用去三个,开锁用去三个,剩下两个用作使能端刚好用完,所以所有密码组合情况只有八种情况,如果开关个数能再多点,那么可以设计密码更复杂的电子密码锁,但根本原理都是一样的,所以在此仅以三位的密码为例进展设计。
摘要:
电子密码锁上锁状态开锁状态三位密码
目 录
一、课程设计任务及要求
本次课程设计共有27个题目,其中有两个都是电子密码锁的设计,但两者的要求是不同的,这里讲的是第二个题目,可称作为"电子密码锁二〞。
电子密码锁二
1.具有上锁键和开锁键,每次上锁之前要先按上锁键,然后自设密码〔3位〕,开锁时要先按开锁键,然后输入上锁时设定的密码开锁
2.用led灯亮灭代表开锁和上锁
3.密码错误报警并锁定电子锁
二、总体电路设计
本次电子密码锁的设计,开场时在与几个同学的讨论中和自己的综合考虑下,前前后后尝试着应用了多种方法,各个模块都尝试过,可谓是一波三折,比方在上锁模块最先是想调用数据存储器RAM或者ROM的,但是一来本次课设所要存储的数据很少,有点大材小用的感觉,二来它们还要编写初始文件〔以.mif或者.hex结尾的初始文件〕,感觉都不是太理想,当然也尝试过几次,中间出了很多问题:
初始文件不会写,时序分析比较发杂等等,后来又和同学讨论试图用电平触发型的存放器,但不知怎么的在时序分析时控制它的输出总是会出现延迟,本来是在使能端enable="10〞时把输入付给输出,但它总在enable变化至下一个状态时才输出,这个问题询问了教师同学都没有解决,后来换成D触发器,所以这个问题现在也没搞懂。
经过很屡次尝试都不起作用后,后来终于想起所学过的D触发器也有记忆的功能,才得以解决这个问题。
另外在比较模块,本来很简单的逻辑却在与同学的讨论中想复杂了,要用状态机,也尝试过很屡次,出现了好多莫名其妙的问题,程序之类的都没错,可是编译时却总是报错,后来又与同学讨论,终于用最简单的逻辑解决了。
其实这个课设任务也不是太难,就是密码存储和比较两个功能,其他的都很简单,就是LED的控制和蜂鸣器的控制,所以本课设分成三个模块就可以搞定:
第一个是存储模块即后面的上锁模块,像上面所说的用D触发器来实现,第二个是比较模块即开锁模块,一个if语句就能搞定,最后是密码输入正确与否以及蜂鸣器的控制,很简单,不在话下,具体框图如下所示:
图2-1设计流程
三、模块设计
1.密码存储〔上锁〕模块
如前所述,本局部本来想用数据存储器RAM或ROM,或者是存放器,但出现了很多问题,所以最后采用D触发器,下面简单介绍一下D触发器及其工作原理。
〔1〕.D触发器的VHDL描述
如上所述,D触发器只有在时钟上升沿到来时,并且使能端允许上升沿有效时,把输入付给输出,而且是把上升沿到来的前一个时刻的输入付给输出,假设不在时钟上升沿或者使能端不允许上升沿有效,那么后来的输入不能付给输出,换句话说,输出不再随输入的变化而变化,从而到达数据存储的目的,当然这样的存储是要在不断电的情况下才能存储。
D触发器的VHDL描述语句为〔假设使能端为enable,〞10〞有效〕:
ifclk’eventandclk=’1’then
Ifenable="10〞then
Dout<=din;
Endif;
endif;
上述语句便是一个D触发器的VHDL描述,用不完整的if语句if....endif实现,注意到该语句只提到在满足上升沿并且上升沿有效时把输入din付给输出dout,并没说在其他情况下输入和输出间的关系,VHDL规定其他情况是保持状态,即在满足前述条件时原来输入给输出的是‘1’,那么在不满足时输出就是‘1’,原来输入给输出的是‘0’,那么在不满足时输出就是‘0’;正是由于这个规定,使D触发器具有了数据存储的功能。
〔2〕.模块说明
本模块正是利用了D触发器的上述优点,才得以解决燃眉之急。
本模块例化的电路图和时序图如下
图3-1上锁模块的原理图
图3-2上锁模块的时序图
本模块还有一点值得注意的是,鉴于对满足课设要求和对所有模块的控制,采用了语句
Enable<=shangsuo&kaisuo;
即把两个使能端shangsuo和kaisuo并置起来付给enable,假设shangsuo和kaisuo分别为‘1’和‘0’,那么enable就是"10〞;以此类推。
如电路图所示,led1是上锁状态的指示灯,led2是上锁成功的指示灯,在默认密码"000〞下led2不会亮,只有在其他值时才会亮。
如时序图所示,只有在shangsuo=’1’并且kaisuo=’0’时即enable="10〞时,而且时钟上升沿时把输入值110付给输出,在此之前输出值一直是默认值000,之后保持110不变;当enable="10〞时led1=1,其他情况为0,实现了上锁状态的指示功能,当输出为110时led2为1,其他情况为0,实现了上锁成功的指示功能。
可见采用D触发器作为少量数据存储的器件是很有用的,而且这个时钟clk可以直接挂在任何频率上,只要有上升沿即可,不需分频进程。
2.密码比较〔开锁〕模块
这个模块开场想用状态机,但出现了很多错误,经过慎重考虑,直接采用了一个if语句,所以变得相对简单,主要就是再输入一个三位数,与前个模块送来的三个初始密码进展比较看是否一样,一样那么输出111,不同那么输出000,供下一个模块检测用。
它的模块电路图与时序图如下所示:
图3-3开锁模块的原理图
图3-4开锁模块的时序图
如上电路图所示,本模块仍然由shangsuo和kaisuo两个控制端所控制,依旧把它们并置起来给enable,并且为了与密码存储模块所区分,本模块用enable="01〞有效来控制,dout0端口是前个模块的输出,本模块有效时它上面的三个位线电平不再变化,din1和dout1是本模块的输入和输出,输入作为开锁时的密码输入,也是三位,输出取值为000或者111,给下一个模块控制之用,led1在enable="01〞时点亮,指示开锁状态其他情况为0。
如时序图所示只有在shangsuo=’0’并且kaisuo=’1’即enable="01〞时才开启比较功能,如假设dout0=din1那么dout1=111,其他情况dout1都为默认值000,led1在shangsuo=’0’且kaisuo=’1’时为‘1’,其他情况为0,这在逻辑上都是正确的。
3.控制模块
本模块的功能主要是开锁成功后的电路现象呈现,本可以完全并入开锁模块,但课设有严格篇幅要求,所以还是保存了下来,以供充实课设篇幅长度。
下面是它的电路图和时序图:
图3-5控制模块的原理图
图3-6控制模块的时序图
在电路图中,可见仍然有shangsuo和kaisuo使能端,仍然用enable="01〞有效来控制,dout1是前个模块的输出端口,q是控制开锁成功的led灯的亮灭,当dout1=〞111〞时为1,其他情况为0,p是蜂鸣器的控制端口,与q的值相反,即控制开锁成功为0,其他情况下为1,注意是在enable="01〞时本模块有效,即在此情况下的其他情况下p=1。
由时序图也可看出,在enable="01〞情况下p和q的相反的关系,在此情况下当dout1为111时q为1,其他情况为0,而当dout1为111时p为0,其他情况为1.所以逻辑上也是对的。
四、管脚绑定
在上述根底理论已经搭建好,各模块都已经分析仿真完成的情况下,把它们连接起来便形成了总的电路原理图,总电路图见第五个局部。
以下图是总电路图的管脚绑定图,
图4-1总电路管脚绑定图
五.仿真及FPGA开发板调试
以下图是最终把各个模块连接好后的电路原理图,可见三个模块的使能端都是shangsuo和kaisuo两个端口,在统一的命令要求下易于管理和下达命令,各施其责,到达既定功能的实现。
在shangsuo[上锁]为1,kaisuo[开锁]开关为0时进入上锁状态,shangsuo模块起作用,后两个模块不起作用,此时shangsuozhuangtai[上锁状态]所控制的指示灯亮,在shangsuoshuru[上锁输入]输入三个初始密码,在shizhong[时钟]上升沿到来时把三个初始密码付给dout0[2..0],此时shangsuochenggong[上锁成功]指示灯亮,当shangsuo[上锁]开关为0,kaisuo[开锁]开关为1时进入开锁状态,shangsuo模块不起作用,后两个模块起作用,此时kaisuozhuangtai[开锁状态]所控制的指示灯亮,在kaisuoshuru[开锁输入]三个开关上输入三个开锁密码,如果这三个开锁密码与三个初始密码一样那么kaisuochenggong[开锁成功]指示灯亮,并且fengmingqi[蜂鸣器]不报警,如果这三个开锁密码与三个初始密码不一样那么开锁成功指示灯不亮,并且蜂鸣器报警。
本局部的具体电路板功能已经向教师展示过,确定是对的。
图5-1总电路原理图
五、设计体会与小结
为期两周的EDA课程设计就这样完毕了,其中一波三折,苦乐交织,不胜感慨。
在与同学的讨论中,得到了不同的指点,获得了很多灵感,这正是这一次课设最大的收获。
而这种灵感的获得,重中之重正是自己要有足够的根底知识去支撑着,否那么别人说的再多灵感也会插肩而过。
虽然这只是一次课设,但无论课设还是科研还是编程,合作或者咨询或者讨论是度过难关的不二法门,也许自己煞费苦心也过不去的槛,别人一句话你就过去了,这是一种高端的过程,也是很难享受到的过程,特别是在他们的帮助下逻辑推理在心海中如汪洋大海一般狂扫过时,原来世间的一切都是可以这样的去实现。
合作让我知晓取人之长补己之短的深刻道理,让我可以取纳不同人的意见综合起来起来为我所用,让我明白车到山前必有路!
但在此过程中也要注意别人的想法固然可贵,也不能拘泥于他们,比方这次课设在数据存储局部,同学提议用RAM或者ROM,结果在尝试初始文件的编写时总是出问题,后来他们又建议用存放器,我就一直用存放器,结果搞了一天都没有成效,最后是冲破了他们的提议,自己选择了D触发器才得以越过去。
而在数据比较模块,最开场他们提议的状态机个人当时也觉得很合理的,结果尝试了也失败了。
最后一个同学说可以不用状态机,才想到了可以删繁就简直接实现的。
这次课设翻开了我设计的大门,也是自己一个学期以来所学知识的全面应用。
实践是检验真理的唯一标准,付诸实践时才发现我们所学到的知识是多么的皮毛和浅薄!
教师曾经说过一句让我很受震撼的话"真正优秀的代码编写员,不在于用到了多少常人不常用的生僻的语句去实现所要满足的功能,而是要用最简短的代码去实现所要满足的功能〞,这一次的课设,从删繁就简的角度去考虑,也是这一谆谆教导的具体实践!
也许以后自己会踏上编程的康庄大道,多年以后想起这次课程设计,又会有怎样的感慨呢...
2021年1月15日
于华东交大
六.参考文献
番松,黄继业.EDA技术与VHDL[M].:
清华大学,2021年4月
周金富.VHDL与EDA技术入门速成[M].:
人民邮电,2021年6月
杨健.EDA技术与VHDL根底[M].:
清华大学,2021年3月
雷伏容,李俊,尹霞.EDA技术与VHDL程序开发根底教程[M].清华大学,2021年5月
七.附录:
上锁:
RTL:
libraryieee;
useieee.std_logic_1164.all;
entityshangsuois
port(din0:
instd_logic_vector(2downto0);
shangsuo,kaisuo,clk:
instd_logic;
led1,led2:
outstd_logic;
dout0:
outstd_logic_vector(2downto0)
);
end;
architectureAofshangsuois
signaltemp:
std_logic_vector(2downto0):
="000";
signalenable:
std_logic_vector(1downto0);
begin
enable<=shangsuo&kaisuo;
process(shangsuo,clk,kaisuo)--D触发器的VHDL描述
begin
ifclk'eventandclk='1'then
ifenable="10"then
temp<=din0;
endif;
else
null;
endif;
endprocess;
dout0<=temp;
led1<='1'whenenable="10"else'0';---上锁状态指示灯
led2<='0'whentemp="000"else'1';--上锁成功指示灯
end;
TESTBENCH:
libraryieee;
useieee.std_logic_1164.all;
entityshangsuo_tbis
end;
architectureAOFshangsuo_tbis
signaldin1,dout1:
std_logic_vector(2downto0);
signalshangsuo1,kaisuo1,clk,led1,led2:
std_logic;
ponentshangsuois
port(din0:
instd_logic_vector(2downto0);
shangsuo:
instd_logic;
kaisuo:
instd_logic;
clk:
instd_logic;
led1,led2:
outstd_logic;
dout0:
outstd_logic_vector(2downto0)
);
endponent;
begin
U1:
shangsuoportmap(din0=>din1,dout0=>dout1,shangsuo=>shangsuo1,kaisuo=>kaisuo1,clk=>clk,led1=>led1,led2=>led2);
process
begin
clk<='0';waitfor10ms;
clk<='1';waitfor10ms;
endprocess;
shangsuo1<='0','1'after10ms,'0'after30ms,'1'after40ms,'0'after50ms,'1'after60ms,'1'after70ms,'0'after80ms;
kaisuo1<='0','1'after10ms,'0'after20ms,'1'after30ms,'0'after40ms,'1'after50ms,'0'after60ms,'0'after70ms;
din1<="100","011"after10ms,"111"after20ms,"101"after30ms,"000"after40ms,"110"after50ms,"000"after60ms,"110"after70ms,"111"after80ms,"101"after90ms;
end;
图8-1上锁原理图
图8-2上锁时序图
开锁:
RTL:
libraryieee;
useieee.std_logic_1164.all;
entitykaisuois
port(dout0:
instd_logic_vector(2downto0);
shangsuo,kaisuo:
instd_logic;
din1:
instd_logic_vector(2downto0);
led1:
outstd_logic;
dout1:
outstd_logic_vector(2downto0));
end;
architectureAofkaisuois
signaltemp:
std_logic_vector(2downto0):
="000";
signalenable:
std_logic_vector(1downto0);
begin
enable<=shangsuo&kaisuo;
process(dout0,din1,shangsuo,kaisuo)--两个输入的比较局部
begin
ifenable="01"then
ifdout0=din1then
temp<="111";
else
temp<="000";
endif;
else
null;
endif;
endprocess;
dout1<=temp;
led1<='1'whenenable="01"else'0';--开锁状态指示灯
end;
TESTBENCH:
libraryieee;
useieee.std_logic_1164.all;
entitykaisuo_tbis
end;
architectureAofkaisuo_tbis
signaldout0:
std_logic_vector(2downto0);
signaldin1:
std_logic_vector(2downto0);
signaldout1:
std_logic_vector(2downto0);
signalshangsuo1,kaisuo1:
std_logic;
Signalled1:
std_logic;
ponentkaisuois
port(dout0:
instd_logic_vector(2downto0);
Led1:
outstd_logic;
shangsuo,kaisuo:
instd_logic;
din1:
instd_logic_vector(2downto0);
dout1:
outstd_logic_vector(2downto0));
endponent;
begin
u1:
kaisuoportmap(dout0=>dout0,dout1=>dout1,din1=>din1,shangsuo=>shangsuo1,kaisuo=>kaisuo1,led1=>led1);
dout0<="000","001"after5us,"010"after10us,"011"after15us,"100"after20us,"101"after25us,"110"after30us,"111"after35us;
din1<="111","110"after5us,"101"after10us,"011"after15us,"011"after20us,"101"after25us,"001"after30us,"000"after35us;
shangsuo1<='0','1'after10us,'0'after20us,'1'after30us;
kaisuo1<='1','0'after10us,'1'after20us,'0'after30us;
end;
图8-3开锁时序图
图8-4开锁原理图
控制:
RTL:
libraryieee;
useieee.std_logic_1164.all;
entitykongzhiis
port(dout1:
instd_logic_vector(2downto0);
shangsuo,kaisuo:
instd_logic;
q,p:
outstd_logic);
end;
architectureAofkongzhiis
signalenable:
std_logic_vect