学院: 通信与电子工程学院
班级: 电子071
学号: 2007******
姓名: ***
同组成员: ***、***
指导老师: ****
日期: 2009年12月21日
摘 要
数字密码锁主要完成上锁、密码输入、密码核实、开锁、密码修改等功能。数字密码锁的设计的各模块由相应的VHDL程序具体实现,最后在QuartusII9.0环境下进行了整体电路的模拟仿真,并通过实验板验证能够正常实现各功能,结果表明,整个设计满足要求采用VHDL硬件描述语言设计数字逻辑电路的过程和方法。
关键词:数字开锁 密码更改 数字逻辑电路
目 录
摘 要 1
第1章 绪论 3
1.1 概述 3
1.2 EDA技术的发展及研究 3
1.2.1 EDA技术的应用 3
1.2.2 EDA电子系统设计的特点 3
1.2.3 EDA的推广 4
1.3 EDA技术的研究意义 4
第2章 基于VHDL的数字密码锁的功能设计 5
2.1 数字密码锁的内部结构及其主要功能 5
2.1.1 数字密码锁的端口图如下: 5
2.2 数字密码锁的模块划分 6
2.2.1 数据采集模块 6
2.2.2 数据译码模块 6
2.2.3 数据显示模块 6
2.2.4 分频模块 7
2.2.5密码修改模块 7
2.3 仿真 7
2.3.1 波形仿真 7
2.3.2 rtl级联图如下: 8
2.3.3引脚定义如下图: 8
第3章 基于VHDL的数字密码锁的程序设计 10
结 论 18
参考文献 19
致谢 20
第1章 绪论
1.1 概述
数字密码锁是在实际应用中使用得极其广泛 的一种数字电路,它的主要功能是用来对某些物品进行加密保护,目的是避免物权人员使用某些设施或者进行越权操作,使用方便、保密性能好许多产品中都含有这种数字密码锁。例如银行自动柜员机、自动售货机、门卡系统或者保险柜保密、电话或是房门上不可少的部分。
电子设计自动化(Electronic Design Automation),也就是EDA技术,就是以功能强大的计算机为平台,以EDA软件为工具,对用硬件描述语言HDL(Hardware Description Language)的系统逻辑设计文件,自动的完成逻辑编译、简化、分割、综合、布局布线以及逻辑优化和仿真测试的电子产品自动化设计过程。伴随着计算机、集成电路和电子技术的发展,EDA技术在过去的几十年里取得了巨大的进步。EDA技术使得设计者的工作仅限于利用软件的方式,即利用硬件描述语言和EDA软件便可完成对系统硬件的功能实现。DSP、嵌入式处理器软件的成熟令EDA软件的功能日益强大。如今,EDA软件工具已经成为电子信息类产品的支柱产业,除了成熟的数字技术外,模拟电路系统硬件描述语言的表达和设计的标准化、系统可编程模拟器件的出现、数字信号处理和图像处理的全硬件实现方案等,使得EDA工具不论是在广度上还是深度上都取得了长足的发展。
1.2 EDA技术的发展及研究
伴随着计算机、集成电路和电子系统设计的发展,融合了计算数学、优化理论、图论和拓扑学等多科学精髓发展起来的电子设计自动化(EDA)技术,正在成为现代电子设计技术的核心。EDA技术涉及面广,内容丰富,以其为基础的数学系统设计,已经具备完整的、成熟的设计方法和设计流程,为现代电子设计的进步和发展做出了巨大的贡献。
1.2.1 EDA技术的应用
EDA技术广泛用于电子领域的各学科,如:高校电类专业的实践教学和科研、集成电路和新产品的开发以及传统机电设备的升级换代和技术改造等。
1.2.2 EDA电子系统设计的特点
EDA技术用软件的方式设计硬件,在其设计过程中可以运用相关软件进行各种仿真;系统可现场编程并实现在线升级;它的整个系统可集成在一个芯片上,使之具有体积小、功耗低及可靠性高的特点。
1.2.3 EDA的推广
EDA技术的发展和推广应用极大地推动了电子工业的发展。随着EDA技术的发展,硬件电子电路的设计几乎全部可以依靠计算机来完成,这样大大缩短了硬件电子电路的设计周期,从而使制造商可以快速开发出品种多、批量小的产品,以满足市场的要求。EDA的推广是当今世界的热点,EDA技术是现代电子工业中不可缺少的一项技术。
1.3 EDA技术的研究意义
作为一门发展迅速、有着广阔前景的新技术,EDA技术涉及面广,内容丰富。随着数字电子技术的飞速发展,信息化得到了有力的推动和促进,从与普通百姓生活息息相关的手机、计算机、数字电视,到关系到国家安定,社会和谐的军用设备、航天技术,都采用了数字电子技术,而现代电子技术的核心已逐步转向基于电子设计自动化技术,并将在将来的发展中得到更加广泛和深入的应用。
第2章 基于VHDL的数字密码锁的功能设计
2.1 数字密码锁的内部结构及其主要功能
数字密码锁是由数字密码锁主体以及附加的外围指示电路组成的,其中数字密码锁主体的主要作用是接收密码并进行密码的验证操作;附加的外围指示电路的主要作用是用来显示输入的密码和根据密码验证的结果来给出不同的指示灯显示
基于VHDL的保险柜数字密码锁的系统结构在本设计中,数字密码锁的主要功能如下所示:
(1)数字密码锁的工作时钟由外部晶振来提供,时钟频率为50MHz;由ret引脚接入
(2)密码的设置和输入由外接键盘完成; 由数据输入端DATA0和DATA1输入
Confirm0 和confirm1 输入确认数据
(3)密码可以由锁的所有者随意设置,并可更改,这里采用3位十进制数字作为密码;
(4)不小心输错1位密码,可以重新输入;
(5)对输入的密码数字进行显示;
(6)密码输入正确后,密码锁将开启,并且出现输入有效指示;
2.1.1 数字密码锁的端口图如下:
图1
图1中,CLK 是时钟信号输入端,晶振频率为50MHZ;SUM为密码修改信号输入端当按下次键时进行密码设置,输入密码后再次按下此键即确定输入密码,DATA0 、DATA1为系统数据输入端;当DATA0被按下时数码管显示的数即进行加1操作 从0~9循环,当DATA1 被按下时数码管显示的数据即进行减1操作从9~0循环;CONFIRM0、CONFIRM1为确认信号输入端。当按下CONFIRM0时就确认当前输入的一位密码,进入下一密码的设置,相反当按下CONFIRM1时就取消已确定的密码,回到上一个密码的设置。由于实验板没有矩阵键盘,我们就采取用这四个按键实现密码的输入、确认、取消及修改的操作。Green、Red为密码输入状态指示引脚接相应的led。密码输入正确时Red灯亮否则Green灯亮;Dula0~Dula7 为数码管显示的信号输出端,Wela0~Wela2为 三位数码管的段选控制端,控制着那个数码管点亮。
2.2数字密码锁的模块划分
2.2.1 数据采集模块
数据采集内部 又是由键盘扫描、编码和键盘的去抖动构成。键盘扫描包括:数据输入按键扫描和确认数据按键扫描;去抖动就是当检测到有键盘按下时利用软件延时一段时间,如果再次检测数据仍没有变化,就可以确定确实有键子被按下,去抖动后能够检测到键盘是不是不小心被触及等干扰,消除误判的因素。DATA0 、DATA1两个按键的作用是输入数据即每当按键按下,就会用十进制数记录按键被按下的次数,对相应的数进行加和减从而完成键盘的编码操作。Confirm0和Confirm1是数据输入的确认按键,当输入一位密码后按下这两个键就会确认、取消输入信息,继续下一位密码的输入或者从新回到上一位的密码输入。
当密码正确时按下sum对应的按键就可以对密码进行修改。
2.2.2 数据译码模块
由于键盘采集来的数据是十进制数据,要在数码管上显示必须对其进行译码操作,使之转换成能在数码管上显示的段选编码。此模块由一个change函数来实现。在函数里将0~9这几个数字按照共阴极数码管的编码规则进行编码。采集来的十进制数进入这个函数后立即对它进行查询返回相对应的八位数码管段选值。
2.2.3 数据显示模块
数据显示有数码管显示当前输入的密码,采用动态扫描的方式进行显示。实验板硬件电路位选由74ls138来驱动。显示时每次只送一位数码管的待显示的数据,同时选中相应的数码管位选由74ls138送出低电平,点亮一段时间然后再送第二个数码管待显示的数据同时选中第二个数码管的位选,以此类推知道吧所有的数码管都点亮。由于人眼睛的视觉暂留看起来就像同时点亮。由此完成数据的显示
2.2.4 分频模块
由于实验板所用的时钟频率为50MHZ,而程序中又涉及键盘检测、数码管显示等,所以要对时钟频率进行分频,本程序对其进行了50000分频得到1KHZ的时钟频率,通过仿真验证采用二级分频比使用一级分频节约很多硬件资源,所以我们采用二级分频,首先进行200分频再在其中嵌套一个250分频就得到了1KHZ的时钟频率。
2.2.5密码修改模块
当输入的密码正确后只要按下sum按键就可以随时对密码惊醒修改,否则处于不可修改状态。此过程大致与密码的输入过程相似,也是由数据输入端输入数据,按下确认键对输入的密码进行确认或取消,当使用者输入完合适的密码后再次按下sum按键就会确认输入的密码完成密码的修改。
2.3仿真
2.3.1 波形仿真
由于此实验用了很大的分频程序而且需要很长的时间下载的实验板上调试比仿真要快的多,所以我们在这也只是对密码锁的初始状态进行仿真。Confirm0取得有效电平密码锁进入第一个密码的输入状态,由于此时并没有按键按下所以数码管显示的数据是三个零,dula0~dula7就是零对应的编码。位选在不断地扫描选通各个数码管点亮,完成显示功能。
2.3.2 rtl级联图如下:
2.3.3引脚定义如下图:
第3章 基于VHDL的数字密码锁的程序设计
library ieee;
use ieee.std_logic_11.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity shuma is
port(clk: in std_logic;
rst : in std_logic;
data : in std_logic_vector(1 downto 0);
confirm : in std_logic_vector(1 downto 0);
sum: in std_logic ;
dula : out std_logic_vector(7 downto 0);
wela : out std_logic_vector(2 downto 0);
red : out std_logic;
green: out std_logic
);
end shuma;
architecture behave of shuma is
signal p:integer range 0 to 2 ;
signal clock:std_logic;
signal cnt,cnt3 : integer range 0 to 9;
signal p1: integer range 0 to 9;
signal p2: integer range 0 to 9;
signal p3: integer range 0 to 9;
signal b1: integer range 0 to 9:=6;--yu zhi mi ma
signal b2: integer range 0 to 9:=5;
signal b3: integer range 0 to 9:=2;
begin
process(clk)
variable cnt1:integer range 0 to 200;
variable cnt2:integer range 0 to 250;
begin
if clk'event and clk='1' then
if cnt1=200 then
cnt1:=0;
if cnt2=250 then
cnt2:=0;
clock<=not clock;
else
cnt2:=cnt2+1;
end if;
else
cnt1:=cnt1+1;
end if ;
end if ;
end process;
process(clock)
function change(bcd:integer range 0 to 9)return std_logic_vector is
variable current : std_logic_vector(7 downto 0);
begin
case bcd is
when 0=> current:="11111100";
when 1=> current:="01100000";
when 2=> current:="11011010";
when 3=> current:="11110010";
when 4=> current:="01100110";
when 5=> current:="10110110";
when 6=> current:="10111110";
when 7=> current:="11100000";
when 8=> current:="11111110";
when 9=> current:="11110110";
end case;
return current;
end change;
begin
if rising_edge(clock) then
if p=2 then
p<=0;
else
p<=p+1;
end if ;
end if;
case p is
when 0=>wela<="000";dula<=change(p1);
when 1=>wela<="001";dula<=change(p2);
when 2=>wela<="010";dula<=change(p3);
end case;
end process;
process(clock)
variable keys:integer range 0 to 120:=0;
begin
if rising_edge(clock) then
if cnt3=0 then
p1<=cnt;
end if;
if cnt3=1 then
p2<=cnt;
end if;
if cnt3=2 then
p3<=cnt;
end if;
if cnt3=3 then
if (p1=b1)and(p2=b2)and(p3=b3)then
red<='1'; green<='0';
else
red<='0';green<='1';
end if;
end if;
case data is
when "01"=>
if keys=120 then
if cnt=9 then
cnt<=0;
else
cnt<=cnt+1;
end if;
keys:=0;
else keys:=keys+1;
end if;
when "10"=>
if keys=120 then
if cnt=0 then
cnt<=9;
else
cnt<=cnt-1;
end if;
keys:=0;
else
keys:=keys+1;
end if;
when others=>
end case;
end if;
end process;
process(clock)
variable keys:integer range 0 to 120:=0;
begin
if rising_edge(clock) then
case confirm is
when "01"=>
if keys=120 then
if cnt3=5 then
cnt3<=0;
else
cnt3<=cnt3+1;
end if;
keys:=0;
else keys:=keys+1;
end if;
when "10"=>
if keys=120 then
if cnt3=0 then
cnt3<=9;
else
cnt3<=cnt3-1;
end if;
keys:=0;
else
keys:=keys+1;
end if;
when others=>
end case;
end if;
end process;
end behave;
结 论
在这次实验中我遇到了很多小问题例如:在编写程序时各个部分的级联不好,总出现错误,但最后还是在细致的调试过程中都给解决了。在引脚定义时,数码管的段选顺序定义反了,结果是显示乱码。按键定义到拨码开关上结果当开关拨下去的时候,数字不停地从0到9循环,不能正常显示,通过修正引脚定义排除了以上问题。当按键按下时数码管显示的数字不是一个一个的增加,有时是加两个数有时是加三个数,最后通过不断地下载调试,结果是键盘去抖动时间太短导致无法正常工作,通过延长延时时间解决问题。数码管显示的三位数不是连续的在实验板上分别是第二、第四、第六。通过调整数码管位选值进行调整。最后调整为实验板上最后三位为密码显示位。在下载程序时没有硬件连接,通过添加硬件来建立下载通道。这些小的问题都在实验的过程中被一一克服了。通过这次实验使我们对EDA的开发过程有了一个更好认识。
EDA技术广泛应用于各种电子领域,它的技术推广是当今世界的技术热点,是现代电子工业中不可缺少的一项技术。
参考文献
[1孙延鹏、张芝贤、尹常永 VHDL于可编程逻辑器件应用 2006年12月
[2] 基于FPGA的EDA/SOPC技术与VHDL杨晓慧、杨永健2007年3月
致谢
在本次试验力我们遇到很多的问题,有一些是我们自己解决的,但是也有很多的问题是在指导教师的帮助下才完成的,所以在此感谢指导教师耐心的耐心的指导,使我们能在短暂的时间里有了很大的进步,使我们对sopc有了更深刻的认识。下载本文