成绩
EDA技术课程设计论文
题 目 基于VHDL语言的电子密码锁设计
课 程 名 称 EDA技术实训_______ 院 (系) 电子通信工程学院___ 专 业 班 级 ____________________
学 生 姓 名 _____________________ 学 号 _____________________ 设 计 地 点 EDA实验室_________ 指 导 教 师
设计起止时间: 年 月 日至 年 月 日
1
目 录
1 绪论..................................................3 1.1电子密码锁的功能要求................................3 1.2总体模块设..........................................3 1.3顶层文件设计........................................4 2 各功能模块的具体实现..................................5 2.1拨码输入模块........................................5 2.2寄存器..............................................6 2.3密码比较模块........................................8 2.4显示模块...........................................10 3 系统仿真.............................................15 4 硬件测试.............................................16 5实践心得及体会.......................................17
2
绪 论
1.1电子密码锁的功能要求
1、设计六位密码(每位均可以是0~9任意数字)的电子密码锁,用四个拨码开关(k1~k4)输入,并通过七段数码管显示输入密码。
2、密码验证:按键设置验证开始,输入密码后, 密码正确时开锁,绿灯亮,红灯灭,表示开锁成功;当密码输入错误时,绿灯灭,红灯亮,表示开锁失败。 3、密码更改:密码验证正确后可以更改,并设置按键控制更改密码功能。 4、密码清除:密码输入过程中可以清除,并重新输入。 5、初始密码:预设初始密码为123456。
1.2总体模块设计
通过拨码输入密码,送到密码校验电路,如果校验正确开锁,并执行显示在LED灯上,同时密码校验正确可以进行密码修改。
3
密码修改电路 拨码输入 密码校验电路 开锁电路 执行电路
图1
1.3顶层文件设计
本设计采用EDA技术和VHDL语言设计了一种按键输入密码并数码管回显,当输入正确密码时轰动绿灯亮、红灯熄灭表示开锁,而当输入错误密码时,红灯亮、绿灯熄灭表示关锁。
根据系统设计要求,系统设计采用自顶向下的设计方法。顶层设计采用原理图设计方式,系统的整体组装设计原理图如图2所示。它由拨码输入、寄存器、密码比较和显示灯四个模块组成。其顶层文件设计如图:
4
图2
各功能模块的具体实现
2.1拨码输入模块
1、拨码输入模块包括设置密码并读取、输入密码、系统复位功能。该模块中我们设置了6个按键,各个按键的功能分别为:按键1、2、3、4分别对应4位二进制密码输入、键5为密码确认键、键6为系统复位和密码读取按键。如图3:
5
图3
2、以上各子模块的设计均采用VHDL语言实现,其具体实现程序如下: library ieee;
use ieee.std_logic_11.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; entity a is
port (k1,k2,k3,k4,k5:in std_logic;
k_out:out std_logic_vector(3 downto 0); q:buffer std_logic_vector(2 downto 0)); end;
architecture bhv of a is begin process(k5) begin
if k5'event and k5='1' then if q<\"101\" then q<=q+'1' ; else q<=\"000\"; end if ;
k_out<=k1&k2&k3&k4; end if ;
6
end process;
end bhv;
2.2寄存器
1、用两个寄存器,每个寄存器存入6个二进制数,每个寄存器的输入和输出各6个。b2寄存器为存入拨码输入的6个二进制数,b1寄存器为存入密码的6个二进制数,并在b1中加入初始密码。 2、寄存器的VHDL程序如下:
b1寄存器(图4):
图4
library ieee;
use ieee.std_logic_11.all; use ieee.std_logic_unsigned.all; entity b1 is port (
d1,d2,d3,d4,d5,d6 :in std_logic_vector(3 downto 0); q:in std_logic_vector(2 downto 0);
q1,q2,q3,q4,q5,q6 : out std_logic_vector(3 downto 0)); end;
architecture bhv of b1 is
signal qq1,qq2,qq3,qq4,qq5,qq6:std_logic_vector(3 downto 0); begin
process (q) begin if
q<\"101\" then qq1<=\"0001\";
7
qq2<=\"0010\"; qq3<=\"0011\"; qq4<=\"0100\"; qq5<=\"0101\"; qq6<=\"0110\";
qq1<=d1 ; qq2<=d2 ; qq3<=d3 ; qq4<=d4 ; qq5<=d5 ; qq6<=d6; end if; end process ;
q1<=qq1; q2<=qq2; q3<=qq3; q4<=qq4; q5<=qq5; q6<=qq6;
end bhv;
b2寄存器(图5):
图5
library ieee;
use ieee.std_logic_11.all;
8
entity b2 is
port (q:in std_logic_vector(2 downto 0);
d1,d2,d3,d4,d5,d6 :in std_logic_vector(3 downto 0); q1,q2,q3,q4,q5,q6 : out std_logic_vector(3 downto 0)); end;
architecture bhv of b2 is
begin
process (q) begin
if q=\"000\" then q1<=d1; elsif q=\"001\" then q2<=d2; elsif q=\"010\" then q3<=d3; elsif q=\"011\" then q4<=d4; elsif q=\"100\" then q5<=d5; else q6<=d6; end if; end process ; end bhv;
2.3密码比较模块
1、把2个寄存器里的二进制数进行比较,如图5.
图5
9
2、比较模块的VHDL程序如下: library ieee;
use ieee.std_logic_11.all; use ieee.std_logic_unsigned.all; entity c is
port (c1,c2,c3,c4,c5,c6:in std_logic_vector(3 downto 0); m1,m2,m3,m4,m5,m6:in std_logic_vector(3 downto 0); s_out :out std_logic); end;
architecture bhv of c is begin
process(c1,m1,c2,m2,c3,m3,c4,m4,c5,m5,c6,m6) begin if
c1=m1 then if
c2=m2 then if
c3=m3 then if
c4=m4 then if
c5=m5 then if
c6=m6 then s_out<='1';
else
s_out<='0'; end if; end if; end if; end if; end if; end if; end process;
end bhv;
10
2.3显示模块
1、本设计要求输入正确密码时,绿灯亮、红灯熄灭;当输入错误密码时,5S后红灯亮绿灯灭。 2、LED显示电路的VHDL程序如下: 位码(图6):
图6
LIBRARY IEEE;
USE IEEE.STD_LOGIC_11.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; entity f is
port( s1,s2,s3,s4,s5,s6: IN STD_LOGIC_vector(3 downto 0); q:in STD_LOGIC_VECTOR(2 DOWNTO 0); cout: buffer std_logic_vector(2 downto 0); dig:buffer std_logic_vector(5 downto 0); DEL: OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ); end;
architecture one of f is
11
begin process(q) begin
if q<=\"000\" then cout<=cout+'1'; end if;
case q is
when \"000\"=>DEL<=s1; dig<=\"011111\"; when \"001\"=>DEL<=s2; dig<=\"101111\"; when \"010\"=>DEL<=s3; dig<=\"110111\"; when \"011\"=>DEL<=s4; dig<=\"111011\"; when \"100\"=>DEL<=s5; dig<=\"111101\"; when\"101\"=>DEL<=s3; dig<=\"111110\";
when others=> null; end case; end process;
12
end one;
LED七段数码管(图7):
图7
library ieee;
use ieee.std_logic_11.all; use ieee.std_logic_unsigned.all; entity d is
port( keyin:in std_logic_vector(3 downto 0); cout:in std_logic_vector(2 downto 0); keyout:out std_logic_vector(6 downto 0)); end d;
architecture one of d is begin
process(keyin)
13
begin
if cout<\"101\" then
case keyin is
when \"0000\" => keyout<=\"1000000\"; when \"0001\" => keyout<=\"1111001\"; when \"0010\" => keyout<=\"0100100\"; when \"0011\" => keyout<=\"0110000\"; when \"0100\" => keyout<=\"0011001\"; when \"0101\" => keyout<=\"0010010\"; when \"0110\" => keyout<=\"0000010\"; when \"0111\" => keyout<=\"1111000\"; when \"1000\" => keyout<=\"0000000\"; when \"1001\" => keyout<=\"0010000\"; when others => keyout<=null; end case; end if;
end process; end one;
14
系统仿真
将程序下载Cyclone系列芯片中,同时在EDA试验箱上进行硬件验证。本文提出的电子密码锁由于采用VHDL语言设计,用一片FPGA实现,因而体积小,功耗低,稍加修改就可以改变密码的位数和输入密码的次数,具有较好的应用前景。但由于结构还比较简单,有待进一步完善。 1)密码锁输入模块的仿真,如图12所示。
15
硬件测试
1)仿真波形正确后,便可进行下载; 2)选择GW48系列EDA试验开发系统; 3)使用Cyclone系列芯片EP3C25F324C8; 4)先进行引脚锁定,具体引脚锁定如图14; 5)选择模式3;
6)选择好硬件和模式后就可以下载都EDA实验箱;
密码锁引脚锁定图8
16
实践心得及体会
通过三星期的紧张工作,最后完成了我的设计任务——基于VHDL语言的电子
密码锁设计。通过本次课程设计的学习,我深深的体会到设计课的重要性和目的性所在。本次设计课不仅仅培养了我们实际操作能力,也培养了我们灵活运用课本知识,理论联系实际,自主的进行设计的能力。它不仅仅是一个学习新识的一次综合的检验和复习,使我明白了自己的缺陷所在,从而查漏补缺。希望学校以后多安排一些类似的实践环。
通过对每个模块的了解和分析加深了对层次化设计的理念,每次遇到不会的及时查阅书籍进一步加深了对知识的理解程度,老师细致的讲解犹是我记忆犹新。
与同学的交流,使我们交换了各自的想法,有助于形成自己的构想,以及我们一起讨论不同之处也使我们彼此加深对知识的了解。 此次设计经历网上查阅资料、思考顶层文件的设计、各个模块的具体实现等,让我们掌握对信息的有选择性的摄取信息,培养了分层分布思考问题等理念,此次课程设计对我收益很大,学到很多东西。
17