vhdl密码锁

合集下载

VHDL四位密码锁课程设计EDA

VHDL四位密码锁课程设计EDA

电子与信息工程学院EDA课程设计报告(2011 —2012 学年第一学期)课程名称:EDA课程设计与实现班级:电子0903学号:姓名:指导教师:陈智萍2011年09月一、目的1.掌握VHDL语言的使用,学会用VHDL语言来编程解决实际问题;2.学会使用EDA开发软件设计小型综合电路,掌握仿真的技巧;3.学会应用开发系统实现硬件电路,检验电路的功能。

二、内容和要求用VHDL语言设计一个密码锁,用波形仿真验证其功能后,实现到GW48实验系统。

功能描述:用于模仿密码锁的工作过程。

完成密码锁的核心控制功能。

功能要求:设计一个密码锁,平时处于等待状态。

管理员可以设置或更改密码。

如果不预置密码,密码缺省为“1234”。

用户如果需要开锁,按相应的按键进入输入密码状态,输入4位密码,按下确定键后,若密码正确,锁打开;若密码错误,将提示密码错误,要求重新输入,三次输入都错误,将发出报警信号。

报警后,只有管理员作相应的处理才能停止报警。

用户输入密码时,若输入错误,在按下确定键之前,可以通过按取消键重新输入。

正确开锁后,用户处理完毕后,按下确定键,系统回到等待状态。

系统操作过程中,只要密码锁没有打开,如果60秒没有对系统操作,系统回到等待状态。

要求密码在输入过程中被依次显示,即先输入的为密码的第一位,总是显示在最左边。

用两个发光二极管模拟显示,其中一个显示当前的工作模式,灭表示用户模式,亮表示管理员模式;另外一个指示锁的状态,灭表示锁处于锁定,亮表示锁被开启。

注意:用两个按键实现密码输入,Key1选择输入的是第几位密码,KEY2输入密码数字。

功能描述:初始状态:初次使用密码锁时,要先用Reset键初始化。

初始状态下,用户密码为“1234”,管理员密码为“0000”。

用户开锁:默认情况下,密码锁处于用户使用状态。

如果当前为管理员状态,则按下user键回到用户状态。

用户开锁时,输入四位数用户密码,可以从out_code6的输出状态确定密码输入状态。

基于VHDL的电子密码锁[优质文档]

基于VHDL的电子密码锁[优质文档]

华南师范大学课程设计实验报告课程名称:可编程数字系统设计课程设计题目:电子密码锁*名:**学院:物理与电信工程学院专业:理综一班年级:2011学号:20112600104一、设计原理用VHDL设计电子密码锁方案:作为通用电子密码锁,主要由 3 个部分组成:数字密码按键输入电路、密码锁控制电路和密码锁显示电路,作为电子密码锁的输入电路。

可供选择的方案有数字机械式键盘和触摸式数字键盘等多种。

(1)密码锁输入电路包括时序产生电路、键盘检测电路、键盘消抖电路等几个小的功能电路。

(2)密码锁控制电路包括按键数据存储电路,恢复出厂密码、两次正确输入后可修改密码、密码核对,多次错误报警,清屏等几个小的功能电路。

(3)八段数码管显示电路主要将待显示数据的BCD码转换成数码器的八段显示驱动编码。

二、系统分析本次课程设计成功地设计了一个简单的数字电子密码锁,密码为 4 位。

将电子密码锁分为以下几个模块:按键消抖模块、密码锁逻辑控制模块和密码锁显示模块,实现了以下功能:(1)密码输入:KEY1按下一次,数码管上显示数字加一,相应位置输入密码加一(2)位置选择:KEY2按下一次,数码管选择位左移一位(3)密码确认:KEY3按下一次,比较外部输入密码与原密码,正确LED长亮,错误LED变暗,同时显示密码置0;(4)密码修改:正确输入两次密码后,按下KEY4一次,将当前输入设为新的密码;(5)清屏:KEY5按下一次,外部输入置0;(6)恢复出厂设置:连续按下KEY5三次后恢复出厂密码“1234”;三、程序设计1由于程序稍显庞大,故采取分层次设计的方法,顶层采用画图法设计,底层采用VHDL 语言进行设计。

顶层电路图如图1所示图1Xiao_dou模块为按键消抖模块,main为密码锁控制模块,yima为数码管显示译码模块。

Set_shuma端口为数码管段选端口,用于选择数码管。

Led端口为led灯端口,key1,key2,key3,key4,key5为五个按键接口,show_shuma端口为数码管位选选择端口。

vhdl 数字密码锁的实现

vhdl 数字密码锁的实现

vhdl实现数字密码锁密码锁应具有如下功能:密码预先存入寄存器中,开锁时,输入密码存入另一寄存器中,当按下“确定”键时,启动比较器,比较两个寄存器中的内容,当结果相同时Q=1,LT绿灯亮,并开锁;当结果不同时Q=0,LF红灯亮,不开锁。

用户需要修改密码时,先开锁,再按“设定密码”,清除预先存入的密码,通过键盘输入新的2位十进制码,按“确定”完成。

本次设计采用“自上而下”的设计方法,系统按照逻辑功能划分为两个大的模块:控制部分和处理部分。

根据上节的系统分析,这两个大的模块可分为几个小的功能模块。

其中处理部分包括时序产生电路、键盘扫描电路、键盘弹跳消除电路、键盘译码电路等几个小的功能电路。

密码锁控制电路包括按键数据的缓冲存储电路,密码的清楚、变更、存储、激活电锁电路(寄存器清除信号发生电路),密码核对(数值比较电路),解锁电路(开/关门锁电路)等几个小的功能电路。

键盘输入去抖电路的VHDL源程序DCFQ.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY DCFQ ISPORT(CLK,CLRN,PRN,D:IN STD_LOGIC);Q:OUT STD_LOGIC);END ENTITY DCFQ;ARCHITECTURE ART OF DCFQ ISBEGINPROCESS (CLK,CLRN,PRN)BEGINIF CLRN=’0’AND PRN=’1’THENQ<=’0’;ELSIF CLRN=’1’AND PRN=’0’THENQ<=’1’;ELSIF CLK’EVENT AND CLK=’1’THENQ<=D;END IF;END PROCESS;END ARCHITECTURE ART;--DEBOUNCING.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;LIBRARY ALTERA;USE ALTER.MAXPLUS2.ALL;ENTITY DEBOUCING ISPORT(D_IN,CLK:IN STD_LOGIC;DD1,DD0,QQ1,QQ0:OUT_LOGIC;D_OUT,D_OUT1:OUT STD_LOGIC);END ENTITY DEBOUNCING;ARCHITECTURE ART OF DEBOUNCING ISCOMPONENT DCFQ ISPORT(CLK,CLRN,PRN,D:IN STD_LOGIC;Q:OUT STD_LOGIC);END COMPONENT DCFQ;SIGNAL VCC,INV_D:STD_LOGIC;SIGNAL Q0,Q1:STD_LOGIC;SIGNAL D1,D0:STD_LOGIC;BEGINVCC<=’1’;INV_D<=NOT D_IN;U1:CFQ PORT MAP(CLK=>CLK,CLRN=>INV_D,PRN=>VCC,D=>VCC,Q=>Q0);U2:CFQ PORT MAP(CLK=>CLK,CLRN=>Q0,PRN=>VCC,D=>VCC,D=>VCC,Q=>Q1); PROCESS (CLK)BEGINIF CLK’EVENT AND CLK=’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 ARCHITECTURE ART--密码锁输入电路--KEYBOARD.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSINGNED.ALL;ENTITY KEYBOARD ISPORT(CLK_1K:IN STD_LOGIC;KEY_IN:IN STD_LOGIC_VECTOR(2 DOWNTO 0);CLK_SACN:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);DATA_N:OUT STD_LOGIC_VECTOR(3 DOWNTO );DATA_F:OUT STD_LOGIC_VECTOR(3 DOWNTO );FLAG_N:OUT STD_LOGIC;FLAG_F:OUT STD_LOGIC;CLK_CTR:OUT STD_LOGIC;CLK_DEBOUNCE:OUT STD_LOGIC);END ENTITY KEYBOATD;ARCHITECTURE ART OF KEYBOARD ISCOMPONENT DEBOUNGING ISPORT(D_IN:IN STD_LOGIC;CLK: IN STD_LOGIC;D_OUT:OUT STD_LOGIC);END COMPONENT DEBOUNGING;SIGNAL CLK:STD_LOGIC;SIGNAL C_KEYBOARD:STD_LOGIC_VECTOR(1 DOWNTO 0); SIGNAL C_DEBOUNCE:STD_LOGIC;SIGNAL C:STD_LOGIC_VECTOR(2 DOWNTO 0);SIGNAL N,F:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL FN,FF:STD_LOGIC;SIGNAL SEL:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN--内部连接DATA_N<=N;DATA_F<=F;FLAN_N<=FN;FLAN_F<=FF;CLK_CLR<=CLK;--扫描信号发生器COUNTER:BLOCK ISSIGNAL Q:STD_LOGIC_VECTOR(5 DOWNTO 0);SIGNAL SEL: STD_LOGIC_ VECTOR(3 DOWNTO 0); BEGINPROCESS(CLK_1K) ISBEGINIF CLK_1K’EVENT AND CLK_1K=’1’THENQ<=Q+1;ENDIF;C_DEBOUNCE<=Q(2);C_KEYBOARD<=Q(6 DOWNTO 5);--产生键扫描信号--C_DEBOUNCE<=Q(1);--C_KEYBOARD<=Q(5 DOWNTO 4);CLK<=Q(0);END PROCESS;CLK_DEBOUNG<=C_DEBOUNCE;SEL<=“1110”WHEN C_KEYBOARD=0 ELSE“1101”WHEN C_KEYBOARD=1 ELSE“1011”WHEN C_KEYBOARD=2 ELSE“0111”WHEN C_KEYBOARD=3 ELSE“1111”CLK_SCAN<=SEL;END BLOCK COUNTER;--键盘去抖DEBOUNUING :BLOCK ISBEGINU1: DEBOUNCING PORT MAP (D_IN=>KEY_IN(0),D_OUT=>C(0), CLK=>C_DEBOUNCE);U2: DEBOUNCING PORT MAP (D_IN=>KEY_IN(1),D_OUT=>C(1), CLK=>C_DEBOUNCE);U3: DEBOUNCING PORT MAP (D_IN=>KEY_IN(2),D_OUT=>C(2), CLK=>C_DEBOUNCE);END BLOCK DEBOUNUING;--键盘译码KEY_DECODER:BLOCKSIGNAL Z:STD_LOGIC_VECTOR(4 DOWNTO 0);BEGINZ<=C_KEYBOARD&CIF CLK’EVENT AND CLK=’1’ THENCASE Z ISWHEN“11101”=>N<=“0000”;0WHEN“00011”=>N<=“0001”;1WHEN“00101”=>N<=“0010”;2WHEN“11101”=>N<=“0000”;3WHEN“01011”=>N<=“0100”;4WHEN“01101”=>N<=“0101”;5WHEN“01110”=>N<=“0110”;6WHEN“10101”=>N<=“0111”;7WHEN“10110”=>N<=“1000”;8WHEN“10110”=>N<=“1001”;9WHEN OTHERS =>N<=“1111”;END CASE;END IF;IF CLK’EVENT AND CLK=’1’ THENCASE Z ISWHEN“11011”=>F<=“0100”;WHEN“11110”=>F<=“0001”;WHEN OTHERS =>F<=“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 ART;--密码控制电路的VHDL源程序--CTRL.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSINGED.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;CLK: IN STD_LOGIC;ENLOCK: OUT STD_LOGIC;DATA_BCD: OUT STD_LOGIC_VECTOR(15 DOWNTO 0)); END ENTTY CTRL;ARCHITECTURE ART OF CTRL ISSIGNAL ACC,REG:STD_LOGIC_VECTOR(15 DOWNTO 0); SIGNAL NC,REG:STD_LOGIC_VECTOR(2 DOWNTO 0);SIGNAL RR2,CLR,BB,QA,QB:STD_LOGIC;SIGNAL R1,R0:STD_LOGIC;BEGINPROCESS(CLK)BEGINIF CLK’EVENT AND CLK=’1’THENR1<=R0;R0<=FLAG_F;END IF;RR2<=R1 AND NOT R0;CLR<=RR2;END PROCESS;--按键输入数据的存储、清零进程KEYIN_PROCESS:BLOCK ISSIGNAL RST ,D0,D1:STD_LOGIC;BEGINRST<=RR2;PROCESS(FLAG_N,RST)ISBEGINIF RST =’1’ THENACC<=“00000000”;NC<=“000”;ELSEIF FLAG_N’EVENT AND FLAG_N=’1’ THENIF NC<4 THENACC<=ACC(11 DOWNTO 0)&DATA_N;NC<=NC+1;END IF;END IF;END IF;END PROCESS;END BLOCK KEYIN_PROCESS;--上锁、开锁控制LOCK_PROCESS:BLOCK ISBEGINPROCESS(CLK,DATA_F)ISBEGINIF(CLK’EVENT AND CLK=’1’)THEN IF NC=4 THENIF DATA_F(2)=’1’THENREG<=ACC;QA<=’1’;QB<=’0’;ELSIF DATA_F(0)=’1’THENIF REG=ACC THENQA<=’0’;QB<=’1’;END IF;ELSIF ACC=”10001000”QA<=’0’;QB<=’1’;END IF;END IF;END IF;END PROCESS;END BLOCK LOCK_PROCESS;ENLOCK<=QA AND NOT QB;DATA_BCD<=ACC;END ARCHITETURE ART;。

《基于VHDL语言和FPGA的电子密码锁》范文

《基于VHDL语言和FPGA的电子密码锁》范文

《基于VHDL语言和FPGA的电子密码锁》篇一一、引言随着科技的发展,电子密码锁已逐渐取代传统的锁具,成为了安全领域的重要组成部分。

而作为电子密码锁核心技术之一的FPGA(现场可编程门阵列)技术,以及VHDL语言编程的灵活性,更是对密码锁设计起到了重要的推动作用。

本文旨在详细探讨基于VHDL语言和FPGA的电子密码锁的设计与实现。

二、VHDL语言与FPGA概述VHDL(VHSIC Hardware Description Language)是一种硬件描述语言,用于描述电子系统的结构和行为。

而FPGA则是一种可编程逻辑器件,其内部由许多可配置的逻辑单元组成,通过编程可以实现各种复杂的数字电路功能。

将VHDL语言与FPGA相结合,可以实现电子密码锁的高效、灵活和可定制的设计。

三、电子密码锁的设计要求在基于VHDL语言和FPGA的电子密码锁设计中,首先需要明确设计要求。

这些要求包括:高安全性、易于使用、良好的扩展性以及低成本等。

此外,密码锁应能抵抗各种常见的攻击方式,如暴力破解等。

四、基于VHDL的密码锁设计与实现基于VHDL语言的电子密码锁设计主要分为几个模块:密码输入模块、解码模块、控制模块和输出模块等。

密码输入模块负责接收用户输入的密码;解码模块对输入的密码进行解码,判断其是否正确;控制模块根据解码结果控制输出模块的开关状态;而整个系统则由FPGA实现。

在VHDL编程中,需要详细描述各个模块的功能、接口以及它们之间的通信方式。

例如,密码输入模块应能接收一定长度的密码输入,并将其传递给解码模块。

解码模块则根据预设的算法对密码进行解码,并将结果传递给控制模块。

控制模块根据解码结果控制输出模块的开关状态,以实现密码锁的开启或关闭。

五、FPGA的实现与优化在FPGA上实现电子密码锁时,需要利用FPGA的编程工具进行编程和配置。

首先,将VHDL代码编译成可在FPGA上运行的二进制代码;然后,将二进制代码下载到FPGA中,实现对电子密码锁的硬件配置。

vhdl密码锁

vhdl密码锁

VHDL实验报告数字密码锁专业:信息工程学号:姓名:2010年12月一、实验任务及设计要求1、安锁状态按下开关键SETUP,密码设置灯亮时,方可进行密码设置操作。

设置初始密码0~9(或二进制四位数),必要时可以更换。

再按SETUP键,密码有效。

2、开锁状态(1)按启动键(START)启动开锁程序,此时系统内部是初始状态。

(2)依次键入0~9(或二进制四位数)。

(3)按开门键(OPEN)准备开门。

若按上述程序执行且拨号正确,则开门指示灯A亮,若按错密码或未按上述程序执行,则按动开门键OPEN后,警报装置鸣叫,B灯亮。

(4)开锁处理事务完毕后,应将门关上,按SETUP键使系统重新进入安锁状态。

若在报警状态,按SETUP键或START键不起作用,应按RESET键才能使系统进入安锁状态。

3、使用者如按错密码,可在按OPEN键之前,按RESET键重新启动开锁程序。

4、用层次化设计方法设计该电路,编写各个功能模块的程序。

5、仿真各功能模块,通过观察有关波形确认电路设计是否正确。

6、完成电路设计后,用实验系统下载验证设计的正确性。

二、系统结构反馈信号图一系统原理图1、锁存器:用于实现设定密码(锁存器1)和输入密码锁存器2的存储。

2、比较器:用于将设定密码与输入密码相比较。

其中,CLK为外部输入的时钟信号。

若输入密码正确,则A灯亮;否则B灯亮。

同时比较器输出与CLK一样的信号,驱动蜂鸣器发出警报声。

3、开锁控制器:当反馈信号下降沿来到时,开锁控制输出低电平,用于在输入错误密码后,禁止再次安锁;当RESET脚位高电平时,开锁控制输出高电平,打开与门,这时锁存器1使能端的变化受控于SETUP键,重新进入安锁状态。

4、LED显示:用于设定密码或输入密码的显示。

此项设计的目的是为了在下载演示时,能清楚地看到设置和输入的密码值。

二、硬件电路设计1、设密码模块设密码模块如下图所示,包括复位键(RESET),密码设定选择键(SETUP),反馈信号(FD)和信号输出(CODE_OUT)以及LED输出。

VHDL课程设计—数字密码锁电路

VHDL课程设计—数字密码锁电路

VHDL课程设计——数字密码锁班级:计052—2班学号:200525502204姓名:杨彦涛指导老师:沈春华日期:2007-1一、设计要求设计一个简易的数字密码锁,该锁应在收到3位与规定码相符的十进制数码时打开,使相应的指示灯点亮;若收到的代码与规定的不符或者开锁程序有误,表示错误的只是灯点亮。

二、系统功能描述1、系统接通电源后,首先按动setup键后方投入运行。

运行时标志开门的指示灯和报警灯、铃皆不工作,系统处于安锁状态。

2、开锁代码是3位十进制数,可以通过系统预先设定。

开锁时输入代码不足三位或超过三位均不能开锁。

3、开锁程序由设计者确定,用户必须严格执行所规定的程序,方可开锁。

4、开锁代码和程序正确,表示数字锁打开的指示灯亮。

5、允许用户在开锁过程中有1次错误(输入代码错误或开锁程序错误),只要出错,表示错误的指示灯必定点亮。

如果有2次错误,则报警器——喇叭名叫,以示情况异常。

6、开锁程序为:(1)按启动键(start)启动开锁程序,此时系统内部分处于初始状态。

(2)依次键入十进制码。

(3)按开门键(open)准备开门。

若按上述程序执行且拨号正确,则开门继电器工作,lock=1;若密码输入错误或未按上述程序执行,则按动开门键(open)后报警灯亮,红灯亮。

(4)开锁事务处理完毕后,应将门关上,按set键,使系统重新进入安锁状态。

(若在报警,按set或start均不起作用,应另用一内部的I_setup键才能使系统进入安锁状态)。

(5)若按错号码,可在按confirm键之前按start键重新启动开锁程序。

7、号码0-9,start,open,setcode,confirm均用按键产生。

8、alarm表示警报,red表示红灯,lock表示开锁信号。

三、密码锁控制器的MDS图及其功能说明。

当系统处于s0状态时,为安锁状态按start 进入开锁程序s2,输入代码确定,按open 进入s2状态,如果输入正确,进入s3状态并输出gree=1; .此时按setup 可以重新进入安锁状态。

VHDL专题—电子密码锁

VHDL专题—电子密码锁

VHDL专题--------电子密码锁一、设计要求:设计一个简单的数字电子密码锁,密码为4位。

功能:1、密码输入:每按下一个键,要求在数码管上显示,并依次左移;2、密码清除:清除密码输入,并将输入置为”0000”;3、密码修改:将当前输入设为新的密码;4、上锁和开锁。

二、电路组成:为达到以上功能,可将电子密码锁分为以下几个模块:1、键盘接口电路:键盘矩阵、键盘扫描、键盘消抖、键盘译码及按键存储。

2、电锁控制电路:数字按键输入、存储及清除。

功能按键的设计。

密码清除、修改与存储。

电锁的激活与解除。

3、输出显示电路BCD译码、动态扫描电路。

三、功能电路的设计:1、键盘接口电路:矩阵式键盘工作原理:矩阵式键盘是一种常见的输入装置,在计算机、电话、手机、微波炉等各工电子产品中被广泛应用。

如图所示为一3×4矩阵式键盘。

矩阵式键盘以行、列形式排列,图中为4行3列,键盘上的每一个按键盘其实是一个开关电路,当某键被按下时,该按键所对应的位置就呈现逻辑0的状态,键盘的扫描可以以行扫或列扫方式进行,图中为行扫方式,KEYR3—KEYR0为扫描信号,其中的某一位为0即扫描其中的一行,具体见表1-1.12键盘扫描信号KEYR3与第一行相连,KEYR2与第二行相连,依此类推。

很显然,扫描信号的变化顺序为:0111、1011、1101、1110,周而复始。

在扫描的过程中,当有键按下时,对应的键位就为逻辑0状态,从而从KEYC2..0读出的键值相应列为0.具体情况如表1-2所示:若从KEYC2..0读出的值全为1时,表示没有键被按下,则不进行按键的处理。

如果的键被按下,则将KEYC2..0读出的送至键盘译码电路进行译码。

表1-2 键盘扫描与其对应的键值的关系时序产生电路:在一个系统的设计中,往往需要多种时钟信号,最为方便的方法是利用一个自由计数器来产生各种需要的频率。

本电路需要:系统主时钟、消抖取样时钟和动态扫描时钟。

VHDL密码锁

VHDL密码锁

LIBRARY ieee;USE ieee.std_logic_1164.ALL;entity dff1 isport(d:in std_logic;clk:in std_logic;q:out std_logic);end ;architecture a of dff1 isbeginprocess(clk)beginif(clk'event and clk='1')thenq<=d;end if;end process;end ;--------------------------------------LIBRARY ieee;USE ieee.std_logic_1164.ALL;ENTITY debouncing ISPORT(d_in, clk : IN STD_LOGIC;d_out: OUT STD_LOGIC);END debouncing ;ARCHITECTURE a OF debouncing IS component dff1 isport(d:in std_logic;clk:in std_logic;q:out std_logic);end component ;signal q0, q1,q2,q3,q4 : std_logic ;BEGINu1 : dff1 PORT MAP (d=>d_in,q=>q0,clk=>clk);u2 : dff1 PORT MAP (d=>q0,q=>q1,clk=>clk);u3 : dff1 PORT MAP (d=>q1,q=>q2,clk=>clk);u4: dff1 PORT MAP (d=>q2,q=>q3,clk=>clk);d_out<=not(q0 and q1 and q2 and q3);END a;--------------------------------------------------------------------------------xiao dou library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity fen_pin isport(clk3:IN std_logic;clkout1,clkout2:OUT std_logic);end fen_pin;architecture one of fen_pin isbeginprocess(clk3)variable cnt:integer range 0 to 25000000;variable tmp:std_logic;beginif(clk3'event and clk3='1')thenif cnt>=3124999 then --125hz分频cnt:=0;tmp:=not tmp;else cnt:=cnt+1;end if;end if;clkout1<=tmp;end process;process(clk3)variable cnt:integer range 0 to 100000;variable tmp:std_logic;beginif(clk3'event and clk3='1')then --32hz分频if cnt>=79999 thencnt:=0;tmp:=not tmp;else cnt:=cnt+1;end if;end if;clkout2<=tmp;end process;end one;---------------------------------------------------------------分频library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all ;use ieee.std_logic_unsigned.all ;library altera;use altera.maxplus2.all;--*********************************************entity elec_lock isport(clk_1:in std_logic;clk_scan : buffer std_logic_vector (3 downto 0) ; --scan sequence键盘扫描时序key_in : in std_logic_vector (2 downto 0) ; --key in button code键盘输入flag_numb : out std_logic ; --GREENflag_func : out std_logic ;fnnn:out std_logic;enlock : out std_logic ; --REDsel:out std_logic_vector (3 downto 0) ; --fit to lp-2900segout: out std_logic_vector(6 downto 0) -- seg7 display);end elec_lock ;--*********************************************architecture a of elec_lock iscomponent debouncingport( d_in : in std_logic ;clk : in std_logic ;d_out : out std_logic ) ;end component ;component fen_pin isport(clk3:IN std_logic;clkout1,clkout2:OUT std_logic);end component;signal clk ,clk_4m,clk_32ms: std_logic ;signal clk_keyboard : std_logic_vector(1 downto 0) ;signal clk_debounce : std_logic ;signal bcd_code : std_logic_vector (15 downto 0) ;signal clk_display : std_logic_vector(1 downto 0) ;signal c : std_logic_vector(3 downto 0) ;signal n : std_logic_vector(3 downto 0) ;signal f ,selout: std_logic_vector(3 downto 0) ;signal fn : std_logic ;signal ff : std_logic ;signal out_numb : std_logic_vector(3 downto 0) ;signal out_func : std_logic_vector(3 downto 0) ;signal acc : std_logic_vector (15 downto 0) ;signal reg : std_logic_vector (15 downto 0) ;signal qa, qb, bb : std_logic ;signal fnn:std_logic;signal cc:std_logic_vector(3 downto 0);signal db : std_logic_vector( 3 downto 0);-- number to displaysignal seg : std_logic_vector( 6 downto 0);-- seg7 display signalbegin--*******************************************-- connection信号系统管脚连接out_numb <= n ;out_func <= f ;flag_numb <= fn ;flag_func <= ff ;clk_debounce <= clk ;segout(6 downto 0) <= seg; -- seven segment display--*********************************************g1:fen_pin port map(clk3=>clk_1,clkout1=>clk_4m,clkout2=>clk_32ms);-- scan signal generator脉冲产生电路,从系统时钟脉冲分频得到各种频率信号counter : blocksignal q : std_logic_vector(22 downto 0);signal s : std_logic_vector(1 downto 0) ; --keyboard scan about 15hz ***signal sel : std_logic_vector (3 downto 0);beginprocess (clk_4m)beginif clk_4m'event and clk_4m = '1' thenq <= q+1;end if;end process;clk <= q(0) ; --clk = clk_debounceclk_keyboard <= q(4 downto 3) ; -- ***00-01-10-11 产生键盘扫描信号clk_display <= q(4 downto 3) ;--产生显示器的扫描信号-- to generate keyboard scan sequence 1110->1101->1011->0111--从clk对应产生键盘扫描序列1110->1101->1011->0111selout <= "1110" when clk_keyboard=0 else"1101" when clk_keyboard=1 else"1011" when clk_keyboard=2 else"0111" ;clk_scan <= selout ;end block counter ;--*********************************************--以下为弹跳消除电路--debounuing cktdebounuing : blockbeginu1: debouncing port map (d_in => clk_scan(0) ,d_out => c(0) ,clk => clk);u2: debouncing port map (d_in => clk_scan(1) ,d_out => c(1) ,clk => clk);u3: debouncing port map (d_in => clk_scan(2) ,d_out => c(2) ,clk => clk);u4: debouncing port map (d_in => clk_scan(3) ,d_out => c(3) ,clk => clk);end block debounuing ;--****************************************************** --key_decoder键盘译码电路key_decoder : blocksignal z : std_logic_vector(4 downto 0) ; --key positionsignal r1, r0 : std_logic ;beginprocess(clk)beginz <= clk_keyboard & key_in ;if clk'event and clk = '1' thencase z is --数字按键的译码when "11101" => n <= "0000" ;--0when "00011" => n <= "0001" ;--1when "00101" => n <= "0010" ;--2when "00110" => n <= "0011" ;--3when "01011" => n <= "0100" ;--4when "01101" => n <= "0101" ;--5when "01110" => n <= "0110" ;--6when "10011" => n <= "0111" ;--7when "10101" => n <= "1000" ;--8when "10110" => n <= "1001" ;--9when others => n <= "1111" ;end case ;end if ;--****************************if clk'event and clk = '1' thencase z is --功能按键的译码when "11011" => f <= "0100" ;--*_lockwhen "11110" => f <= "0001" ;--#_unlockwhen others => f <= "1000" ;end case ;end if ;end process ;fn <=( 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) and not f(1) and f(0) ) ; --产生功能标志--to generate clear signal for acc--利用8_1键盘电路中的按键标志(ff)来产生寄存器的清除信号end block key_decoder ;--*****************************************************--keyin /// back /// all clear--数字输入时的寄存器控制keyin_process :blocksignal rst,d0,d1: std_logic ;beginprocess(clk,fn,rst)beginif rst = '1' thenacc <= "0000000000000000" ; --当清除时,寄存器的内容清零elseif fn'event and fn = '0' thenacc <= acc(11 downto 0) & n ;bb <= '0' ;elsebb <= '1' ;end if ;end if ;end process ;end block keyin_process ;--*********************************************--激活电锁或解除电锁lock_process : blockbeginprocess(clk,f)beginif (clk'event and clk = '1') thenif f(2) = '1' then --lockreg <= acc ;qa <= '1' ; qb <= '0';cc<="0000";elsif f(0) = '1' then --unlockif reg = acc then --check pin codeqb <= '1' ; qa<='0';else cc<=cc+"0001";end if ;if cc="0010" then fnn<='0';fnn<='1';end if;if cc="0011" then fnn<='0';fnn<='1';end if;if cc>"0011" then fnn<='0';else fnn<='1';end if;elsif acc = "0001010100011001" then--设定"0010010110000000"即“2580”为万能密码,无论之前密码为何,输入次密码皆可开锁qb <= '1' ; qa<= '0';fnn<='1';end if ;end if;end process ;end block lock_process ;enlock<= qa and not qb;fnnn<=fnn;bcd_code <= acc ;--**********************************************multiplexer : blockbegin--决定寄存器中哪一组数据被送出process(clk_32ms)beginif clk_32ms'event and clk_32ms='1' thencase clk_display iswhen "00"=>db<= acc(15 downto 12);when "01"=>db<=acc(11 downto 8) ;when "10"=>db<=acc(7 downto 4);when "11" =>db<=acc(3 downto 0);end case;--决定哪一个七段显示器被点亮case clk_display iswhen "00"=>sel<="0001";when "01"=>sel<="0010";when "10"=>sel<="0100";when "11"=>sel<="1000";end case;end if;end process;end block multiplexer ;--********************************************** seven_segment : block --BCD转换成七段显示器码begin--gfedcbaseg <= "0111111" when db = 0 else"0000110" when db = 1 else"1011011" when db = 2 else"1001111" when db = 3 else"1100110" when db = 4 else"1101101" when db = 5 else"1111101" when db = 6 else"0000111" when db = 7 else"1111111" when db = 8 else"1101111" when db = 9 else"1111111";end block seven_segment;end a;。

基于-VerilogHDL的数字密码锁的设计

基于-VerilogHDL的数字密码锁的设计

基于Verilog HDL的数字密码锁设计是一种常见的数字电路设计项目,它可以帮助学生理解数字逻辑电路和Verilog HDL的应用。

下面将详细介绍数字密码锁的设计方案。

一、系统结构设计数字密码锁主要由数字键盘、数码管显示、密码比对模块和控制逻辑组成。

数字键盘用于输入密码,数码管显示用于显示密码输入状态和开锁结果,密码比对模块用于比对输入的密码和预设的密码是否一致,控制逻辑用于控制整个系统的运行。

二、硬件设计1. 数字键盘:数字键盘采用矩阵式键盘,通过扫描按键来获取用户输入的密码。

2. 数码管显示:数码管用于显示密码输入状态,例如显示“请输入密码”、“密码正确”或“密码错误”等信息。

3. 密码比对模块:密码比对模块接收输入的密码和预设的密码,在Verilog HDL中实现密码比对逻辑。

4. 控制逻辑:控制逻辑用于控制密码输入、比对和显示的流程,以及控制门锁的开关。

三、Verilog HDL设计1. 数字键盘输入模块:编写Verilog HDL代码来接收数字键盘输入的密码。

2. 密码比对模块:编写Verilog HDL代码来比对输入的密码和预设的密码,输出比对结果。

3. 数码管控制模块:编写Verilog HDL代码来控制数码管的显示,根据密码比对结果显示相应的信息。

四、系统功能设计1. 密码输入功能:用户通过数字键盘输入密码。

2. 密码比对功能:系统对输入的密码进行比对,判断密码是否正确。

3. 显示功能:数码管显示密码输入状态和开锁结果。

五、仿真与综合完成Verilog HDL代码设计后,进行仿真验证,确保系统能够正常工作。

然后进行综合和布局布线,生成FPGA可编程文件。

六、总结与展望通过数字密码锁的设计,学生可以深入理解数字逻辑电路、Verilog HDL语言的应用,并且掌握数字密码锁系统的设计原理。

未来,可以进一步优化系统功能,增加更多的安全性和便利性功能,提升系统的性能和可靠性。

VHDL电子密码锁课程设计

VHDL电子密码锁课程设计

VHDL电子密码锁课程设计一、课程目标知识目标:1. 学生能理解VHDL语言的基本语法和程序结构,掌握利用VHDL进行数字电路设计的基本方法。

2. 学生能够描述电子密码锁的工作原理,了解其电路组成和功能模块。

3. 学生能够运用所学知识,设计并实现一个简单的电子密码锁程序。

技能目标:1. 学生能够运用VHDL语言进行代码编写,培养编程实践能力。

2. 学生通过课程设计,提高问题分析、解决能力,培养创新思维和团队协作能力。

3. 学生能够运用仿真软件对设计的电子密码锁进行功能验证,提高实际操作能力。

情感态度价值观目标:1. 学生通过课程学习,培养对电子技术和数字电路设计的兴趣,提高学习积极性。

2. 学生在课程实践中,树立正确的工程观念,认识到技术发展对社会进步的重要性。

3. 学生在团队协作中,学会尊重他人、沟通协作,培养良好的团队合作精神。

本课程旨在帮助学生将理论知识与实践相结合,通过电子密码锁的设计与实现,提高学生的编程能力、问题解决能力和团队协作能力,培养学生对电子技术的兴趣和正确价值观。

二、教学内容1. VHDL语言基础:包括VHDL的基本语法、数据类型、运算符、信号与变量、进程和顺序语句等,对应教材第1-3章内容。

2. 数字电路设计方法:介绍组合逻辑电路和时序逻辑电路的设计方法,包括触发器、计数器等基本电路的设计,对应教材第4-5章内容。

3. 电子密码锁原理:分析电子密码锁的工作原理,包括密码设置、验证机制和开锁逻辑等,对应教材第6章实例分析部分。

4. VHDL代码编写:根据电子密码锁的原理,指导学生进行VHDL代码编写,实现密码设置、验证和开锁功能,对应教材第7章编程实践部分。

5. 功能仿真与验证:教授学生使用仿真软件进行电子密码锁的功能验证,确保设计的正确性,对应教材第8章仿真技术部分。

6. 课程设计与实践:安排课程设计任务,指导学生分组进行电子密码锁的设计、编程、仿真和调试,培养学生实践能力和团队协作精神。

VHDL密码锁(6位串行输入)

VHDL密码锁(6位串行输入)

《电子设计自动化》课程设计题目:数字密码锁电路(1.1)院(系)信息科学与工程学院专业 15通信工程届别班级学号姓名任课老师数字密码锁电路,难度系数1.1实验要求设计一个密码锁,有6位十进制数字密码,串行输入;能设置密码;有开锁和错误指示(LED);如果连续输错三次,则一刻钟内不能再开锁。

本设计的各个模块由相应的VHDL程序具体实现,并在QuartusⅡ9.0环境下进行了整体电路的模拟仿真,最终实现“密码锁设计”的要求。

实验设计要求6位串行输入,并且由于实验板输入键位的有限,还同时增加了输入密码与设置密码键位的重叠,使密码锁电路输入输出形成一个反馈,通过对输出的判断,让电路自动识别输入的数字是设置的密码还是输入的密码。

在程序初始载入实验板时,还要让密码锁的初始设置密码和输入密码相同,从而达到能够初始设置密码的逻辑要求。

同时因为实验板输出的LED灯有限,还要求设计的密码锁电路的显示能够在输入密码、设置密码和倒计时之间灵活智能选择,从而达到满足使用的要求。

密码锁在输入三次错误密码后需要开始一个一刻钟即900秒的倒计时,则需要设计一个逻辑电路使电路能够在输入和错误倒计时之间自由变化。

此为本实验设计的主要难点和创新。

目录1.系统设计 ................................................ (4)2.单元电路设计 ................................................ . (7)3.软件设计 ................................................ . (12)4.系统测试 ................................................ . (23)5.结论 ................................................ (24)6.参考文献 ................................................. .. (24)7.附录 ................................................ (25)8.其他 ................................................ (26)系统设计设计要求:设计一个密码锁,有6位十进制数字密码,串行输入;能设置密码;有开锁和错误指示(LED);如果连续输错三次,则一刻钟内不能再开锁。

vhdl 密码锁

vhdl 密码锁

北京邮电大学数字电路与逻辑设计实验密码锁实验任务与要求设计并实现一个数字密码锁,密码锁有四位数字密码和一个确认开锁按键,密码输入正确,密码锁打开,密码输入错误进行警示。

基本要求:1、密码设置:通过键盘进行4位数字密码设定输入,在数码管上显示所输入数字。

通过密码设置确定键(BTN 键)进行锁定。

2、开锁:在闭锁状态下,可以输入密码开锁,且每输入一位密码,在数码管上显示“-”,提示已输入密码的位数。

输入四位核对密码后,按“开锁”键,若密码正确则系统开锁,若密码错误系统仍然处于闭锁状态,并用蜂鸣器或l ed 闪烁报警。

3、在开锁状态下,可以通过密码复位键(BTN 键)来清除密码,恢复初始密码“0000”。

闭锁状态下不能清除密码。

4、用点阵显示开锁和闭锁状态。

提高要求:1、输入密码数字由右向左依次显示,即:每输入一数字显示在最右边的数码管上,同时将先前输入的所有数字向左移动一位。

2、密码锁的密码位数(4~6 位)可调。

3、自拟其它功能。

二、系统设计设计思路本设计按照不同功能将具体实现分为不同模块,分别是时钟分频,防抖动,数码管扫描与显示,报警模块,密码验证模块,点阵显示模块,键盘输入模块以及功能键模块。

总体框图分块设计时钟模块:密码锁的工作时钟由外部晶振提供,时钟频率为50Mhz。

对CLK进行分频输出三路时钟CLK1Khz,CLK1,CLK2,频率分别为1Khz,5hz,1hz。

数码管显示与扫描七段数码管是电子开发过程中常用的输出显示设备。

当数码管的中的一个段被输入高电平,则相应的这一段被点亮。

反之则不亮。

四位一体的七段数码管在单个静态数码管的基础上加入了用于选择哪一位数码管的位选信号端口。

八个数码管的a、b、c、d、e、f、g、h、dp都连在了一起,8个数码管分别由各自的位选信号来控制,被选通的数码管显示数据,其余关闭。

在键盘获取到行值和列值以后,组合成一个8位的数据,根据实现不同的编码在对每个按键进行匹配,找到键值后在7段码管显示。

电子密码锁vhdl课程设计

电子密码锁vhdl课程设计

电子密码锁vhdl课程设计一、课程目标知识目标:1. 学生理解VHDL语言的基本结构和编程原理;2. 学生掌握利用VHDL进行电子密码锁设计的方法;3. 学生了解电子密码锁的工作原理及其在现实生活中的应用。

技能目标:1. 学生能够运用VHDL语言编写简单的程序;2. 学生能够独立完成电子密码锁的VHDL代码编写、仿真与验证;3. 学生具备分析电子密码锁程序问题及优化代码的能力。

情感态度价值观目标:1. 学生培养对电子信息技术领域的兴趣和热情;2. 学生形成良好的编程习惯,注重团队协作,善于沟通交流;3. 学生认识到电子密码锁在保护信息安全中的重要性,增强信息安全意识。

课程性质:本课程为实践性课程,以项目为导向,结合理论知识与实际操作,培养学生的编程能力和实际应用能力。

学生特点:学生为高年级电子信息技术专业,具备一定的电子基础和编程能力,对实际应用有较高的兴趣。

教学要求:教师需注重理论与实践相结合,引导学生主动参与,鼓励学生思考、提问、实践,提高学生的综合运用能力。

同时,关注学生的个体差异,给予个性化指导,确保每个学生都能达到课程目标。

通过课程学习,使学生在知识、技能和情感态度价值观方面取得具体的学习成果。

二、教学内容1. VHDL语言基础:回顾VHDL的基本语法、数据类型、运算符、信号与变量等基础知识,确保学生掌握VHDL编程的基本框架。

相关教材章节:第一章至第三章2. 电子密码锁原理:讲解电子密码锁的工作原理、基本构成和设计方法,使学生了解电子密码锁在实际应用中的技术要求。

相关教材章节:第六章3. VHDL编程实践:a) 电子密码锁的VHDL代码编写:引导学生根据电子密码锁原理,编写相应的VHDL代码;b) 代码仿真与验证:教授学生如何使用仿真工具进行代码测试,确保程序的正确性和可靠性。

相关教材章节:第四章、第五章4. 程序优化与调试:分析电子密码锁程序中可能存在的问题,教授学生如何对程序进行优化和调试。

VHDL数字密码锁课程设计

VHDL数字密码锁课程设计

VHDL数字密码锁课程设计一、课程目标知识目标:1. 学生能理解VHDL语言的基本语法和程序结构,掌握数字密码锁的基本原理。

2. 学生能运用VHDL语言编写与数字密码锁相关的程序代码,实现基本功能。

3. 学生了解数字密码锁在实际工程中的应用,理解其重要性。

技能目标:1. 学生能运用所学知识,设计并实现一个简单的数字密码锁系统。

2. 学生通过实际操作,提高编程能力,培养解决实际问题的能力。

3. 学生能通过小组合作,提高团队协作和沟通能力。

情感态度价值观目标:1. 学生培养对电子设计及其编程的兴趣,激发创新意识。

2. 学生认识到科技发展对社会的重要性,增强社会责任感。

3. 学生在团队合作中,学会尊重他人,培养良好的沟通和协作精神。

课程性质:本课程为实践性课程,以培养学生的动手能力和实际编程技能为主。

学生特点:学生具备一定的电子基础和编程能力,对新鲜事物充满好奇心。

教学要求:教师需引导学生将理论知识与实际应用相结合,注重培养学生的实践能力和团队合作精神。

在教学过程中,将目标分解为具体的学习成果,以便于教学设计和评估。

二、教学内容1. 数字密码锁原理介绍:包括密码锁的工作机制、安全性分析等。

相关教材章节:第五章“数字密码锁设计原理”2. VHDL语言基础:回顾VHDL的基本语法、程序结构、数据类型和运算符等。

相关教材章节:第三章“VHDL语言基础”3. VHDL编程实践:a) 设计数字密码锁的实体和端口b) 编写行为描述和结构描述代码c) 仿真与调试相关教材章节:第四章“VHDL编程实例”和第六章“数字密码锁设计实例”4. 数字密码锁功能模块设计:a) 密码设置与修改b) 密码验证c) 锁定与解锁功能相关教材章节:第六章“数字密码锁功能模块设计”5. 数字密码锁系统集成与测试:a) 将各功能模块整合到一起,实现完整密码锁系统b) 进行系统测试,验证系统功能及性能相关教材章节:第七章“数字密码锁系统集成与测试”6. 课程项目实践:分组进行数字密码锁项目设计,培养学生的团队合作能力和实际操作技能。

vhdl密码锁

vhdl密码锁

VHDL实验报告数字密码锁专业:信息工程学号:姓名:2020年12月一、实验任务及设计要求一、安锁状态按下开关键SETUP,密码设置灯亮时,方可进行密码设置操作。

设置初始密码0~9(或二进制四位数),必要时能够改换。

再按SETUP键,密码有效。

二、开锁状态(1)按启动键(START)启动开锁程序,现在系统内部是初始状态。

(2)依次键入0~9(或二进制四位数)。

(3)按开门键(OPEN)预备开门。

假设按上述程序执行且拨号正确,那么开门指示灯A亮,假设按错密码或未按上述程序执行,那么按动开门键OPEN后,警报装置鸣叫,B灯亮。

(4)开锁处置事务完毕后,应将门关上,按SETUP键使系统从头进入安锁状态。

假设在报警状态,按SETUP键或START键不起作用,应按RESET键才能使系统进入安锁状态。

3、利用者如按错密码,可在按OPEN键之前,按RESET键从头启动开锁程序。

4、用层次化设计方式设计该电路,编写各个功能模块的程序。

5、仿真各功能模块,通过观看有关波形确认电路设计是不是正确。

6、完成电路设计后,用实验系统下载验证设计的正确性。

二、系统结构反馈信号图一系统原理图一、锁存器:用于实现设定密码(锁存器1)和输入密码锁存器2的存储。

二、比较器:用于将设定密码与输入密码相较较。

其中,CLK为外部输入的时钟信号。

假设输入密码正确,那么A灯亮;不然B灯亮。

同时比较器输出与CLK一样的信号,驱动蜂鸣器发出警报声。

3、开锁操纵器:当反馈信号下降沿来到时,开锁操纵输出低电平,用于在输入错误密码后,禁止再次安锁;当RESET脚位高电平常,开锁操纵输出高电平,打开与门,这时锁存器1使能端的转变受控于SETUP键,从头进入安锁状态。

4、LED显示:用于设定密码或输入密码的显示。

此项设计的目的是为了在下载演示时,能清楚地看到设置和输入的密码值。

二、硬件电路设计一、设密码模块设密码模块如以下图所示,包括复位键(RESET),密码设定选择键(SETUP),反馈信号(FD)和信号输出(CODE_OUT)和LED输出。

VHDL电子密码锁

VHDL电子密码锁

设计一个6位并行(或串行)电子密码锁,要求当输入的密码与锁内的密码一致时,,绿灯亮,开锁;当输入的密码与锁内的密码不一致时,红灯亮,不能开锁。

密码可由用户自行设置。

设计要求:1分析设计任务,拟定多种设计方案,根据实验条件,选定其中一种方案绘制系统框图和设计流程。

2设计相关电路并编写VHDL程序。

3对设计电路进行功能仿真,分析仿真波形。

4对设计电路要进行编程下载,记录结果。

5撰写设计报告一份。

设计方案(1)采用文本输入法,用一个源程序控制整个电路,然后利用顶层文件将它们综合起来,最终使其具有电子密码锁的功能。

(2)采用文本和原理图两种方法设计,密码锁的主体部分(包括密码设置、密码修改、密码检测、开锁电路、执行电路等部分。

)用文本设计法完成,当主体部分完成后,将其打包后,再用原理图输入法使各个部分综合起来。

由以上两种方案分析,方案(1)全部采用文本输入法,在顶层设计中比较杂,一旦出现错误,将不易更改,程序调试耗时会比较长。

方案(2)采用了文本和原理图两种方法进行设计,主体部分完成后,再用另一种方法设计译码部分,最后两部分综合,调试起来会比较方便。

综合以上原因,从实现难易,误差大小以及最终结果等各方面考虑,选择方案(2)来完成该实验。

根据方案(2)中密码锁的实现原理,本次设计方案可分为三个模块来实现其功能,即消抖电路、消抖同步电路、核心电路几个单元,在核心电路中又包括密码设置电路、密码输入电路、密码锁控制电路和密码锁显示电路四部分组成。

控制部分还需包含密码修改、密码检测、开锁电路、执行电路等部分。

分别用VHDL对其进行编程,实现消抖电路、消抖同步电路、核心电路等。

然后对其打包后,利用原理图输入法使各个部分综合起来。

系统结构消除抖动模块Library ieee;Use ieee.std_logic_1164.all; Entity fen isPort(clk:in std_logic;Cp :out std_logic);End fen;Architecture fen_arc of fen is BeginProcess(clk)Variable cnt:integer range 0 to 999; BeginIf clk'event and clk='1'thenIf cnt=9 thenCnt:=0;Cp<='1';ElseCnt:=cnt+1;Cp<='0';End if;End if;End process;End fen_arc;消抖同步模块library ieee;use ieee.std_logic_1164.all;entity xiaopro isport(a,clk2:in std_logic;b:out std_logic);end xiaopro;architecture xiao_arc of xiaopro is signal tmp1:std_logic;beginprocess(clk2,a)variable tmp3,tmp2:std_logic;beginif clk2'event and clk2='0'thentmp1<=a;tmp2:=tmp1;tmp3:=not tmp2;end if;b<=tmp1 and tmp3 and clk2;end process;end xiao_arc;逻辑功能模块Library ieee;Use ieee.std_logic_1164.all;Entity cornaa2 isPort(clk,k1,k0,clr,load:in std_logic;lt:inout std_logic;lamp:out std_logic_vector(5 downto 0);lf,alm:out std_logic);end cornaa2;architecture corn_arc of cornaa2 issignal shift,lock:std_logic_vector(5 downto 0); signal lam:std_logic_vector(5 downto 0); signal la:std_logic;beginprocess(clk,clr)beginIf clr='0'thenla<='0';elsif clk'event and clk='1' thenif load='0' thenla<='1';end if;end if;end process;process(clk,clr)variable a:integer range 0 to 6;beginIf clr='0' thenlam<="111111";Shift<="000000";a:=0;lt<='1';lf<='1';alm<='0';Elsif clk'event and clk='1'thenif la='1' thenif k1='0'thenlock<='1'&lock(5 downto 1);lam<='0'&lam(5 downto 1);elsif k0='0'thenlock<='0'&lock(5 downto 1);Lam<='0'&lam(5 downto 1);end if;elsif lt='1' thenif a/=6 thenif k1='0' thenShift<='1'&shift(5 downto 1);lam<='0'&lam(5 downto 1);a:=a+1;elsif k0='0' thenShift<='0'&shift(5 downto 1);lam<='0'&lam(5 downto 1);a:=a+1;end if;elsea:=0;if shift=lock thenlt<='0';elself<='0';alm<='1';end if;end if;end if;end if;end process;lamp<=lam;end corn_arc;密码锁的原理图。

VHDL密码锁实验报告

VHDL密码锁实验报告

华南师大学实验报告学生: 小澎学号: ***********_专业: 通信工程年级班级: 11级电通6C课程名称: 可编程数字系统实验项目: VHDL设计一密码锁试验时间: 2013年05月18日****: **一、课程设计目的熟悉EDA工具,掌握用VHDL语言进行数字系统设计的基本方法和流程,提高工程设计实践能力。

二、设计任务设计一密码锁,用VHDL语言描述,用QuartusII工具编译和综合,并在实验板上实现,撰写实验报告。

数字锁即电子密码锁,锁有预置密码,如果输入代码与锁密码一致,锁被打开;否则,应封闭开锁电路,若多次输入错误密码,应发出报警信号。

三、功能要求与技术指标本设计设计一个4 位数字锁,并验证其操作。

1、基本功能:(1 )开锁密码为 4 位十进制数,通过按钮输入密码,输入的密码在4个数码管上显示,若与锁预置的密码一致,输出开锁信号(以点亮一个LED灯表示开锁)。

(2)按钮开关输入须消抖处理。

2、扩展功能:(1)用户可以设置锁的密码;(2)若输入密码三次不正确,输出报警信号,报警信号可以通过闪烁LED或某个数码管上小数点指示。

(3)设置一个复位按键,忘记密码后可通过该复位按键恢复出厂原始密码,如原始密码为“1234”;(4)其它实用功能。

四、设计原理在数字电路设计中,自顶向下设计方法的主要思想是对数字系统进行划分,将复杂的设计原理简化为相对简单的模块设计,不同的模块用来完成数字系统中某一部分的具体功能。

此密码锁的设计可以分为以下几个模块:密码锁原理框图五、系统分析1、根据原理框图:系统大致可分为时钟模块,显示模块,控制模块。

时钟模块:密码锁的工作时钟由外部晶振提供,时钟频率为50Mhz。

对CLK进行分频输出三路时钟CLK1Khz,CLK1,CLK2,频率分别为1Khz,5hz,1hz。

由此,时钟分频模块原理框图如下:显示模块:数码管动态扫描模块以及数码管显示模块的时钟频率分别由CLK1Khz 和CLK提供。

vhdl密码锁

vhdl密码锁

vhdl密码锁密码锁设计⼀、课题描述:⽤于模仿密码锁的⼯作过程。

完成密码锁的核⼼控制功能。

⼆、功能要求:设计⼀个密码锁,平时处于等待状态。

管理员可以设置或更该密码。

如果不预置密码,密码缺省为“999999”。

⽤户如果需要开锁,按相应的按键进⼊输⼊密码状态,输⼊6位密码,按下确定键后,若密码正确,锁打开,若密码错误,将提⽰密码错误,要求重新输⼊,三次输⼊都错误,将发出报警信号。

报警后,只有管理员作相应的处理才能停⽌报警。

⽤户输⼊密码时,若输⼊错误,在按下确定键之前,可以通过按取消键重新输⼊。

正确开锁后,⽤户处理完毕后,按下确定键,系统回到等待状态。

系统操作过程中,只要密码锁没有打开,如果60秒没有对系统操作,系统回到等待状态。

注意:输⼊按键信号时必须⼀个按键⼀个按键输⼊,不得6个按键⼀起输⼊。

三、设计流程:1.结构框图:①按键输⼊;②复位(设置缺省密码);③等待状态④⼯作状态⑤修改密码⑥提醒错误及报警⑦开锁⑧恢复等待2.模块设计:★控制模块:实现输⼊输出,实现等待⼯作的转换,实现开锁及报警;★⽐较模块:⽐较输⼊密码与正确密码★寄存模块:存放密码★计数及使能模块:(1)输⼊个数为6,多于⽆效⾃动忽略;(2)60s的空闲时间,⽆操作返回等待;(3)错误次数为3(4)进⼊⼯作状态,是能段即打开,直到进⼊等待。

四、具体实现:★控制模块:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity ctrl isport( change,vers,keysign : in std_logic;ok,cancel : in std_logic;clk : in std_logic;result : in std_logic;wt : in std_logic;enable : out std_logic);end ctrl;architecture ctrl_behave of ctrl issignal sec : integer range 0 to 60;beginprocess(clk)beginenable<='1';end if;if (wt='1' and result='1') thenenable<='0';sec<=0;end if;if (change='0' and vers='0' and keysign='0' and ok='0' and cancel='0') then sec<=sec+1; if (sec=59) thenenable<='0';sec<=0;end if;elsesec<=0;end if;end if;end process;end ctrl_behave;★⽐较模块:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity ver isport( dt1,dt2,dt3,dt4,dt5,dt6 : in std_logic_vector(3 downto 0); cd1,cd2,cd3,cd4,cd5,cd6 : in std_logic_vector(3 downto 0); vers : in std_logic;ready : in std_logic;clk : in std_logic;stopalarm : in std_logic;en : in std_logic;result : out std_logic;wrong : out std_logic;alarm : out std_logic);end ver;architecture ver_behave of ver issignal alarmnum : integer range 0 to 3;signal vering : std_logic;signal wronging : std_logic;beginprocess(clk)beginif (en='0') thenresult<='0';end if;if (stopalarm='1') thenalarmnum<=0;end if;if (wronging='1') thenwronging<='0';vering<='1';end if;if (alarmnum<3) thenalarm<='0';elsealarm<='1';end if;if (vers='1') thenvering<='1';end if;if (vering='1') thenif (ready='1') thenif (cd1=dt1 and cd2=dt2 and cd3=dt3 and cd4=dt4 and cd5=dt5 and cd6=dt6) then result<='1';elseresult<='0';wronging<='1';if (alarmnum<3) thenalarmnum<=alarmnum+1;end if;end if;vering<='0';end if;end if;elsif (clk'event and clk='0') thenif (wronging='1') thenwrong<='1';elsif (wronging='0') thenwrong<='0';end if;end if;end process;end ver_behave;★寄存模块:library ieee;entity code isport( dt1,dt2,dt3,dt4,dt5,dt6 : in std_logic_vector(3 downto 0);change : in std_logic;ready : in std_logic;ok : in std_logic;clk : in std_logic;result : in std_logic;reset : in std_logic;wt : out std_logic;cd1,cd2,cd3,cd4,cd5,cd6 : out std_logic_vector(3 downto 0) ); end code;architecture code_behave of code issignal alarmnum : integer range 0 to 3;signal changing : std_logic;signal changed : std_logic;signal wting : std_logic;beginprocess(clk)beginif (clk'event and clk='1') thenif (ok='1' and changing='0' and result='1') thenwting<='1';elsewting<='0';end if;if (reset='1') thencd1<="1001";cd2<="1001";cd3<="1001";cd4<="1001";cd5<="1001";cd6<="1001";end if;if (change='1') thenchanging<='1';end if;if (changing='1') thenif (ready='1') thenif (result='1') thencd1<=dt1;cd2<=dt2;end if;changing<='0';end if;end if;elsif (clk'event and clk='0') thenif (wting='1') thenwt<='1';elsewt<='0';end if;end if;end process;end code_behave;★计数及使能模块:1library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity keyboard isport( a3,a2,a1,a0 : in std_logic;a : out std_logic_vector(3 downto 0);k : in std_logic;keysign : out std_logic;clk : in std_logic);end keyboard;architecture keyboard_behave of keyboard is beginprocess(clk)beginif (clk'event and clk='0') thena(0)<=a0;keysign<=k;end if;end process;end keyboard_behave;2library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity keyin isport( en : in std_logic;clk : in std_logic;a : in std_logic_vector(3 downto 0);keysign : in std_logic;ok : in std_logic;cancel : in std_logic;ver : in std_logic;ready : out std_logic;dt1,dt2,dt3,dt4,dt5,dt6 : out std_logic_vector(3 downto 0) ); end keyin;architecture keyin_behave of keyin issignal count : integer range 0 to 7;signal cready : std_logic;beginprocess(en,clk,keysign)beginif (en='1') thenif (clk'event and clk='1') thenif (keysign='1' and count<6) thencount<=count+1;if (count=0) thenelsif (count=1) thendt2<=a;elsif (count=2) thendt3<=a;elsif (count=3) thendt4<=a;elsif (count=4) thendt5<=a;elsif (count=5) thendt6<=a;end if;end if;if (ver='1') thencount<=0;end if;if (cancel='1') thendt2<="1111";dt3<="1111";dt4<="1111";dt5<="1111";dt6<="1111";end if;if (ok='1') thencount<=0;cready<='1';elsecready<='0';end if;elsif (clk'event and clk='0') then if (cready='1') thenready<='1';elseready<='0';end if;end if;end process;end keyin_behave;‘※各个模块与设计存在出⼊,但基本要求都达到,主要是⼩组分⼯时,没有能完全按照模块分块设计※计数器模块分散开没有单独形成模块※具体信号意义见仿真Block图:五、仿真:Reset:重置(缺省)A:输⼊k:判断有效输⼊OK:确认Cancel:取消Ver:进⼊⼯作(⽐较)Change:修改密码Clk:时钟信号Result:开锁En-out:使能Wrong:报错Alarm:报警Stopalarm:停⽌操作(管理员使⽤)1.验证缺省密码为999999(reset键);2.验证输⼊错误取消输⼊,重新输⼊(cancel键);3.验证60秒⽆操作⾃动返回等待界⾯(en-out和result归零);4.验证有效按键“k”,只有k为⾼电平有效;5.验证⽤户操作完成,再次按ok键,⾃动返回等待键;6.验证输⼊密码错误发出提⽰信号,连续三次输⼊错误,发出报警信号,只有按下stopalarm才能停⽌。

密码锁设计VHDL源程序文档

密码锁设计VHDL源程序文档

2.2系统的输入、输出端口以及寄存器清单及说明:CLK 输入时钟方波信号端口KIN 键盘按键输入端口KOUT 键盘完整编码码值输出端口(七位二进制数)KOUT1 扫描信号输出端口(三位二进制数)SIN 键盘消抖输入端口(七位二进制数)SOUT 键盘消抖输出端口(七位二进制数)LIN 键盘按键编码模块输入端口(七位二进制数)DF 数字按键标志寄存器FF 功能按键标志寄存器ND 数字按键识别编码寄存器NF 功能按键识别编码寄存器LOCK 电子密码锁上锁状态标志寄存器LOCK1 电子密码锁报警状态标志寄存器UNLOCK 电子密码锁开锁状态标志寄存器NULL1 电子密码锁无密码状态标志寄存器DATA 电子密码锁数码显示数据寄存器CAT 电子密码锁数码显示位选寄存器DISPLAY 电子密码锁数码显示段选寄存器(十七位二进制数)NUM0、NUM1、NUM2、NUM3数码显示中分位显示数据寄存器DISNUM 数码显示段选数据寄存器I1 数码显示计数器SCANS 键盘扫描中按键完整编码寄存器SCAN 键盘扫描寄存器CNT 键盘消抖计数器SIN1 键盘按键键值寄存器I 键盘扫描计数器DF1 数字按键状态标志寄存器ACC 键盘数字输入暂存器T 报警计数器REG 电子密码锁密码存储器NC 计数器1键盘输入扫描部分源程序LIBRARY IEEE;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_1164.ALL;ENTITY kbscan1 isPORT(clk:in STD_LOGIC;kin:in STD_LOGIC_VECTOR(3 DOWNTO 0);---PC7-PC4 kout:out STD_LOGIC_VECTOR(7 downto 0);--PC3--PCkout1: out STD_LOGIC_VECTOR(3 downto 0));end kbscan1;architecture a of kbscan1 issignal scans: std_logic_vector(7 downto 0);--PC7--PC0signal scan : std_logic_vector(3 downto 0);--PC3--PC0signal cnt :integer range 0 to 140;signal sin1:std_logic_vector(3 downto 0);signal i:integer range 0 to 3;beginscans<=scan& kin;kout<=scans;kout1<=scan;process(clk)beginif(falling_edge(clk))thenif(i=3)theni<=0;elsei<=i+1;end if;case i iswhen 0=>scan<="0001";when 1=>scan<="0010";when 2=>scan<="0100";when 3=>scan<="1000";end case;end if;end process;End a;2键盘输入消抖部分源程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY xiaodou isPort(clk :in STD_LOGIC;sin:in std_logic_vector(7 downto 0);sout:out std_logic_vector(7 downto 0));end xiaodou;architecture behavioral of xiaodou issignal cnt :integer range 0 to 120;signal sin1:std_logic_vector(7 downto 0);beginprocess(clk)beginsin1<=sin;if (rising_edge(clk))thenif(sin1=sin)thencnt<=cnt+1;elsesin1<=sin;cnt<=0;end if;if(cnt=120)thensout<=sin;cnt<=0;end if;end if;end process;end behavioral;3键盘输入编码部分源程序LIBRARY IEEE;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_1164.ALL;ENTITY bianma isPORT(clk:in STD_LOGIC;lin:in STD_LOGIC_VECTOR(7 DOWNTO 0);---PC7-PC4DF,FF: out std_logic;nd,nf:BUFFER std_logic_vector(3 downto 0));end bianma;architecture b of bianma isbeginprocess(clk)beginif clk'event and clk='1' thencase lin iswhen"10000001"=>ND<="0000";--0when"00010001"=>ND<="0001";--1when"00010010"=>ND<="0010";--2when"00010100"=>ND<="0011";--3when"00100001"=>ND<="0100";--4when"00100010"=>ND<="0101";--5when"00100100"=>ND<="0110";--6when"01000001"=>ND<="0111";--7when"01000010"=>ND<="1000";--8when"01000100"=>ND<="1001";--9when others =>ND<="1111";END CASE;END IF;IF CLK'EVENT AND CLK='1' THENCASE LIN ISwhen"00011000"=>NF<="0001";--qingchuwhen"00101000"=>NF<="0010";--querenwhen"01001000"=>NF<="0011";--shangsuowhen"10001000"=>NF<="0100";--kaisuowhen"10000100"=>NF<="0101";--wangjimimawhen"10000010"=>NF<="0111";--genggaimimaWhen others =>NF<="1000";END CASE;END IF;END PROCESS;DF<=NOT(ND(3) AND ND(2) AND ND(1) AND ND(0));FF<=NF(2) OR NF(1) OR NF(0);end b;4 电子密码锁的控制部分程序DF 数字按键标志寄存器FF 功能按键标志寄存器ND 数字按键识别编码寄存器NF 功能按键识别编码寄存器LOCK 电子密码锁上锁状态标志寄存器LOCK1 电子密码锁报警状态标志寄存器UNLOCK 电子密码锁开锁状态标志寄存器NULL1 电子密码锁无密码状态标志寄存器DATA 电子密码锁数码显示数据寄存器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY kongzhi ISPORT(CLK: IN STD_LOGIC;DF,FF: in STD_LOGIC;ND,NF:in STD_LOGIC_VECTOR(3 downTO 0);LOCK,LOCK1,UNLOCK:buffer STD_LOGIC;NULL1: buffer STD_LOGIC;DA TA: out STD_LOGIC_VECTOR(15 downTO 0) );END kongzhi;ARCHITECTURE V1 OF kongzhi ISsignal i1:integer range 0 to 3;signal df1:std_logic;signal ACC: STD_LOGIC_VECTOR(15 DOWNTO 0);signal t: INTEGER RANGE 0 TO 2;signal REG:STD_LOGIC_VECTOR(15 downTO 0);signal NC,A:INTEGER RANGE 0 TO 3;beginPROCESS(FF,DF)ISBEGINif rising_edge(clk) thenIF FF='1'THENIF NF="0001"THENACC<="0000000000000000";NC<=0;END IF;ELSEdf1<=df;IF df1='0'and DF='1' THENIF NC<4 THENACC<=ACC(11 DOWNTO 0)&ND;NC<=NC+1;END IF;END IF;END IF;IF FF='1' THENIF NF="0011" THENREG<=ACC;LOCK<='0';UNLOCK<='1';LOCK1<='1';NULL1<='1';elseIF NF="0100" THENIF REG=ACC THENLOCK<='1';UNLOCK<='0';LOCK1<='1';NULL1<='1';ELSELOCK<='0';UNLOCK<='1';IF t=2 THENREG<="1000100010001000";LOCK1<='0';lock<='1';unlock<='1';null1<='1';t<=0;ELSEt<=t+1;END IF;END IF;elseIF NF="0101" THENREG<="1000100010001000";LOCK<='0';UNLOCK<='1';LOCK1<='1';NULL1<='1';elseIF NF="0111" THENIF UNLOCK='1' THENIF REG=ACC THENREG<="0000000000000000";NULL1<='0';LOCK<='1';LOCK1<='1';UNLOCK<='1';END IF;END IF;elseIF NF="0010" THENREG<=ACC;NULL1<='1';LOCK<='0';LOCK1<='1';UNLOCK<='1';END IF;end if;end if;end if;end if;end if;end if;END PROCESS;DA TA<=ACC;END ARCHITECTURE V1;CAT 电子密码锁数码显示位选寄存器DISPLAY 电子密码锁数码显示段选寄存器(十七位二进制数)DISPLAY 电子密码锁数码显示段选寄存器(十七位二进制数)NUM0、NUM1、NUM2、NUM3数码显示中分位显示数据寄存器DISNUM 数码显示段选数据寄存器I1 数码显示计数器5电子密码锁的数码显示模块源程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY LEDXIANSHI ISPORT(CLK :IN STD_LOGIC;DA TA: in STD_LOGIC_VECTOR (15 DOWNTO 0);CA T:OUT STD_LOGIC_VECTOR(0 TO 3);DISPLAY:OUT STD_LOGIC_VECTOR(16 DOWNTO 0));END LEDXIANSHI;ARCHITECTURE BEHA VIORAL OF LEDXIANSHI ISSignal NUM0,NUM1,NUM2,NUM3: STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL DISNUM:STD_LOGIC_VECTOR(16 DOWNTO 0);SIGNAL I1:INTEGER RANGE 0 TO 3;BEGINNUM0<=DATA(3 DOWNTO 0);NUM1<=DATA(7 DOWNTO 4);NUM2<=DATA(11 DOWNTO 8);NUM3<=DA TA(15 DOWNTO 12);DISPLAY<=DISNUM;PROCESS(CLK)BEGINIF(RISING_EDGE(CLK))THENIF(I1=3)THENI1<=0;ELSEI1<=I1+1;END IF;END IF;END PROCESS;PROCESS(I1)BEGINCASE I1 ISWHEN 0=>CA T<="1110";CASE NUM0 ISWHEN "0000"=>DISNUM<="00000000011111111";WHEN "0001"=>DISNUM<="00000000000001100";WHEN "0010"=>DISNUM<="00001000101110111";WHEN "0011"=>DISNUM<="00001000100111111";WHEN "0100"=>DISNUM<="01001010110000000";WHEN "0101"=>DISNUM<="00001100110111011";WHEN "0110"=>DISNUM<="00001000111111011";WHEN "0111"=>DISNUM<="00000000000001111";WHEN "1000"=>DISNUM<="00001000111111111";WHEN "1001"=>DISNUM<="00001000110111111";WHEN OTHERS=>DISNUM<=NULL;END CASE;WHEN 1 => CAT<="1101";CASE NUM1 ISWHEN "0000"=>DISNUM<="00000000011111111";WHEN "0001"=>DISNUM<="00000000000001100";WHEN "0010"=>DISNUM<="00001000101110111";WHEN "0011"=>DISNUM<="00001000100111111";WHEN "0100"=>DISNUM<="01001010110000000";WHEN "0101"=>DISNUM<="00001100110111011";WHEN "0110"=>DISNUM<="00001000111111011";WHEN "0111"=>DISNUM<="00000000000001111"; WHEN "1000"=>DISNUM<="00001000111111111"; WHEN "1001"=>DISNUM<="00001000110111111"; WHEN OTHERS=>DISNUM<=NULL;END CASE;WHEN 2=>CAT<="1011";CASE NUM2 ISWHEN "0000"=>DISNUM<="00000000011111111"; WHEN "0001"=>DISNUM<="00000000000001100"; WHEN "0010"=>DISNUM<="00001000101110111"; WHEN "0011"=>DISNUM<="00001000100111111"; WHEN "0100"=>DISNUM<="01001010110000000"; WHEN "0101"=>DISNUM<="00001100110111011"; WHEN "0110"=>DISNUM<="00001000111111011"; WHEN "0111"=>DISNUM<="00000000000001111"; WHEN "1000"=>DISNUM<="00001000111111111"; WHEN "1001"=>DISNUM<="00001000110111111"; WHEN OTHERS=>DISNUM<=NULL;END CASE;WHEN 3=>CAT<="0111";CASE NUM3 ISWHEN "0000"=>DISNUM<="00000000011111111"; WHEN "0001"=>DISNUM<="00000000000001100"; WHEN "0010"=>DISNUM<="00001000101110111";WHEN "0011"=>DISNUM<="00001000100111111";WHEN "0100"=>DISNUM<="01001010110000000";WHEN "0101"=>DISNUM<="00001100110111011";WHEN "0110"=>DISNUM<="00001000111111011";WHEN "0111"=>DISNUM<="00000000000001111";WHEN "1000"=>DISNUM<="00001000111111111";WHEN "1001"=>DISNUM<="00001000110111111";WHEN OTHERS=>DISNUM<=NULL;END CASE;END CASE;END PROCESS;END BEHA VIORAL;6电子密码锁的数码显示部分(附加)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY LEDXIANSHI ISPORT(CLK :IN STD_LOGIC;DATA: in STD_LOGIC_VECTOR (15 DOWNTO 0);CA T:OUT STD_LOGIC_VECTOR(0 TO 3);DISPLAY:OUT STD_LOGIC_VECTOR(16 DOWNTO 0));END LEDXIANSHI;ARCHITECTURE BEHA VIORAL OF LEDXIANSHI ISsignal NUM0,NUM1,NUM2,NUM3: STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL DISNUM:STD_LOGIC_VECTOR(16 DOWNTO 0);SIGNAL I1:INTEGER RANGE 0 TO 3;BEGINNUM0<=DATA(3 DOWNTO 0);NUM1<=DATA(7 DOWNTO 4);NUM2<=DATA(11 DOWNTO 8);NUM3<=DA TA(15 DOWNTO 12); DISPLAY<=DISNUM;PROCESS(CLK)BEGINIF(RISING_EDGE(CLK))THENIF(I1=3)THENI1<=0;ELSEI1<=I1+1;END IF;END IF;END PROCESS;PROCESS(I1)BEGINCASE I1 ISWHEN 0=>CAT<="1110";CASE NUM0 ISWHEN "0000"=>DISNUM<="00000000011111111";WHEN OTHERS=>DISNUM<="01111111100000000";END CASE;WHEN 1=>CAT<="1101";CASE NUM1 ISWHEN "0000"=>DISNUM<="00000000011111111";WHEN OTHERS=>DISNUM<="01111111100000000";END CASE;WHEN 2=>CAT<="1011";CASE NUM2 ISWHEN "0000"=>DISNUM<="00000000011111111"; WHEN OTHERS=>DISNUM<="01111111100000000"; END CASE;WHEN 3=>CAT<="0111";CASE NUM3 ISWHEN "0000"=>DISNUM<="00000000011111111"; WHEN OTHERS=>DISNUM<="01111111100000000"; END CASE;END CASE;END PROCESS;END BEHA VIORAL;数码管显示library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity KeyScan isport(RESET : in std_logic;CLK : in std_logic; --基本时钟源6MHzKeyIn : in std_logic_vector(3 downto 0); --column列KeyOut : out std_logic_vector(3 downto 0); --row行LED_A : out std_logic; --4位数码管引脚LED_B : out std_logic;LED_C : out std_logic;LED_D : out std_logic;LED_E : out std_logic;LED_F : out std_logic;LED_G : out std_logic;LED_VCC1 : out std_logic; --时十位LED_VCC2 : out std_logic; --时个位LED_VCC3 : out std_logic; --分十位LED_VCC4 : out std_logic; --分个位LED_TimePoint:out std_logic; --冒号LED_Point :out std_logic; --小数点LED_EN1 :out std_logic --小数点);end KeyScan;architecture Behavioral of KeyScan issignal timecnt : integer range 0 to 100000 ; --分频计数器,用来得到10ms时钟signal time10ms : std_logic ; --10ms时钟signal scanvalue : std_logic_vector(3 downto 0);--记录扫描数据signal combvalue : std_logic_vector(7 downto 0);--KeyIn、KeyOut组合值signal cpy_scanvalue : std_logic_vector(3 downto 0);--备份扫描数据signal count : integer range 0 to 60000 ; --分频器,产生毫秒时钟基准signal scancnt : integer range 0 to 3 ; --LED扫描轮转signal Data0: integer range 0 to 9 ;beginLED_EN1<='0';--进程1:产生20ms时钟process( CLK,RESET)beginif RESET='0' then time10ms<='0'; --初始化elsif CLK'event and CLK='1' thentimecnt<=timecnt+1;if timecnt=100000then time10ms<=not time10ms; timecnt<=0;end if;end if;end process;--进程2:键盘扫描输出process( time10ms,RESET)beginif RESET='0' then scanvalue<="0001";combvalue<="00000000";Data0<=0; --初始化elsif time10ms'event and time10ms='1' then --每10ms进行一次键盘扫描KeyOut<=scanvalue; --输出扫描值cpy_scanvalue<=scanvalue; --备份扫描值,为了进程3对扫描结果进行比较case scanvalue is --扫描值移位when "0001" => scanvalue<="0010";when "0010" => scanvalue<="0100";when "0100" => scanvalue<="1000";when "1000" => scanvalue<="0001";when others => scanvalue<="0001";end case;combvalue<= (KeyIn & cpy_scanvalue); --组合键盘扫描的输入和输出case combvalue is --翻译扫描结果when "00010001" => Data0<=1; --对应键盘“1”when "00100001" => Data0<=2; --对应键盘“2”when "01000001" => Data0<=3; --对应键盘“3”when "00010010" => Data0<=4; --对应键盘“4”when "00100010" => Data0<=5; --对应键盘“5”when "01000010" => Data0<=6; --对应键盘“6”when "00010100" => Data0<=7; --对应键盘“7”when "00100100" => Data0<=8; --对应键盘“8”when "01000100" => Data0<=9; --对应键盘“9”when "00011000" => Data0<=0; --对应键盘“0”when others => null; --无键盘按下end case;end if;end process;--数码管扫描process(CLK,RESET) --时钟进程,产生各种时钟信号beginif RESET='0' then NULL;elsif CLK'event and CLK='1' thencount<=count+1;if count=60000 thencount<=0;if scancnt>3 then scancnt<=0;else scancnt<=scancnt+1;end if;end if;end if;end process;--数码管扫描process(CLK, RESET)begin--LED_VCC信号是‘1’有效,其余信号均为‘0’有效,中间的冒号两个点分别由VCC2和VCC3控制if RESET='0' then LED_A<='1';LED_B<='1';LED_C<='1';LED_D<='1';LED_E<='1';LED_F<='1';LED_G<='1';LED_VCC1<='0';LED_VCC2<='0';LED_VCC3<='0';LED_VCC4<='0';LED_TimePoint<='1'; LED_Point<='1';elseif scancnt=0 thencase Data0 is --分个位when 0 => LED_A<='0';LED_B<='0';LED_C<='0';LED_D<='0';LED_E<='0';LED_F<='0';LED_G<='1';LED_VCC1<='0';LED_VCC2<='0'; LED_VCC3<='0';LED_VCC4<='1';LED_Point<='1';when 1 => LED_A<='1';LED_B<='0';LED_C<='0';LED_D<='1';LED_E<='1';LED_F<='1';LED_G<='1';LED_VCC1<='0';LED_VCC2<='0'; LED_VCC3<='0';LED_VCC4<='1';LED_Point<='1';when 2 => LED_A<='0';LED_B<='0';LED_C<='1';LED_D<='0';LED_E<='0';LED_F<='1';LED_G<='0';LED_VCC1<='0';LED_VCC2<='0'; LED_VCC3<='0';LED_VCC4<='1';LED_Point<='1';when 3 => LED_A<='0';LED_B<='0';LED_C<='0';LED_D<='0';LED_E<='1';LED_F<='1';LED_G<='0';LED_VCC1<='0';LED_VCC2<='0'; LED_VCC3<='0';LED_VCC4<='1';LED_Point<='1';when 4 => LED_A<='1';LED_B<='0';LED_C<='0';LED_D<='1';LED_E<='1';LED_F<='0';LED_G<='0';LED_VCC1<='0';LED_VCC2<='0'; LED_VCC3<='0';LED_VCC4<='1';LED_Point<='1';when 5 => LED_A<='0';LED_B<='1';LED_C<='0';LED_D<='0';LED_E<='1';LED_F<='0';LED_G<='0';LED_VCC1<='0';LED_VCC2<='0'; LED_VCC3<='0';LED_VCC4<='1';LED_Point<='1';when 6 => LED_A<='0';LED_B<='1';LED_C<='0';LED_D<='0';LED_E<='0';LED_F<='0';LED_G<='0';LED_VCC1<='0';LED_VCC2<='0'; LED_VCC3<='0';LED_VCC4<='1';LED_Point<='1';when 7 => LED_A<='0';LED_B<='0';LED_C<='0';LED_D<='1';LED_E<='1';LED_F<='1';LED_G<='1';LED_VCC1<='0';LED_VCC2<='0'; LED_VCC3<='0';LED_VCC4<='1';LED_Point<='1';when 8 => LED_A<='0';LED_B<='0';LED_C<='0';LED_D<='0';LED_E<='0';LED_F<='0';LED_G<='0';LED_VCC1<='0';LED_VCC2<='0'; LED_VCC3<='0';LED_VCC4<='1';LED_Point<='1';when 9 => LED_A<='0';LED_B<='0';LED_C<='0';LED_D<='0';LED_E<='1';LED_F<='0';LED_G<='0';LED_VCC1<='0';LED_VCC2<='0'; LED_VCC3<='0';LED_VCC4<='1';LED_Point<='1';when others => null;end case;end if;end if;end process;end Behavioral;控制电路的软件仿真图(1)图2-11 控制电路的软件仿真图(2)控制电路的软件仿真图(3)控制电路的软件仿真图(4)控制电路的软件仿真图(5)5电子密码锁的数码显示模块源程序(改七段)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY LEDXIANSHI ISPORT(CLK :IN STD_LOGIC;LED_TimePoint:out std_logic; --冒号LED_Point :out std_logic; --小数点LED_EN1 :out std_logic; --选择数码管显示DA TA: in STD_LOGIC_VECTOR (15 DOWNTO 0);CA T:OUT STD_LOGIC_VECTOR(0 TO 3);DISPLAY:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END LEDXIANSHI;ARCHITECTURE BEHA VIORAL OF LEDXIANSHI ISSignal NUM0,NUM1,NUM2,NUM3: STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL DISNUM:STD_LOGIC_VECTOR(6 DOWNTO 0);SIGNAL I1:INTEGER RANGE 0 TO 3;BEGINNUM0<=DATA(3 DOWNTO 0);NUM1<=DATA(7 DOWNTO 4);NUM2<=DATA(11 DOWNTO 8);NUM3<=DA TA(15 DOWNTO 12);DISPLAY<=DISNUM;PROCESS(CLK)BEGINIF(RISING_EDGE(CLK))THENIF(I1=3)THENI1<=0;ELSEI1<=I1+1;END IF;END IF;END PROCESS;PROCESS(I1)BEGINCASE I1 ISWHEN 0=>CA T<="0001";CASE NUM0 ISWHEN "0000"=>DISNUM<="1000000";WHEN "0001"=>DISNUM<="1111001";WHEN "0010"=>DISNUM<="0100100";WHEN "0011"=>DISNUM<="0110000";WHEN "0100"=>DISNUM<="0011001";WHEN "0101"=>DISNUM<="0010010";WHEN "0110"=>DISNUM<="0000010";WHEN "0111"=>DISNUM<="1111000";WHEN "1000"=>DISNUM<="0000000";WHEN "1001"=>DISNUM<="0010000";WHEN OTHERS=>DISNUM<=NULL;END CASE;WHEN 1 => CAT<="0010";CASE NUM1 ISWHEN "0000"=>DISNUM<="1000000";WHEN "0001"=>DISNUM<="1111001";WHEN "0010"=>DISNUM<="0100100";WHEN "0011"=>DISNUM<="0110000";WHEN "0100"=>DISNUM<="0011001"; WHEN "0101"=>DISNUM<="0010010"; WHEN "0110"=>DISNUM<="0000010"; WHEN "0111"=>DISNUM<="1111000"; WHEN "1000"=>DISNUM<="0000000"; WHEN "1001"=>DISNUM<="0010000";WHEN OTHERS=>DISNUM<=NULL; END CASE;WHEN 2=>CAT<="0100";CASE NUM2 ISWHEN "0000"=>DISNUM<="1000000"; WHEN "0001"=>DISNUM<="1111001"; WHEN "0010"=>DISNUM<="0100100"; WHEN "0011"=>DISNUM<="0110000"; WHEN "0100"=>DISNUM<="0011001"; WHEN "0101"=>DISNUM<="0010010"; WHEN "0110"=>DISNUM<="0000010"; WHEN "0111"=>DISNUM<="1111000"; WHEN "1000"=>DISNUM<="0000000"; WHEN "1001"=>DISNUM<="0010000";WHEN OTHERS=>DISNUM<=NULL; END CASE;WHEN 3=>CAT<="1000";CASE NUM3 ISWHEN "0000"=>DISNUM<="1000000"; WHEN "0001"=>DISNUM<="1111001"; WHEN "0010"=>DISNUM<="0100100"; WHEN "0011"=>DISNUM<="0110000"; WHEN "0100"=>DISNUM<="0011001"; WHEN "0101"=>DISNUM<="0010010"; WHEN "0110"=>DISNUM<="0000010"; WHEN "0111"=>DISNUM<="1111000"; WHEN "1000"=>DISNUM<="0000000"; WHEN "1001"=>DISNUM<="0010000";WHEN OTHERS=>DISNUM<=NULL; END CASE;END CASE;END PROCESS;END BEHA VIORAL;。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
entity ver is
port
(dt1,dt2,dt3,dt4,dt5,dt6: in std_logic_vector(3 downto 0);
cd1,cd2,cd3,cd4,cd5,cd6: in std_logic_vector(3 downto 0);
vers: in std_logic;
if (en='0') then
result<='0';
end if;
if (stopalarm='1') then
alarmnum<=0;
end if;
if (wronging='1') then
wronging<='0';
vering<='1';
end if;
if (alarmnum<3) then
if (wronging='1') then
wrong<='1';
elsif (wronging='0') then
wrong<='0';
end if;
end if;
end process;
end ver_behave;
★寄存模块:
library ieee;
use ieee.std_logic_1164.all;
enable<='0';
sec<=0;
end if;
else
sec<=0;
end if;
end if;
end process;
end ctrl_behave;
★比较模块:
library ieee;
use ieee.std_logic_1164.all;
use iLeabharlann ee.std_logic_unsigned.all;
ready: in std_logic;
clk: in std_logic;
stopalarm: in std_logic;
en: in std_logic;
result: out std_logic;
wrong: out std_logic;
alarm: out std_logic
);
end ver;
architecture ctrl_behave of ctrl is
signal sec : integer range 0 to 60;
begin
process(clk)
begin
if (clk'event and clk='1') then
if (vers='1') then
enable<='1';
三、设计流程:
1.结构框图:
①按键输入;
②复位(设置缺省密码);
③等待状态
④工作状态
⑤修改密码
⑥提醒错误及报警
⑦开锁
⑧恢复等待
2.模块设计:
★控制模块:实现输入输出,实现等待工作的转换,实现开锁及报警;
★比较模块:比较输入密码与正确密码
★寄存模块:存放密码
★计数及使能模块:(1)输入个数为6,多于无效自动忽略;
(2)60s的空闲时间,无操作返回等待;
(3)错误次数为3
(4)进入工作状态,是能段即打开,直到进入等待。
四、具体实现:
★控制模块:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity ctrl is
use ieee.std_logic_unsigned.all;
entity code is
endif;
if (wt='1' and result='1') then
enable<='0';
sec<=0;
end if;
if (change='0' and vers='0' and keysign='0' and ok='0' and cancel='0') then
sec<=sec+1;
if (sec=59) then
Vhdl短学期实验——密码锁设计
小组成员:
04008230 李黎
04008228 陈宗渊
04008211 周炳宇
一、课题描述:
用于模仿密码锁的工作过程。完成密码锁的核心控制功能。
二、功能要求:
设计一个密码锁,平时处于等待状态。管理员可以设置或更该密码。如果不预置密码,密码缺省为“999999”。用户如果需要开锁,按相应的按键进入输入密码状态,输入6位密码,按下确定键后,若密码正确,锁打开,若密码错误,将提示密码错误,要求重新输入,三次输入都错误,将发出报警信号。报警后,只有管理员作相应的处理才能停止报警。用户输入密码时,若输入错误,在按下确定键之前,可以通过按取消键重新输入。正确开锁后,用户处理完毕后,按下确定键,系统回到等待状态。系统操作过程中,只要密码锁没有打开,如果60秒没有对系统操作,系统回到等待状态。注意:输入按键信号时必须一个按键一个按键输入,不得6个按键一起输入。
port
(change,vers,keysign: in std_logic;
ok,cancel: in std_logic;
clk: in std_logic;
result: in std_logic;
wt: in std_logic;
enable: out std_logic
);
end ctrl;
architecture ver_behave of ver is
signal alarmnum : integer range 0 to 3;
signal vering : std_logic;
signal wronging: std_logic;
begin
process(clk)
begin
if (clk'event and clk='1') then
result<='1';
else
result<='0';
wronging<='1';
if (alarmnum<3) then
alarmnum<=alarmnum+1;
end if;
end if;
vering<='0';
end if;
end if;
elsif (clk'event and clk='0') then
alarm<='0';
else
alarm<='1';
end if;
if (vers='1') then
vering<='1';
end if;
if (vering='1') then
if (ready='1') then
if (cd1=dt1 and cd2=dt2 and cd3=dt3 and cd4=dt4 and cd5=dt5 and cd6=dt6) then
相关文档
最新文档