目录
第一章 概要 1.1 背景简介
1.2设计要求: 第二章 设计思路
2.1端口定义 2.2总体结构 2.3 设计方案 第三章 单元电路设计 3.1 简述
3.2 密码锁输入电路的设计
3.3 密码控制电路的设计
3.3.1VHDL源程序 3.3.2仿真波形 3.4密码显示电路的设计 3.4.1 密码锁显示电路设计简介 3.4.2 VHDL程序
第四章 整体组装
4.1 VHDL源程序或原理图 4.2 整体仿真波形
第五章 设计体会
1
第一章 概要
1.1 背景简介:
数字密码锁随着电子工业的发展,数字电子技术已经深入到了人们生活的各个层面, 而且各种各样的电子产品也正在日新月异地向着高精尖技术发展。由于电子产品 的功能不断增加,使用也越来越方便,有些产品已经成为了人们日常生活中不可 缺少的必备物品。发展历史悠久的机械式门锁,因其功能单一,安全性能较差等 缺点,必将被新一代的电子门锁所代替。新颖的多功能电子门锁,集电子门锁、 防盗报警器,门铃等功能于一身,而且还具有定时器呼唤,断电自动报知,显示 屋内有无人和自动留言等诸多附加功能。在未来的生活中,数字密码锁必将在学 领域再创新的成绩,将给我们的生活带来更大的便利,前景不可估量。
1.2 设计要求
(1).具有密码输入功能;
(2). 设计一个密码锁的控制电路,当输入正确代码时,输出开锁信号以推动执行机构工作, 用红灯亮、绿灯熄灭表示关锁,用绿灯亮、红灯熄灭表示开锁;
(3). 从第一个按钮触动后的 5 秒内若未将锁打开,则电路自动复位并进入自锁状态,使之无 法再打开,并由扬声器发出持续 20 秒的报警信号。
第二章 设计思路
2.1 端口定义:
输入:采样时钟 clk;译码输入 data[3..0];
2
输出:七段数码管驱动 q[6..0];数值译码 q1[3..0].按键指示key.
2.2 总体结构:
(1) 显示器 (2) VHDL 程序输入 (3) FPGA 芯片 扬声器
2.3 设计方案
密码锁控制器是硬件测试密码锁控制器是硬件与软件的结合。根据设计要求,决定以FPGA芯片和VHDL语言设计此电子密码锁。用一片FPGA芯片实现,从而大大简化了系统结构,降低了成本,提高了系统的保密性和可靠性。这种设计不仅简化了系统结构,降低了成本,更提高了系统的可靠性和保密性。另外,采用可编程逻辑器件开发的数字系统,方便地升级和改进。
根据系统的设计要求,系统设计采用自顶向下的设计方法。顶层设计采用原理图的设计方式和系统的整体组装,分别由密码锁输入模块、密码锁控制模块和密码锁显示译码模块等部分组成。即按照这三个组成模块定义相应的芯片引脚和输入输出的参数。
第三章 单元电路设计
3.1简述:密码锁的内部结构及主要功能
密码锁的内部结构即密码锁控制器由密码锁主体部分和外部指示电路组成。其中密码锁主要作用是接收输入的密码并进行密码的验证操作;外部指示电路的主要作用是用LED数码管显示输入的密码以及根据密码验证的结果给出不同的LED指示灯和数码管显示;当连续输入三次次错误密码时,启动报警装置,报警装置则采用扬声器。密码锁控制器的主要功能有:
(1)密码输入:每按下一个键,要求在数码管上显示,并依次左移。
(2)密码校验:如果有按键按下,LED1亮起,直到松开该按键;用LED2指示门
的状 态,也就是密码校验结果,如果密码校验正确,LED2亮起,否则如果密码校验 错误LED2闪烁4次,然后熄灭,表明密码错误。
3
(3)错误报警:密码输入连续三次错误开始报警。
(4)密码修改:输入密码正确后5秒内按*号键输入要设置和更改的密码,按#号键
确 认密码设置与更改,连续输入两次,则密码设置成功。
3.2 密码锁输入电路的设计
密码锁输入模块由时序产生电路、键盘扫描电路、键盘译码电路和按键存储电路组成。
通过这几个部分的组成可以将键盘输入的信号有时序的扫描存储而后传入控制模块来控制密码锁的动作。因此,定义键盘按键的位置和数码的关系如下表所示:
扫描 00 输出信号 按键号 备注:扫描位置是CSR[1.0],键盘输出信号SEL[3.2.1.0],按键号即为键盘的位置
密码锁输入电路仿真图如下:
1 2 3 4 5 6 7 8 9 * 0 # 00 00 01 01 01 10 10 10 11 11 11 0011 0101 0110 0011 0101 0110 0011 0101 0110 0011 0101 0110
3.3 密码锁控制器设计
密码锁控制电路软键盘的实现,通常在一个键盘中使用了一个瞬时接触开关,微处理器可以容易地检测到闭合。当开关打开时,通过处理器的 I/O 口的一个上拉电阻提供逻辑1;当开关闭合时,处理器的 I/O 口的输入将被拉低得到逻辑0。
4
3.3.1 VHDL 源程序
library ieee;
use ieee.std_logic_11.all;
entity decoder is port(clk: in std_logic; --译码器元件声明 data :in std_logic_vector(3 downto 0); q:out std_logic_vector(6 downto 0);
q1 : out std_logic_vector(3 downto 0) ); end entity;
architecture rt1 of decoder is begin
process(clk,data) begin
if rising_edge(clk) then
case data is when \"0000\"=>q<=\"0111111\";q1<=\"0000\"; when\"0001\"=>q<=\"0000110\";q1<=\"0001\";
when \"0010\" =>q<=\"1011011\";q1<=\"0010\"; when \"0011\"=> q<=\"1001111\";q1<=\"0011\"; when \"0100\"=> q<=\"1100110\";q1<=\"0100\"; when \"0101\"=> q<=\"1101101\";
q1<=\"0101\";
when \"0110\"=> q<=\"1111101\";q1<=\"0110\";
end if; end rtl;
3.3.2 密码锁控制模块仿真图:
3.4 密码显示电路的设计
5
3.4.1 密码锁显示电路设计简介
七段数码管是电子开发过程中常用的输出显示设备。在本设计中使用的是 8 个四位一 体、共阴极型七段数码管。 由于七段数码管公共端连接到 GND (共阴极型) 当数码管的中的一个段被输入高电平, 则相应的这一段被点亮。反之则不亮。共阳极性的数码管与之相反。四位一体的七段数码 管在单个静态数码管的基础上加入了用于选择哪一位数码管的位选信号端口。八个数码管 的 a、b、c、d、e、f、g、h、dp 都连在了一起,8 个数码管分别由各自的位选信号来控制, 被选通的数码管显示数据,其余关闭。 在键盘获取到行值和列值以后,组合成一个 8 位的数据,根据实现不同的编码在对每 个按键进行匹配,找到键值后由 7 段码管显示即可。
3.4.2 显示电路的VHDL程序如下:
library ieee;
use ieee.std_logic_11.all; entity led_disp is port(
datain:in std_logic_vector(3 downto 0); dataout:out std_logic_vector(7 downto 0) ); end led_disp;
architecture rtl of led_disp is begin
process(datain) begin case datain is
when \"1010\"=>dataout<=\"11000000\"; --0 when \"0001\"=>dataout<=\"11111001\"; --1 when \"0010\"=>dataout<=\"10100100\"; --2 when \"0011\"=>dataout<=\"10110000\"; --3
6
when \"0100\"=>dataout<=\"10011001\"; --4 when \"0101\"=>dataout<=\"10010010\"; --5 when \"0110\"=>dataout<=\"10000010\"; --6 when \"0111\"=>dataout<=\"11111000\"; --7 when \"1000\"=>dataout<=\"10000000\"; --8 when \"1001\"=>dataout<=\"10010000\"; --9 when others=>null; end case; end process; end rtl;
第四章 整体组装
4.1密码锁整体原理图
VHDL源程序:
library ieee;
use ieee.std_logic_11.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all;
entity exp19 is
7
port( Clk : in std_logic; --时钟信号
Rst : in std_logic; --复位信号 Kr : in std_logic_vector(3 downto 0); --键盘行 Kc : buffer std_logic_vector(3 downto 0); --键盘列 SPK : out std_logic; --扬声器输出 KEY_State : out std_logic; --按键指示
Display : out std_logic_vector(7 downto 0); --七段码管显示 SEG_SEL : buffer std_logic_vector(2 downto 0)); --七段码管片选 end exp19;
architecture behave of exp19 is
signal keyr,keyc : std_logic_vector(3 downto 0); signal kcount : std_logic_vector(2 downto 0); signal kflag1,kflag2 : std_logic;
signal buff1,buff2,buff3,buff4,buff5,buff6 : integer range 0 to 15; signal push_num : integer range 0 to 15; --按键次数 signal Disp_Temp : integer range 0 to 15;
signal Disp_Decode : std_logic_vector(7 downto 0); signal SEC1,SEC10 : integer range 0 to 9;
signal Clk_Count1 : std_logic_vector(3 downto 0); --1KHz时钟分频计数器 signal Clk_Count2 : std_logic_vector(9 downto 0); --2Hz时钟分频计数器 signal Clk1KHz : std_logic; signal Clk2Hz : std_logic; signal Clk1Hz : std_logic;
signal Error_Num : integer range 0 to 3; signal Error_Flag : std_logic;
signal Error_Count : std_logic_vector(2 downto 0); signal Music_Count : std_logic_vector(2 downto 0); begin
process(Clk) begin
if(Clk'event and Clk='1') then
if(Clk_Count1<10) then
Clk_Count1<=Clk_Count1+1; else
Clk_Count1<=\"0001\"; end if; end if; end process;
Clk1KHz<=Clk_Count1(2); process(Clk1KHz) begin
8
if(Clk1KHz'event and Clk1KHz='1')
then
if(Clk_Count2<1000) then
Clk_Count2<=Clk_Count2+1; else
Clk_Count2<=\"0000000001\"; end if; end if;
end process;
Clk2Hz<=Clk_Count2(9); process(Clk2Hz) begin
if(Clk2Hz'event and Clk2Hz='1')
then
Clk1Hz<=not Clk1Hz; end if; end process;
process(Clk1KHz) --扫描键盘 begin
if(Clk1KHz'event and Clk1KHz='1')
then
if(Kr=\"1111\") then
kflag1<='0';
kcount<=kcount+1; if(kcount=0) then
kc<=\"1110\"; elsif(kcount=1)
then
kc<=\"1101\"; elsif(kcount=2)
then
kc<=\"1011\"; else
kc<=\"0111\"; end if; else
kflag1<='1'; keyr<=Kr; keyc<=Kc; end if;
kflag2<=kflag1;
9
end if; end process; KEY_State<=kflag1;
process(Clk1KHz,Rst) --扫描键盘 begin
if(Rst='0') then
push_num<=0;
elsif(Clk1KHz'event and Clk1KHz='1')
then
if(push_num=6) then
push_num<=0;
elsif(kflag1='0' and kflag2='1') then
push_num<=push_num+1; end if; end if; end process; process(Clk2Hz,Rst) begin
if(Rst='0' or Error_Flag<='0') then
Error_Count<=\"000\";
elsif(Clk2Hz'event and Clk2Hz='1' and Error_Flag<='1') then Error_Count<=Error_Count+1; end if; end process;
process(Clk) --报警声音分频
begin
if(Clk'event and Clk='1') then
Music_Count<=Music_Count+1; end if; end process;
process(Clk) --超出错误次数,开始报警 begin
if(Error_Num>=3)
then
if(Clk1Hz='1') then
SPK<=Music_Count(2); else
SPK<=Music_Count(1); end if;
10
end if;
end process;
process(Clk1KHz,Rst) --显示右移
begin
if(Rst='0' or push_num=0)
then --复位时,全灭 buff1<=15; buff2<=15; buff3<=15; buff4<=15; buff5<=15;
elsif(Clk1KHz'event and Clk1KHz='1') then
if(kflag1='1' and kflag2='0' and (((keyr=\"1110\" or keyr=\"1011\")and keyc/=\"0111\")or
keyr=\"1101\")) then
buff1<=buff2; buff2<=buff3; buff3<=buff4; buff4<=buff5; buff5<=buff6; end if; end if; end process; process(clk,data) begin
if rising_edge(clk) then
case data is when \"0000\"=>q<=\"0111111\";q1<=\"0000\"; when\"0001\"=>q<=\"0000110\";q1<=\"0001\";
when \"0010\" =>q<=\"1011011\";q1<=\"0010\"; when \"0011\"=> q<=\"1001111\";q1<=\"0011\"; when \"0100\"=> q<=\"1100110\";q1<=\"0100\"; when \"0101\"=> q<=\"1101101\";
q1<=\"0101\";
when \"0110\"=> q<=\"1111101\";q1<=\"0110\";
end if; end case; end process; process(Clk)
begin
if(Clk'event and Clk='1') then --扫描累加
SEG_SEL<=SEG_SEL+1; Display<=Disp_Decode;
end if;
11
end process;
process(Disp_Temp) --显示转换 begin
case Disp_Temp is
when \"1010\"=>dataout<=\"11000000\"; --0 when \"0001\"=>dataout<=\"11111001\"; --1 when \"0010\"=>dataout<=\"10100100\"; --2 when \"0011\"=>dataout<=\"10110000\"; --3 when \"0100\"=>dataout<=\"10011001\"; --4 when \"0101\"=>dataout<=\"10010010\"; --5 when \"0110\"=>dataout<=\"10000010\"; --6 when \"0111\"=>dataout<=\"11111000\"; --7 when \"1000\"=>dataout<=\"10000000\"; --8 when \"1001\"=>dataout<=\"10010000\"; --9 when others=>null; end case; end process; end behave;
4.2 整体仿真波形图:
12
第五章 设计体会
此次设计中,学到了很多东西,懂得了做任何事情都要认真严谨。非常感谢XXX老师给我们讲授的EDA。如果没有她严谨细致、孜孜不倦的讲授精神。这表示真诚的感谢!在应用VHDL的过程中让我真正领会到了其并行运行与其他软件(C语言)顺序执行的差别及其在电路设计上的优越性。用VHDL硬件描述语言的形式来进行数字系统的设计方便灵活,利用EDA软件进行编译优化仿真极大地减少了电路设计时间和可能发生的错误,降低了开发成本,这种设计方法必将在未来的数字系统设计中发挥越来越重要的作用。 2011.11.06
13
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- 7swz.com 版权所有 赣ICP备2024042798号-8
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务