1、EDA电子密码锁设计 XXX大学EDA综合设计报告班级 2XX级自动化一班 姓名 XXX 学号 XX 日期 20XX年X月 设计题目电子密码锁设计姓名XX班级一班学号XX同组人XX小组分工XX:实现方案的设计XXX:程序的设计设计思路根据设计要求,可以确定所需要的功能,可以分为三个方面,一是输入方面,二是控制方面,三是显示方面的需求。所以初步决定利用三个模块完成相关功能。同时,模块化的编程方式利于后期调试。输入模块:根据设计要求,使用到时序产生电路,弹跳消除电路,及键盘扫描电路来共同组成。控制模块:包括按键数据的缓冲存储,密码的清除、更改、存储、激活电锁电路(产生寄存器清除信号),密码核对(数
2、值比较),解锁电路(开/关门锁)等几个功能。显示模块:主要是实现七段数码管显示电路,将待显示数据的BCD码转换成数码器的七段显示驱动编码设计过程一、实验方案:分层次方案设计及代码描述 1输入模块(1)时序产生电路本时序产生电路中使用了三种不同频率的工作脉冲波形:系统时钟脉冲(它是系统内部所有时钟脉冲的源头,且其频率最高)、键盘扫描信号。(2)键盘扫描电路扫描电路的作用是用来提供键盘扫描信号(表4.1中的KY3KY0)的,扫描信号变化的顺序依次为11101101101101111110.依序地周而复始。 2控制模块 密码锁的控制模块是其整个设计的核心部分,依靠其进行密码锁的基本功能。如,设置密码
3、,重置密码,开锁,上锁等等。(1) 数字按键输入的响应控制A、如果按下数字键,第一个数字会从显示器的最右端开始显示,此后每新按一个数字时,显示器上的数字必须左移一格,以便将新的数字显示出来。B、假如要更改输入的数字,可以按倒退按键来清除前一个输入的数字,或者按清除键清除所有输入的数字,再重新输入四位数。C、由于这里设计的是一个四位的电子密码锁,所以当输入的数字键超过四个时,电路不予理会,而且不再显示第四个以后的数字。(2)功能按键输入的响应控制清除键:清除所有的输入数字,即做归零动作。激活电锁键:按下此键时可将密码锁的门上锁。(上锁前必须预先设定一个四位的数字密码。)解除电锁键:按下此键会检查
4、输入的密码是否正确,若密码正确无误则开门。 3显示模块密码显示电路主要将显示数据的BCD码转换成相对应的编码。这里直接采用四个4-7译码器来实现。二、各模块程序密码锁输入模块LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY SR IS PORT(CLK_1K: IN STD_LOGIC; KEY_IN: IN STD_LOGIC_VECTOR(2 DOWNTO 0); DATA_N: OUT STD_LOGIC_VECTOR
5、(3 DOWNTO 0); DATA_F: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); FLAG_N: OUT STD_LOGIC; FLAG_F: OUT STD_LOGIC; CQD: OUT STD_LOGIC; KSEL: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); CSR: OUT STD_LOGIC_VECTOR(1 DOWNTO 0); END SR;ARCHITECTURE ONE OF SR IS SIGNAL C_QD: STD_LOGIC; SIGNAL C_SR: STD_LOGIC_VECTOR(1 DOWNTO 0);
6、 SIGNAL N,F: STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL FN,FF: STD_LOGIC; SIGNAL SEL: STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL Q: STD_LOGIC_VECTOR(5 DOWNTO 0); SIGNAL C: STD_LOGIC_VECTOR(2 DOWNTO 0); 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);
7、C(2)=KEY_IN(2); COUNTER: BLOCK IS BEGIN PROCESS(CLK_1K)IS BEGIN IF(CLK_1KEVENT AND CLK_1K=1)THEN Q=Q+1; END IF; C_QD=Q(3); C_SR=Q(5 DOWNTO 4); END PROCESS; SEL=1110 WHEN C_SR=0 ELSE 1101 WHEN C_SR=1 ELSE 1011 WHEN C_SR=2 ELSE 0111 WHEN C_SR=3 ELSE 1111; END BLOCK COUNTER; KEY_DECODER: BLOCK SIGNAL Z
8、: STD_LOGIC_VECTOR(4 DOWNTO 0); BEGIN PROCESS(C_QD) BEGIN ZNNNNNNNNNNNFFF=1000; END CASE; END IF; END PROCESS; FN=NOT(N(3)AND N(2)AND N(1)AND N(0); FF=F(2) OR F(0); END BLOCK KEY_DECODER; END ARCHITECTURE ONE;密码锁控制模块LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD
9、_LOGIC_UNSIGNED.ALL;ENTITY CTRL ISPORT (DATA_N: IN STD_LOGIC_VECTOR(3 DOWNTO 0); DATA_F: IN STD_LOGIC_VECTOR(3 DOWNTO 0); FLAG_N: IN STD_LOGIC; FLAG_F: IN STD_LOGIC; MIMAIN: BUFFER STD_LOGIC; SETIN: BUFFER STD_LOGIC; OLD: BUFFER STD_LOGIC; CQD: IN STD_LOGIC; ENLOCK: OUT STD_LOGIC; DATA_BCD: OUT STD_
10、LOGIC_VECTOR(15 DOWNTO 0); END ENTITY CTRL; ARCHITECTURE ONE OF CTRL IS SIGNAL ACC,REG: STD_LOGIC_VECTOR(15 DOWNTO 0); BEGIN PROCESS(CQD,FLAG_F) IS BEGIN IF CQDEVENT AND CQD=0 THEN IF FLAG_F=1 THEN IF(DATA_F=0100) THEN ACC=1111111111111111; MIMAIN=0; SETIN=0; OLDENLOCKMIMAIN=1; ACCSETIN=1; ACC=11111
11、11111111111; OLDNULL; END CASE; ELSIF(MIMAIN=1) THEN IF ACC=REG THEN ENLOCK=0; MIMAIN=0; ELSE MIMAIN=0; END IF; ELSIF(SETIN=1) THEN IF(OLD=1) THEN IF(ACC=REG) THEN OLD=0; ELSE SETIN=0; OLD=0; END IF; ELSE IF(ACC1001100110011001) THEN REG=ACC; SETIN=0; END IF; END IF; END IF; END IF; ELSIF FLAG_N=1 T
12、HEN ACC=ACC(11 DOWNTO 0)&DATA_N; END IF; END IF; END PROCESS; DATA_BCDDOUT7DOUT7DOUT7DOUT7DOUT7DOUT7DOUT7DOUT7DOUT7DOUT7DOUT7=0000000; END CASE; END PROCESS;END ARCHITECTURE ONE;三、各模块的时序仿真图1输入模块仿真图5.1分析:图5.21CLK是在下降沿有效,当KRY有信号输入时,在下降沿有五个信号输出作为下一个元件的输入信号,其中有两个将直接输出。2控制模块仿真图5.2分析:以输入模块的输出信号作为输入信号实现控制功
13、能。3显示模块仿真图5.3分析:输入“0110”时,输出1111101,即数码管显示数字6。当输入“1010”(即大于9)时,数码管无显示。模块工作正常。4顶层模块仿真图5.4 仿真说明:此组合模块基本实现了密码锁的设计要求,具有数码输入、数码显示、数码存储、密码锁定、密码重设和密码清除的功能。基本达到了最初要达到的要求。遇到的问题及解决办法在连接各个模块的时候一定要注意各个输入、输出引脚的线宽,因为每个线宽是不一样的,只有让各个线宽互相匹配,才能得出最终的正确的结果。否则,出现任何一点小的误差就会导致整个文件系统的编译出现错误提示,在器件的选择上也有一定的技巧,只有选择了适合当前电路所的器件
14、,编译才能成功。在仿真过程中:设置输入不合理,不能输出。经过长时间的调试终于仿真成功! 心得体会通过这次设计,使我对EDA产生了浓厚的兴趣。特别是当每一个子模块编写调试成功时,心里特别的开心。在编写控制器模块时,我遇到了很大的困难,写控制文件的程序时,一直被显示是否输出以及寄存器问题所困扰,特别是各元件之间的连接,以及信号的定义,总是有错误,在细心的检查下,终于找出了错误和警告,排除困难后,程序编译就通过了。再对控制模块仿真时,虽然语法正确,但连最基本的输入输出都进不去,我们弄了很多遍都不行,后来上网查找资料后发现只要在控制器中加入一个内部变量,定义为寄存器就完美的解决了问题的所在。但是高兴死
15、了。另一个问题就是三个时钟信号的配合,其中显示模块和控制模块的信号频率要高。其次,在进行引脚连接时一定要细心,有些引脚不能使用,我因为没注意使得开始时一直不能得到正确的结果。这次EDA课程设计历时两个星期,在整整两个星期的日子里,可以说是苦多于甜,但是可以学的到很多很多的东西,同时不仅可以巩固以前所学过的知识,而且学到了很多在书本上所没有学到过的知识,例如在用循环语句时不能有上升沿或者下降沿触发的问题,而这个问题在书上没有,老师也没有提及,但是在实际的编译过程中,软件的编译纠错给出了这个概念收货良多。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到的问题,反映出来我的许多不足之处,我以后要努力克服缺点。 总的来说,这次设计的密码锁还是比较成功的,在设计中遇到了很多问题,最后在同学的帮助下终于都得到了解决,因此很有成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1