EDA电子密码锁设计.docx

上传人:b****5 文档编号:4571306 上传时间:2022-12-06 格式:DOCX 页数:12 大小:257.73KB
下载 相关 举报
EDA电子密码锁设计.docx_第1页
第1页 / 共12页
EDA电子密码锁设计.docx_第2页
第2页 / 共12页
EDA电子密码锁设计.docx_第3页
第3页 / 共12页
EDA电子密码锁设计.docx_第4页
第4页 / 共12页
EDA电子密码锁设计.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

EDA电子密码锁设计.docx

《EDA电子密码锁设计.docx》由会员分享,可在线阅读,更多相关《EDA电子密码锁设计.docx(12页珍藏版)》请在冰豆网上搜索。

EDA电子密码锁设计.docx

EDA电子密码锁设计

 

XXX大学

 

EDA综合设计报告

 

班级2XX级自动化一班

姓名XXX

学号XX

日期20XX年X月

 

设计题目

电子密码锁设计

姓名

XX

班级

一班

学号

XX

同组人

XX

小组分工

XX:

实现方案的设计

XXX:

程序的设计

设计思路

根据设计要求,可以确定所需要的功能,可以分为三个方面,一是输入方面,二是控制方面,三是显示方面的需求。

所以初步决定利用三个模块完成相关功能。

同时,模块化的编程方式利于后期调试。

输入模块:

根据设计要求,使用到时序产生电路,弹跳消除电路,及键盘扫描电路来共同组成。

控制模块:

包括按键数据的缓冲存储,密码的清除、更改、存储、激活电锁电路(产生寄存器清除信号),密码核对(数值比较),解锁电路(开/关门锁)等几个功能。

显示模块:

主要是实现七段数码管显示电路,将待显示数据的BCD码转换成数码器的七段显示驱动编码

设计过程

一、实验方案:

分层次方案设计及代码描述

1输入模块

(1)时序产生电路

本时序产生电路中使用了三种不同频率的工作脉冲波形:

系统时钟脉冲(它是系统内部所有时钟脉冲的源头,且其频率最高)、键盘扫描信号。

(2)键盘扫描电路

扫描电路的作用是用来提供键盘扫描信号(表4.1中的KY3~KY0)的,扫描信号变化的顺序依次为1110-1101-1011-0111-1110......依序地周而复始。

2控制模块

密码锁的控制模块是其整个设计的核心部分,依靠其进行密码锁的基本功能。

如,设置密码,重置密码,开锁,上锁等等。

(1)数字按键输入的响应控制

A、如果按下数字键,第一个数字会从显示器的最右端开始显示,此后每新按一个数字时,显示器上的数字必须左移一格,以便将新的数字显示出来。

B、假如要更改输入的数字,可以按倒退按键来清除前一个输入的数字,或者按清除键清除所有输入的数字,再重新输入四位数。

C、由于这里设计的是一个四位的电子密码锁,所以当输入的数字键超过四个时,电路不予理会,而且不再显示第四个以后的数字。

(2)功能按键输入的响应控制

清除键:

清除所有的输入数字,即做归零动作。

激活电锁键:

按下此键时可将密码锁的门上锁。

(上锁前必须预先设定一个四位的数字密码。

解除电锁键:

按下此键会检查输入的密码是否正确,若密码正确无误则开门。

3显示模块

密码显示电路主要将显示数据的BCD码转换成相对应的编码。

这里直接采用四个4-7译码器来实现。

二、各模块程序

密码锁输入模块

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYSRIS

PORT(CLK_1K:

INSTD_LOGIC;

KEY_IN:

INSTD_LOGIC_VECTOR(2DOWNTO0);

DATA_N:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

DATA_F:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

FLAG_N:

OUTSTD_LOGIC;

FLAG_F:

OUTSTD_LOGIC;

CQD:

OUTSTD_LOGIC;

KSEL:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

CSR:

OUTSTD_LOGIC_VECTOR(1DOWNTO0));

ENDSR;

ARCHITECTUREONEOFSRIS

SIGNALC_QD:

STD_LOGIC;

SIGNALC_SR:

STD_LOGIC_VECTOR(1DOWNTO0);

SIGNALN,F:

STD_LOGIC_VECTOR(3DOWNTO0);

SIGNALFN,FF:

STD_LOGIC;

SIGNALSEL:

STD_LOGIC_VECTOR(3DOWNTO0);

SIGNALQ:

STD_LOGIC_VECTOR(5DOWNTO0);

SIGNALC:

STD_LOGIC_VECTOR(2DOWNTO0);

BEGIN

DATA_N<=N;

DATA_F<=F;

FLAG_N<=FN;

FLAG_F<=FF;

CQD<=C_QD;

CSR<=C_SR;

KSEL<=SEL;

C(0)<=KEY_IN(0);

C

(1)<=KEY_IN

(1);

C

(2)<=KEY_IN

(2);

COUNTER:

BLOCKIS

BEGIN

PROCESS(CLK_1K)IS

BEGIN

IF(CLK_1K'EVENTANDCLK_1K='1')THENQ<=Q+1;

ENDIF;

C_QD<=Q(3);

C_SR<=Q(5DOWNTO4);

ENDPROCESS;

SEL<="1110"WHENC_SR=0ELSE

"1101"WHENC_SR=1ELSE

"1011"WHENC_SR=2ELSE

"0111"WHENC_SR=3ELSE

"1111";

ENDBLOCKCOUNTER;

KEY_DECODER:

BLOCK

SIGNALZ:

STD_LOGIC_VECTOR(4DOWNTO0);

BEGIN

PROCESS(C_QD)

BEGIN

Z<=C_SR&C;

IF(C_QD'EVENTANDC_QD='1')THEN

CASEZIS

WHEN"11101"=>N<="0000";

WHEN"00011"=>N<="0001";

WHEN"00101"=>N<="0010";

WHEN"00110"=>N<="0011";

WHEN"01011"=>N<="0100";

WHEN"01101"=>N<="0101";

WHEN"01110"=>N<="0110";

WHEN"10011"=>N<="0111";

WHEN"10101"=>N<="1000";

WHEN"10110"=>N<="1001";

WHENOTHERS=>N<="1111";

ENDCASE;

ENDIF;

IFC_QD'EVENTANDC_QD='1'THEN

CASEZIS

WHEN"11011"=>F<="0100";

WHEN"11110"=>F<="0001";

WHENOTHERS=>F<="1000";

ENDCASE;

ENDIF;

ENDPROCESS;

FN<=NOT(N(3)ANDN

(2)ANDN

(1)ANDN(0));

FF<=F

(2)ORF(0);

ENDBLOCKKEY_DECODER;

ENDARCHITECTUREONE;

密码锁控制模块

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYCTRLIS

PORT(DATA_N:

INSTD_LOGIC_VECTOR(3DOWNTO0);

DATA_F:

INSTD_LOGIC_VECTOR(3DOWNTO0);

FLAG_N:

INSTD_LOGIC;

FLAG_F:

INSTD_LOGIC;

MIMAIN:

BUFFERSTD_LOGIC;

SETIN:

BUFFERSTD_LOGIC;

OLD:

BUFFERSTD_LOGIC;

CQD:

INSTD_LOGIC;

ENLOCK:

OUTSTD_LOGIC;

DATA_BCD:

OUTSTD_LOGIC_VECTOR(15DOWNTO0));

ENDENTITYCTRL;

ARCHITECTUREONEOFCTRLIS

SIGNALACC,REG:

STD_LOGIC_VECTOR(15DOWNTO0);

BEGIN

PROCESS(CQD,FLAG_F)IS

BEGIN

IFCQD'EVENTANDCQD='0'THEN

IFFLAG_F='1'THEN

IF(DATA_F="0100")THEN

ACC<="1111111111111111";

MIMAIN<='0';SETIN<='0';OLD<='0';

ELSIF(DATA_F="0001")THEN

IF(MIMAIN='0'ANDSETIN='0')THEN

CASEACC(7DOWNTO0)IS

WHEN"00010001"=>ENLOCK<='1';

WHEN"10011001"=>MIMAIN<='1';ACC<="1111111111111111";

WHEN"01010101"=>SETIN<='1';ACC<="1111111111111111";

OLD<='1';

WHENOTHERS=>NULL;

ENDCASE;

ELSIF(MIMAIN='1')THENIFACC=REGTHEN

ENLOCK<='0';

MIMAIN<='0';

ELSE

MIMAIN<='0';

ENDIF;

ELSIF(SETIN='1')THEN

IF(OLD='1')THEN

IF(ACC=REG)THEN

OLD<='0';

ELSE

SETIN<='0';

OLD<='0';

ENDIF;

ELSE

IF(ACC<"1001100110011001")THEN

REG<=ACC;

SETIN<='0';

ENDIF;

ENDIF;

ENDIF;

ENDIF;

ELSIFFLAG_N='1'THEN

ACC<=ACC(11DOWNTO0)&DATA_N;

ENDIF;

ENDIF;

ENDPROCESS;

DATA_BCD<=ACC;

ENDARCHITECTUREONE;

密码锁显示模块

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYYMIS

PORT(DATA_BCD:

INSTD_LOGIC_VECTOR(3DOWNTO0);

DOUT7:

OUTSTD_LOGIC_VECTOR(6DOWNTO0));

ENDYM;

ARCHITECTUREONEOFYMIS

BEGIN

PROCESS(DATA_BCD)

BEGIN

CASEDATA_BCDIS

WHEN"0000"=>DOUT7<="0111111";

WHEN"0001"=>DOUT7<="0000110";

WHEN"0010"=>DOUT7<="1011011";

WHEN"0011"=>DOUT7<="1001111";

WHEN"0100"=>DOUT7<="1100110";

WHEN"0101"=>DOUT7<="1101101";

WHEN"0110"=>DOUT7<="1111101";

WHEN"0111"=>DOUT7<="0000111";

WHEN"1000"=>DOUT7<="1111111";

WHEN"1001"=>DOUT7<="1101111";

WHENOTHERS=>DOUT7<="0000000";

ENDCASE;

ENDPROCESS;

ENDARCHITECTUREONE;

三、各模块的时序仿真图

1输入模块仿真

图5.1

分析:

图5.21CLK是在下降沿有效,当KRY有信号输入时,在下降沿有五个信号输出作为下一个元件的输入信号,其中有两个将直接输出。

2控制模块仿真

图5.2

分析:

以输入模块的输出信号作为输入信号实现控制功能。

3显示模块仿真

图5.3

分析:

输入“0110”时,输出"1111101",即数码管显示数字6。

当输入“1010”(即大于9)时,数码管无显示。

模块工作正常。

4顶层模块仿真

图5.4

仿真说明:

此组合模块基本实现了密码锁的设计要求,具有数码输入、数码显示、数码存储、密码锁定、密码重设和密码清除的功能。

基本达到了最初要达到的要求。

 

遇到的问题及解决办法

在连接各个模块的时候一定要注意各个输入、输出引脚的线宽,因为每个线宽是不一样的,只有让各个线宽互相匹配,才能得出最终的正确的结果。

否则,出现任何一点小的误差就会导致整个文件系统的编译出现错误提示,在器件的选择上也有一定的技巧,只有选择了适合当前电路所的器件,编译才能成功。

在仿真过程中:

设置输入不合理,不能输出。

经过长时间的调试终于仿真成功!

心得体会

通过这次设计,使我对EDA产生了浓厚的兴趣。

特别是当每一个子模块编写调试成功时,心里特别的开心。

在编写控制器模块时,我遇到了很大的困难,写控制文件的程序时,一直被显示是否输出以及寄存器问题所困扰,特别是各元件之间的连接,以及信号的定义,总是有错误,在细心的检查下,终于找出了错误和警告,排除困难后,程序编译就通过了。

再对控制模块仿真时,虽然语法正确,但连最基本的输入输出都进不去,我们弄了很多遍都不行,后来上网查找资料后发现只要在控制器中加入一个内部变量,定义为寄存器就完美的解决了问题的所在。

但是高兴死了。

另一个问题就是三个时钟信号的配合,其中显示模块和控制模块的信号频率要高。

其次,在进行引脚连接时一定要细心,有些引脚不能使用,我因为没注意使得开始时一直不能得到正确的结果。

这次EDA课程设计历时两个星期,在整整两个星期的日子里,可以说是苦多于甜,但是可以学的到很多很多的东西,同时不仅可以巩固以前所学过的知识,而且学到了很多在书本上所没有学到过的知识,例如在用循环语句时不能有上升沿或者下降沿触发的问题,而这个问题在书上没有,老师也没有提及,但是在实际的编译过程中,软件的编译纠错给出了这个概念收货良多。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

在设计的过程中遇到的问题,反映出来我的许多不足之处,我以后要努力克服缺点。

总的来说,这次设计的密码锁还是比较成功的,在设计中遇到了很多问题,最后在同学的帮助下终于都得到了解决,因此很有成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 高中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1