课程设计(论文)基于VHDL的电子密码锁的设计_第1页
课程设计(论文)基于VHDL的电子密码锁的设计_第2页
课程设计(论文)基于VHDL的电子密码锁的设计_第3页
课程设计(论文)基于VHDL的电子密码锁的设计_第4页
课程设计(论文)基于VHDL的电子密码锁的设计_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、摘要fpga/vhdl是近几年集成电路中发展最快的产品。由于fpga性能的高速发展以及设计人员自身能力的提高,可编程逻辑器件供应商将进一步扩大可编程芯片的领地,将复杂的专用芯片挤向高端和超复杂应用。据ic insights的数据显示,fpga市场从1999年的29亿美元增长到去年的56亿美元,几乎翻了一番。matas预计这种高速增长局面以后很难出现,但可编程逻辑器件依然是集成电路中最具活力和前途的产业。本文介绍的vhdl密码锁应具有如下功能:密码预先存入寄存器中,开锁时,输入密码存入另一寄存器中,当按下“确定”键时,启动比较器,比较两个寄存器中的内容,当结果相同时开锁;当结果不同时不开锁。用户

2、需要修改密码时,先开锁,再按“设定密码”,清除预先存入的密码,通过键盘输入新的2位十进制码,按“确定”完成。关键词:vhdl,密码锁,矩阵目录摘要1目录2一、 设计要求3二 电路组成3三 功能电路的设计41、总体设计框图42、键盘接口电路43时序产生电路64键盘扫描电路75键盘消抖电路86键盘译码电路107按键存储电路13(1)siso串行输入/串行输出14(2)sipo-串行输入/并行输出15(3)piso-并行输入/串行输出16(4)pipo-并行输入/并行输出178密码设置和比较模块189电锁控制电路设计19(1)数字按键输入部分19(2)功能键输入部分19(3)三种工作模式19附件1:

3、程序清单20一、 设计要求设计一个简单的数字电子密码锁,密码为6位。功能1、 密码输入:每按下一个键,要求在数码管上显示,并依次左移;2、密码清除:清除密码输入,并将输入置为”000000”;3、密码修改:将当前输入设为新的密码;4、上锁和开锁。二 电路组成为达到以上功能,可将电子密码锁分为以下几个模块:1、键盘接口电路键盘矩阵、键盘扫描、键盘消抖、键盘译码及按键存储。2、电锁控制电路:数字按键输入、存储及清除。功能按键的设计。密码清除、修改与存储。电锁的激活与解除。3、输出显示电路bcd 译码、动态扫描电路。三 功能电路的设计1、总体设计框图2、键盘接口电路矩阵式键盘工作原理:矩阵式键盘是一

4、种常见的输入装置,在计算机、电话、手机、微波炉等各工电子产品中被广泛应用。如图所示为一34 矩阵式键盘。矩阵式键盘以行、列形式排列,图中为4 行3 列,键盘上的每一个按键盘其实是一个开关电路,当某键被按下时,该按键所对应的位置就呈现逻辑0 的状态,键盘的扫描可以以行扫或列扫方式进行,图中为行扫方式,keyr3keyr0 为扫描信号,其中的某一位为0 即扫描其中的一行,具体见表1-1.键盘扫描信号keyr3 与第一行相连,keyr2 与第二行相连,依此类推。很显然,扫描信号的变化顺序为:0111、1011、1101、1110,周而复始。在扫描的过程中,当有键按下时,对应的键位就为逻辑0状态,从而

5、从keyc2.0 读出的键值相应列为0.具体情况如表1-2 所示:若从keyc2.0 读出的值全为1 时,表示没有键被按下,则不进行按键的处理。如果的键被按下,则将keyc2.0 读出的送至键盘译码电路进行译码。表1-2 键盘扫描与其对应的键值的关系时序产生电路:时序电路的产生:在一个系统的设计中,往往需要多种时钟信号,最为方便的方法是利用一个自由计数器来产生各种需要的频率。本电路需要:系统主时钟、消抖取样时钟和动态扫描时钟。3时序产生电路有如下vhdl 程序,请分析其输出结果:library ieee;use ieee.std_logic_1164.all;use ieee.std_logi

6、c_arith.all ;use ieee.std_logic_unsigned.all ;entity free_counter isport (clk : in std_logic ;clk_a : out std_logic ;clk_b : out std_logic_vector(1 downto 0) ;end free_counter ;architecture a of free_counter issignal q : std_logic_vector(6 downto 0);beginprocess (clk)beginif clkevent and clk = 1 the

7、nq = q + 1;end if;end process;clk_a = q(1) ;clk_b = q(4 downto 3) ;end a ;分析:首选信号q 建立一个9 位自由计数器,对输入主时钟进行降频处理;使用clk_a=q(1)语句,取得一个脉冲波形,对主时钟进行2 分频,其值为0、1、0、1;使用clk_b=q(4 downto 3)语句,取得一脉冲序列,依次为00、01、10、11、00.;4键盘扫描电路目标:提供键盘扫描信号,即表1-1 中的keyr3.0,变化顺序依次为0111、1011、1101、1110.。依次重复出现。程序清单:library ieee;use ie

8、ee.std_logic_1164.all;use ieee.std_logic_arith.all ;use ieee.std_logic_unsigned.all ;entity scan isport (clk : in std_logic ;clk_scan : out std_logic_vector (3 downto 0);end scan ;architecture a of scan issignal s : std_logic_vector(1 downto 0);signal q: std_logic_vectoe(3 downto 0);beginprocess (cl

9、k)beginif clkevent and clk=1 thenq = q+1;s :=q(3 downto 2);end if;end process;-排错!scan_out= 1110 when s=0 else1101 when s=1 else1011 when s=2 else0111 when s=3 else1111;end a ;说明:程序中,s 信号是用来产生扫描信号的四个状态,q 是为了对输入主时钟进行降频处理。5键盘消抖电路因为按键大多是机械式开关,在开关切换的瞬间会在接解点出现来回弹跳的现象,其现象可用图1-2表示:由图可见,虽然只是按了一次键,实际产生的按键信号却

10、不只跳动一次,经过取样信号的检查后,将会造成误码判,认为是按了两次键。如果调整取样频率,可以发现抖现象得到了改善。按键信号:取样信号:取样结果:调整取样频率后的情况如下:程序清单:library ieee;use ieee.std_logic_1164.all;library altera;use altera.maxplus2.all;entity debouncing isport(d_in, clk : in std_logic;dd1, dd0, qq1, qq0 : out std_logic ;d_out,d_out1 : out std_logic);end debouncing

11、 ;architecture a of debouncing issignal vcc, inv_d : std_logic ;signal q0, q1 : std_logic ;signal d1, d0 : std_logic ;beginvcc = 1 ;inv_d vcc , q = q0 , clk = clk, clrn = inv_d , prn = vcc);dff2 : dff port map (d =vcc , q = q1, clk = clk, clrn = q0 , prn = vcc);process (clk)beginif clkevent and clk=

12、1 thend0 = not q1;d1 = d0;end if ;end process ;dd0 = d0; dd1 = d1; qq1 = q1; qq0 = q0;d_out = not (d1 and not d0);d_out1 = not q1 ;end a;6键盘译码电路从前面所述的键盘扫描电路的输出可以看出,扫描得到的信号规律性不强,例如数字键主要用来输入数字,但键盘扫描输出无法拿来直接使用,必须对其进行译码才能使用。如表所示,只要使用casewhen 或when else 语句,便可完成设计。键盘译码程序清单:library ieee;use ieee.std_logic_

13、1164.all;use ieee.std_logic_arith.all ;use ieee.std_logic_unsigned.all ;-*entity keyboard_dec1 isport (clk : in std_logic ;clk_keyboard : in std_logic_vector (1 downto 0);c: in std_logic_vector (2 downto 0); -key code after debounceout_numb : out std_logic_vector(3 downto 0); - for numb. keyout_func

14、 : out std_logic_vector(3 downto 0); - for func. keyflag_numb : out std_logic ; -flag for numb. keyflag_func : out std_logic -flag for func. keykeyr3.0 keyc2.0 对应的按键 译码输出 功能011 1 0001 数码输入0111 101 2 0010 数码输入110 3 0011 数码输入011 4 0100 数码输入1011 101 5 0101 数码输入110 6 0110 数码输入011 7 0111 数码输入1101 101 8 1

15、000 数码输入110 9 1001 数码输入011 0 0100 激活电锁1110 101 0000 数码输入110 00017);end keyboard_dec1 ;-*architecture a of keyboard_dec1 issignal ff : std_logic ; -flag of func.signal fn : std_logic ; -flag of numb.signal z : std_logic_vector(4 downto 0) ; -scan codesignal f : std_logic_vector(3 downto 0) ; -for fun

16、c. codesignal n : std_logic_vector(3 downto 0) ; -for numb. codebeginprocess(clk)beginz n n n n n n n n n n n f f f = 1000 ;end case ;end if ;end process ;fn = not ( n(3) and n(2) and n(1) and n(0) ) ;ff = ( not f(3) and f(2) and not f(1) and not f(0) or (not f(3) and not f(2) andnot f(1) and f(0) )

17、 ;-connectionflag_numb = fn ;8flag_func = ff ;out_numb = n ;out_func = f ;end a;说明:1、键盘译码电路除了负责将键盘送出的数据进行译码外,另外就是在译码的同时,必须判别所按下的是数字键还是功能键。2、若为数字键,则 flag_numb=1,且out_num 输出bcd 码,并送往显示电路。3、若为功能键,则 flag_func=1,且out_func 输出4 位码,并送往电锁控制电路。7按键存储电路因为每次按键都会产生新的数据,可能会覆盖前面的数据,所以需要一个按键存储电路,将键盘扫描译码后的结果记录下来。这一功能

18、可以用移位寄存器来实现。常见的移位寄存器的下列四种:a.串行输入/串行输出(siso)b.串行输入/并行输出(sipo)c.并行输入/串行输出(piso)d.并行输入/并行输出(pipo)(1)siso串行输入/串行输出library ieee;use ieee.std_logic_1164.all;entity siso isport(data_in :in std_logic;clk :in std_logic;data_out :out std_logic);end siso ;architecture a of siso issignal q: std_logic_vector(3 d

19、ownto 0);beginprocess(clk)beginif clkevent and clk = 1 thenq(0) = data_in;for i in 1 to 3 loopq(i) = q(i-1);end loop;end if;end process;data_out = q(3);end a;(2)sipo-串行输入/并行输出library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all ;use ieee.std_logic_unsigned.all ;entity sipo isport(d_

20、in :in std_logic;clk :in std_logic;d_out :out std_logic_vector(3 downto 0);end sipo;architecture a of sipo issignal q: std_logic_vector(3 downto 0);beginprocess(clk)beginif clkevent and clk = 1 thenq(0) = d_in;for i in 1 to 3 loopq(i) = q(i-1);end loop;end if;end process;d_out = q;end a;(3)piso-并行输入

21、/串行输出library ieee;use ieee.std_logic_1164.all;entity piso isport(data_in :in std_logic_vector(3 downto 0);clk :in std_logic;nload :in std_logic;data_out :out std_logic);end piso;architecture a of piso issignal q: std_logic_vector(3 downto 0);beginprocess(nload,clk)beginif nload = 0 thenq = data_in;e

22、lsif clkevent and clk = 1 thenq(1) = q(0) ;for i in 1 to 3 loopq(i) = q(i-1);end loop;end if;end process;process(nload,clk)beginif nload = 0 thendata_out = 0;elsif clkevent and clk = 1 thendata_out = q(3);end if;end process;end a;(4)pipo-并行输入/并行输出library ieee;use ieee.std_logic_1164.all;use ieee.std

23、_logic_arith.all ;use ieee.std_logic_unsigned.all ;entity piso isport(data_in :in std_logic_vector(3 downto 0);clk :in std_logic;data_out :out std_logic_vector(3 downto 0);end piso;architecture a of piso issignal q: std_logic_vector(3 downto 0);beginprocess(nload,clk)beginif clkevent and clk = 1 the

24、nq=data_in;data_out=q;end if;end process;end a;8密码设置和比较模块该模块代码如下:process (a,reset,q,enter,set,clk)beginif clk=1 and clkevent thenif reset=1 then ab=0;elsif enter=1 thenif set=1 thennum=q;dv=a;elsif dv=a and q=num then ab=1;elsif qr3 then qr=qr+1;else alarm=1;end if;end if;if ab=1 and lockopen=1 then opn=1;el

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论