EDA电子密码锁课程设计
数字密码锁课程设计eda

数字密码锁课程设计eda一、课程目标知识目标:1. 学生理解数字密码锁的基本原理,掌握其组成部分及功能。
2. 学生掌握二进制数与十进制数的转换方法,并能应用于数字密码锁的设计与破解。
3. 学生了解数字密码锁的安全性评估标准,能分析常见密码锁的优缺点。
技能目标:1. 学生能运用所学知识设计简单的数字密码锁,具备实际操作能力。
2. 学生能通过小组合作,进行数字密码锁的破解,提高问题解决能力。
3. 学生能运用所学知识,对数字密码锁的安全性进行评估,提升分析能力。
情感态度价值观目标:1. 学生对数字密码锁产生兴趣,培养对电子技术的热爱。
2. 学生在小组合作中,学会沟通、协作,培养团队精神。
3. 学生认识到数字密码锁在生活中的应用,增强学以致用的意识。
本课程针对五年级学生,结合其年龄特点,注重培养学生的学习兴趣和动手能力。
课程性质为实践性较强的信息技术课程,要求学生在掌握基本原理的基础上,能将所学知识应用于实际操作。
通过本课程的学习,旨在提高学生的信息技术素养,培养创新精神和实践能力。
教学要求以学生为主体,注重启发式教学,引导学生主动探索、合作交流,实现课程目标的达成。
后续教学设计和评估将围绕以上具体学习成果展开。
二、教学内容1. 数字密码锁基本原理:介绍密码锁的起源、发展及分类,重点讲解数字密码锁的工作原理和组成部分。
2. 二进制与十进制转换:回顾二进制与十进制的概念,讲解转换方法,并通过实例进行操作演示。
3. 数字密码锁设计与制作:讲解数字密码锁的设计方法,引导学生动手制作简单的数字密码锁,并分析其安全性。
4. 数字密码锁破解:介绍常见的密码破解方法,组织学生进行小组合作,尝试破解数字密码锁,提高问题解决能力。
5. 数字密码锁安全性评估:讲解安全性评估标准,分析各类数字密码锁的优缺点,提升学生的分析能力。
教学内容安排和进度:第一课时:数字密码锁基本原理、二进制与十进制转换;第二课时:数字密码锁设计与制作;第三课时:数字密码锁破解;第四课时:数字密码锁安全性评估。
EDA电子密码锁课设

EDA课程设计报告书题目:电子密码锁成绩:设计题目:电子密码锁设计要求:1.用10个按键代表0~9,输入后应转换为8421BCD码,如按“6”后转换为“0110”;2.密码位数为6位,具有密码设置和修改功能;3.开锁和报警均有LED灯指示,且报警有声音提示,报警音频率为750Hz,每鸣叫1秒停1秒,共鸣叫5响;4.用6个数码管显示输入的密码。
设计步骤:1.电路模块化。
将要实现的功能电路分成若干小的功能模块,各自实现自己的功能。
2.设计具体化。
具体设计各个模块,然后将模块组合起来,完成课程设计的要求。
3.设计实现。
将电路下载到实验箱上,实现设计的电路。
设计过程及内容总体设计文字描述:总体设计共分为4个模块,分别为密码输入模块,密码校验模块,报警模块,输出显示模块。
主要模块描述:i.密码输入模块:密码输入模块电路图如图所示:初始密码保存仿真图如图所示:密码输入检验时仿真图如图所示:输入模块主要采用优先编码器,优先编码器允许输入信号多路同时有效,对多路信号的优先级别预先进行排队,同一时刻只对优先级别最高的进行编码,即优先级别低的输入信号只有在优先级别高的信号都为无效信号时,才能编码。
因此采用74148优先编码器,把从键盘的十进制输入转化成电路系统内部的二进制输入。
由D触发器构成的寄存器用来存储密码。
仿真时,当输入端bu3给低电频时,电路进行保存。
当输入端bu2给低电频时,电路进行检验。
ii.密码校验模块:校验模块电路图如图所示:校验模块比较相等时仿真图:校验模块比较不相等时仿真图:校验模块上部分连向输入检验模块,下部分连向输入的保存模块,用74194双向移位寄存器进行输入,输入后按下确定键,检验部分与保存部分开始比较,当保存部分与检验部分结果相等时,输出结果为1,此时报警模块中绿灯亮,当保存部分与检验部分结果不相等时,输出结果为0,此时红灯亮,蜂鸣器间歇报警。
iii.报警模块:报警模块电路图如图所示:分频模块与蜂鸣模块如下图所示:实验箱可提供732hz的频率,因此通过3个计数器74161进行分频得到1hz频率,作为蜂鸣模块的时钟。
EDA课程设计报告电子密码锁设计

目录第1章概述 (3)第2章设计要求 (4)第3章总体框图 (5)第4章功能模块 (7)4.1 输入模块 (7)4.2 控制模块 (11)4.3 显示模块 (17)第5章总体设计电路图 (20)第6章设计心得体会 (20)第1章概述在当今社会中,人们对于隐私的保护和对物品安全的重视程度与日俱增。
因此,使用了现代电子技术的电子密码锁便有了广泛的应用前景。
本次所设计的电子密码锁,能够实现该六位十进制并行密码保护,当输入的密码与锁内密码一致时,绿灯亮,开锁,当输入的密码与锁内的密码不一致时,红灯亮,不能开锁。
密码锁的密码可由用户自行设置,如果用户忘记密码,可以用初始密码来重新设置密码。
为人们的财产、信息安全提供了可靠地保障。
本次设计基于VHDL语言,对并行六位电子密码锁进行设计,并对设计过程进行了详细描述。
电子密码锁在对财产安全保护等方面都有着重要作用应用前景非常广泛。
开锁代码为六位十进制数,当输入代码的位数和位值与锁内给定的密码一致,且按规定程序开锁时,方可开锁,并点亮开锁指示灯。
否则,系统进入“错误”状态。
开锁程序由设计者确定,并要求锁内给定的密码是可调的且预置方便、保密性好。
在这我将设计一个具有较低成本的电子密码锁,本文讲述了我整个设计过程及收获。
讲述了电子密码锁的的工作原理以及各个模块的功能,并讲述了所有部分的设计思路,对各部分电路方案的选择、元器件的筛选、以及对它们的调试、对波形图的分析,到最后的总体图的分析。
第2章设计要求本设计名称为基于VHDL语言的电子密码锁,用四个模块,分别为时序控制模块、输入模块、控制模块、显示模块,来控制密码的输入、验证、修改与显示。
设计所要实现的功能为:1、数码输入:设计六位密码的电子密码锁,用四个拨码开关(key1~key4)输入,并通过七段数码管显示输入密码。
2、密码验证:输入密码后, 密码正确时开锁,绿灯亮,红灯灭,表示开锁成功。
3、错误显示:当密码输入错误时,绿灯灭,红灯亮,表示开锁失败。
EDA综合课程设计电子密码锁

EDA综合课程设计----电子密码锁一.EDA综合设计的任务和要求1 EDA综合设计的任务:利用Verilog HDL语言来设计一个8位的电子密码锁,并用FPGA 实现。
2 EDA综合设计的要求:(1)设计一个简单的数字密码锁,密码为8位,其功能:开锁代码为8位二进制数,串行输入,当输入代码的位数和位值与锁内给定的密码一致,且按规定程序开锁时方可开锁,并点亮开锁指示灯。
否则,系统进入“错误”状态,并发出报警信号。
(2)串行电子密码锁的报警方式是点亮指示灯,并使喇叭鸣叫报警,直到按下复位开关,报警才停止。
此时,电子密码锁又进入等待下一次开锁的状态。
(3)扩展功能:锁内给定的密码可调,且预置方便,保密性好。
3 verilog HDL与FPGA简介Verilog HDL是一种硬件描述语言(HDL:Hardware Description Language),是一种以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。
Verilog HDL和VHDL是目前世界上最流行的两种硬件描述语言,都是在20世纪80年代中期开发出来的。
前者由Gateway Design Automation公司(该公司于1989年被Cadence 公司收购)开发。
两种HDL均为IEEE标准。
[1]Verilog HDL是一种优秀的硬件描述语言,它与C语言有许多相似之处,并继承和借鉴了C 语言的多种操作符和语法结构,有C语言基础的人很快就能够学习并使用该语言。
电子设计中,系统开发平台为QuartusⅡ。
QuartusⅡ界面友好,使用便捷,被誉为业界最易用易学的EDA软件。
在Quartus Ⅱ上可以完成设计输入、元件适配、时序仿真和功能仿真、编程下载整个流程,它提供了一种与结构无关的设计环境,是设计者能方便地进行设计输入、快速处理和器件编程。
FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。
EDA课程设计电子密码锁.

1 概述和设计要求1.1概述随着科技的发展,电子产品的应用越来越广泛,电子电路的设计也越来越重要。
随着人们生活水平的提高,如何实现家庭防盗这一问题也变得尤其的突出,传统的机械锁由于结构简单,被撬的事件屡见不鲜,电子锁由于其保密性高,使用灵活性好,安全系数高,受到广大用户的亲昵。
同时随着电子产品向智能化和微型化的不断发展,数字逻辑电路电子芯片已成为电子产品研制和开发首选的控制器。
用电子逻辑电路设计的密码锁经实际操作表明,该密码锁具有安全、实用、成本低等优点,符合一般用锁的需要,具有一定的现实意义。
在本次课程设计中,我的的题目是电子密码锁,由输入密码、设定密码、寄存电路、比较电路、显示电路、修改密码组成。
主要工作部分是将输入密码与正确密码进行比较,密码正确时红色发光二极管亮,表示开锁成功,密码错误则蜂鸣器响三秒,表示开锁失败。
同时经过显示译码器作用到数码显示器显示密码。
随着电子产品向智能化和微型化的不断发展,数字逻辑电路电子芯片已成为电子产品研制和开发首选的控制器。
1.2设计要求利用基于所学EDA以及QuartusII7.2软件相关知识设计一个具有较高安全性和较低成本的通用电子密码锁,其具体功能要求如下:(1) 数码输入:每按下一个数字键,就输入一个数值,并在显示器上的最右方显示出该数值,同时将先前输入的数据依序左移一个数字位置。
(2) 数码清除:按下此键可清除前面所有的输入值,清除成为“0000”。
(3) 密码更改:按下此键时会将目前的数字设定成新的密码。
(4) 激活电锁:按下此键可将密码锁上锁。
(5) 解除电锁:按下此键会检查输入的密码是否正确,密码正确即开锁。
2功能模块整体结构设计作为通用电子密码锁,主要由三个部分组成:数字密码输入电路、密码锁控制电路和密码锁显示电路。
根据以上选定的输入设备和显示器件,并考虑到实现各项数字密码锁功能的具体要求,整个电子密码锁系统的总体组成框图如图2.1所示。
(1) 密码锁输入电路包括时序产生电路、键盘扫描电路、键盘弹跳消除电路、键盘译码电路等几个小的功能电路。
eda课程设计--电子密码锁

绍兴文理学院数理信息学院课程设计报告书题目电子密码锁设计姓名XXX学号XXX专业班级电信指导教师时间2013年1月14日课程设计任务书 班 级电信XXX 姓 名 XXX题目电子密码锁设计 技术参数、设计要求、检测数据等在EDA 实验箱上利用FPGA 、4*4键盘及数码管实现电子密码锁,功能要求如下: ● 模拟实现电子密码锁的开锁、解锁、改密码等基本功能 ● 实现万能密码功能 ● 当用户密码连续3次输入错误时,报警并锁定键盘 ● 当用户密码输入时间超过一定值(如30秒)时,提示超时 ● 在密码设置状态下输入密码时,所输入数字在数码管显示;其余状态下,所输密码在对应数码管上以特殊字符屏蔽显示 设计进度安排或工作计划 2013.1.4 ~2013.1.4: 任务分配,熟悉课题,查询相关资料,出方案初稿。
2013.1.5~2013.1.5: 方案交流并定稿,划分设计模块,课程设计开展。
2013.1.6~2013.1.7: 各模块设计实现及调试、验证。
(其中8、9 号暂停)2013.1.10~2013.1.13: 设计整体实现、调试及验证,并开始撰写报告。
2013.1.14~2013.1.15: 设计完成,课程设计报告撰写并定稿,上交。
其它认真阅读EDA 技术课程设计报告撰写规范;课题小组经协商好要指定组长并明确分工,形成良好团队工作氛围;基于课题基本要求,各小组课再细化、增加要求;课题小组每成员均需各自撰写一份课程设计报告。
电子密码锁设计摘要本文介绍了一种采用单片FPGA芯片进行电子密码锁的设计方法,主要阐述如何使用新兴的EDA器件取代传统的电子设计方法,利用FPGA的可编程性,简洁而又多变的设计方法,缩短了研发周期。
电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。
它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。
密码锁是以芯片为核心,通过编程来实现的,其性能和安全性已大大超过了机械锁。
eda电子密码锁课程设计
eda电子密码锁课程设计一、课程目标知识目标:1. 理解EDA(电子设计自动化)的基本概念,掌握其在电子密码锁设计中的应用。
2. 学习并掌握电子密码锁的基本原理,包括密码设置、存储、识别和验证过程。
3. 掌握电子密码锁设计中涉及的电子元件、电路图绘制及电路功能。
技能目标:1. 能够运用EDA软件完成电子密码锁的电路设计,具备基本的电路仿真能力。
2. 能够运用编程语言(如C语言)编写简单的密码验证程序,实现电子密码锁的功能。
3. 学会使用常见的电子测量工具,对电子密码锁进行调试和故障排查。
情感态度价值观目标:1. 培养学生对EDA技术及其在电子设计中的应用产生兴趣,激发学生的创新意识和探索精神。
2. 培养学生团队协作意识,提高沟通与协作能力,学会共同解决问题。
3. 增强学生的安全意识,了解电子密码锁在实际应用中的重要性,培养学生的责任心。
课程性质:本课程为实践性较强的课程,注重理论知识与实际操作相结合,旨在提高学生的实际动手能力和创新能力。
学生特点:学生具备一定的电子基础知识,对EDA技术有一定了解,但对电子密码锁的设计和制作相对陌生。
教学要求:结合课程性质、学生特点,将课程目标分解为具体的学习成果,通过理论教学、实践操作、团队协作等多种教学方式,确保学生能够达到课程目标。
同时,注重过程评估和成果评估,以提高教学效果。
二、教学内容根据课程目标,教学内容分为以下三个部分:1. 理论知识学习- 电子设计自动化(EDA)基本概念与原理- 电子密码锁的工作原理及其电路组成- 密码学基础,包括密码设置、存储和验证方法教学大纲:参照教材相关章节,安排2个课时进行理论知识学习。
2. 实践操作与技能培养- EDA软件使用,包括电路图绘制、仿真与调试- 编程语言(C语言)基础,编写密码验证程序- 电子元件识别与使用,完成电子密码锁的搭建教学大纲:实践操作部分安排4个课时,分为两次课程完成。
3. 团队协作与创新能力培养- 分组讨论,共同设计电子密码锁方案- 成果展示,组间交流与评价- 故障排查与优化,提高电子密码锁的安全性与稳定性教学大纲:团队协作部分安排2个课时,在实践操作过程中穿插进行。
EDA课程设计—电子密码锁
EDA课程设计—电子密码锁————————————————————————————————作者:————————————————————————————————日期:2目录摘要 (1)1绪论 (2)1.1电子密码锁简介 (2)1.2电子密码锁的国内外研究现状和发展趋势 (2)1.3 EDA技术及VHDL语言 (3)2电子密码锁总体设计 (5)2.1总体设计方案 (5)2.2设计思路简述 (6)2.3整体组装设计原理图 (7)3单元模块程序设计 (8)3.1 电子密码锁输入模块 (8)3.1.1输入模块程序 (8)3.1.2输入模块单元 (11)3.1.3输入模块仿真 (11)3.2电子密码锁系统控制模块 (11)3.2.1 控制模块程序 (12)3.2.2 控制模块单元 (14)3.2.3 控制模块仿真图 (14)3.3电子密码锁系统显示模块 (15)3.3.1 显示模块程序 (15)3.3.2 显示模块单元 (16)3.3.3 显示模块仿真 (16)4小结 (17)参考文献 (18)电子密码锁设计摘要随着人们生活水平的提高,如何实现家庭防盗这一问题逐渐变的尤为突出,传统的机械锁由于其构造简单,故安全性能不容乐观,同时电子技术的高速发展使得具有防盗报警等功能的电子密码锁代替密码量少、安全性差的机械式密码锁已是必然趋势。
电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。
目前设计密码锁的方法有很多,而用VHDL可以更加快速、灵活地设计出符合各种要求的密码锁,优于其他设计方法。
关键字:家庭防盗安全电子密码锁VHDL11绪论1.1电子密码锁简介电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。
它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。
现在应用较广的电子密码锁是以芯片为核心,通过编程来实现的。
EDA课程设计电子密码锁
1概述和设计要求1.1概述随着科技的发展,电子产品的应用越来越广泛,电子电路的设计也越来越重要。
随着人们生活水平的提高,如何实现家庭防盗这一问题也变得尤其的突出,传统的机械锁由于结构简单,被撬的事件屡见不鲜,电子锁由于其保密性高,使用灵活性好,安全系数高,受到广大用户的亲昵。
同时随着电子产品向智能化和微型化的不断发展,数字逻辑电路电子芯片已成为电子产品研制和开发首选的控制器。
用电子逻辑电路设计的密码锁经实际操作表明,该密码锁具有安全、实用、成本低等优点,符合一般用锁的需要,具有一定的现实意义。
在本次课程设计中,我的的题目是电子密码锁,由输入密码、设定密码、寄存电路、比较电路、显示电路、修改密码组成。
主要工作部分是将输入密码与正确密码进行比较,密码正确时红色发光二极管亮,表示开锁成功,密码错误则蜂鸣器响三秒,表示开锁失败。
同时经过显示译码器作用到数码显示器显示密码。
随着电子产品向智能化和微型化的不断发展,数字逻辑电路电子芯片已成为电子产品研制和开发首选的控制器。
1.2设计要求利用基于所学EDA以及Quartusll7.2软件相关知识设计一个具有较高安全性和较低成本的通用电子密码锁,其具体功能要求如下:(1)数码输入:每按下一个数字键,就输入一个数值,并在显示器上的最右方显示出该数值,同时将先前输入的数据依序左移一个数字位置。
(2)数码清除:按下此键可清除前面所有的输入值,清除成为0000'。
(3)密码更改:按下此键时会将目前的数字设定成新的密码。
(4)激活电锁:按下此键可将密码锁上锁。
(5)解除电锁:按下此键会检查输入的密码是否正确,密码正确即开锁。
2功能模块整体结构设计作为通用电子密码锁,主要由三个部分组成:数字密码输入电路、密码锁控制电路和密码锁显示电路。
根据以上选定的输入设备和显示器件,并考虑到实现各项数字密码锁功能的具体要求,整个电子密码锁系统的总体组成框图如图2.1所示。
(1)密码锁输入电路包括时序产生电路、键盘扫描电路、键盘弹跳消除电路、键盘译码电路等几个小的功能电路。
EDA-密码锁
EDA课程设计——电子密码锁一、设计目的:在学习完大部分内容后,设计一个功能和市面上一模一样的“4位数电子密码锁”,可让学生学习查找相关资料,并对小型项目开发有一定的认识。
使学生能进行模块化设计,对每部分电路进行讨论、说明与仿真验证,最后在整合起来。
二、所需器材:本设计所需的硬件主要有:矩阵键盘、七段译码器,七段管脚数码管。
三、设计内容和要求:1、数码输入:每按下一个数字键,就输入一个数值,并在显示器上的最右方显示,将先前的输入数据依序左移一个数字位置。
2、数码清除:按下此键可清除之前所有的输入值,清除成为“0000”。
3、密码更改:按下此键时会将目前的数字设定成新的密码。
4、激活电锁:按下此键可将密码锁上锁。
5、解除电锁:按下此键会检查输入的密码是否正确,密码正确即开锁。
四、设计程序和调试情况:实验程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity key_led isport (x :in std_logic_vector(3 downto 0);y :out std_logic_vector(3 downto 0);clk :in std_logic;clr :in std_logic;ch_code :in std_logic;dx :out std_logic_vector(6 downto 0);wx :out std_logic_vector( 3 downto 0);open_key :out std_logic);end key_led;architecture one of key_led issignal count :std_logic_vector(10 downto 0);signal clk_key :std_logic;signal clk_key_1 :std_logic;signal clk_led :std_logic;signal key_in_0 :std_logic_vector(7 downto 0);signal key_in :std_logic_vector(4 downto 0);signal y_0 :integer range 0 to 3;signal y_temp :std_logic_vector(3 downto 0);signal SG :std_logic_vector(6 downto 0);signal j :std_logic_vector(2 downto 0);signal i :std_logic_vector(2 downto 0);signal i_test :std_logic_vector(2 downto 0);subtype one is std_logic_vector(6 downto 0);type two is array (3 downto 0) of one;signal Q :two;signal code :two;signal key_count :std_logic_vector(2 downto 0);beginfrequency division:process(clk)beginif(clk'event and clk='1') thenif(count="11111111111") thencount<=(others=>'0');else count<=count+1;end if;end if;end process;clk_key<=count(1);clk_led<=count(0);--再产生clk_key_1分频。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
概述在当今社会中,人们对于隐私的保护和对物品安全的重视程度与日俱增。
因此,使用了现代电子技术的电子密码锁便有了广泛的应用前景。
本次所设计的电子密码锁,能够实现该六位十进制并行密码保护,当输入的密码与锁内密码一致时,绿灯亮,开锁;当输入的密码与锁内的密码不一致时,红灯亮,不能开锁。
密码锁的密码可由用户自行设置,并可在液晶显示屏上显示所输入的密码。
为人们的财产、信息安全提供了可靠地保障。
本次设计基于VHDL语言,对并行六位电子密码锁进行设计,并对设计过程进行了详细描述。
采用VHDL语言进行电子密码锁的设计可使设计工作简洁直观,快速实现既定功能。
电子密码锁在对财产安全保护等方面都有着重要作用,应用前景非常广泛。
开锁代码为六位十进制数,当输入代码的位数和位值与锁内给定的密码一致,且按规定程序开锁时,方可开锁,并点亮开锁指示灯。
否则,系统进入“错误”状态,并发出报警信号。
开锁程序由设计者确定,并要求锁内给定的密码是可调的,且预置方便,保密性好。
并行数字锁的报警方式是点亮指示灯,并使喇叭鸣叫来报警,直到按下复位开关,报警才停止。
此时,数字锁又自动进入等待下一次开锁的状态。
一、设计主要内容1、密码锁串行输入几位十进制数字口令2、输入口令全部正确即开锁并有绿灯显示3、口令输入最大次数3次,要求在完全输入六位之后进行判断口令正确与否;输入3次之后还不能开锁,进入死锁状态并报警4、有相应的显示功能5、开锁后能再次上锁二、系统设计方案作为通用电子密码锁,主要由三个部分组成:数字密码输入电路、密码锁控制电路和密码锁显示电路。
(1)密码锁输入电路包括时序产生电路、键盘扫描电路、键盘译码电路等几个小的功能电路。
(2) 密码锁控制电路包括按键数据的缓冲存储电路,密码的清除、存储、激活电锁电路(寄存器清除信号发生电路),密码核对(数值比较电路),解锁电路(开/关门锁电路)等几个小的功能电路。
(3)密码显示电路主要是在液晶显示屏显示输入的数值。
2.1密码锁输入电路的设计是电子密码锁的输入电路框图,由键盘扫描电路、弹跳消除电路、键盘译码电路、按键数据缓存器,加上外接的一个4×4矩阵式键盘组成。
图1-1密码锁的输入电路框图1.矩阵式键盘的工作原理矩阵式键盘是一种常见的输入装置,在日常的生活中,矩阵式键盘在计算机、电话、手机、微波炉等各式电子产品上已经被广泛应用。
图1-2是一个3×4矩阵式键盘的面板配置图,其中数字0~2.2密码锁输入电路各主要功能模块的设计1) 时序产生电路本时序产生电路中使用了三种不同频率的工作脉冲波形:系统时钟脉冲(它是系统内部所有时钟脉冲的源头,且其频率最高)、弹跳消除取样信号、键盘扫描信号。
2) 键盘扫描电路扫描电路的作用是用来提供键盘扫描信号的,扫描信号变化的顺序依次为1110-1101-1011-0111-1110......依序地周而复始。
3) 弹跳消除电路由于本设计中采用的矩阵式键盘是机械开关结构,因此在开关切换的瞬间会在接触点出现信号来回弹跳的现象,对于电子密码锁这种灵敏度较高的电路这种弹跳将很可能会造成误动作输入,从而影响到密码锁操作的正确性。
从图1-3中可以观察出弹跳现象产生的原因,虽然只是按下按键一次然后放掉,然而实际产生的按键信号却不止跳动一次,经过取样信号的检查后,将会造成误判断,以为键盘按了两次。
如果调整抽样频率(如图4.5所示),可以发现弹跳现象获得了改善。
图1-3弹跳现象产生错误的抽样结果图1-4 调整抽样频率后得到的抽样结果 4) 键盘译码电路上述键盘中的按键可分为数字按键和文字按键,每一个按键可能负责不同的功能,例如清除数码、退位、激活电锁、开锁等。
5) 按键存储电路因为每次扫描会产生新的按键数据,可能会覆盖前面的数据,所以需要一个按键存储电路,将整个键盘扫描完毕后的结果记录下来。
按键存储电路可以使用移位寄存器构成。
抽样结果抽样信号按键信号抽样结果抽样信号按键信号图1-5 输入电路仿真波形图2.3 密码锁控制电路的设计密码锁的控制电路是整个电路的控制中心,主要完成对数字按键输入和功能按键输入的响应控制。
1.数字按键输入的响应控制(1) 如果按下数字键,第一个数字会从显示器的最右端开始显示,此后每新按一个数字时,显示器上的数字必须左移一格,以便将新的数字显示出来。
(2) 假如要更改输入的数字,可以按倒退按键来清除前一个输入的数字,或者按清除键清除所有输入的数字,再重新输入六位数。
(3) 由于这里设计的是一个六位的电子密码锁,所以当输入的数字键超过四个时,电路不予理会,而且不再显示第六个以后的数字。
2.4功能按键输入的响应控制(1) 清除键:清除所有的输入数字,即做归零动作。
(2) 激活电锁键:按下此键时可将密码锁的门上锁。
(上锁前必须预先设定一个六位的数字密码。
)(3) 解除电锁键:按下此键会检查输入的密码是否正确,若密码正确无误则开门。
图1-5 电子密码锁的三种模式及关系2.5 密码锁显示电路的设计密码锁显示电路的设计比较复杂,这里直接采用12864液晶屏进行显示。
2.6 密码锁的整体组装设计将前面各个设计好的功能模块进行整合,可得到一个完整的电子密码锁系统的整体组装设计原理图,如图1-6所示。
图1-6 密码锁的整体组装设计原理图三、系统扩展思路(1) 本系统基本达到作为数字密码锁的绝大部分功能,但还有许多不足或需完善的地方。
比如说采用4×4的通用机械键盘受到键盘数量的限制,在很大的程度上限制了其功能的扩展。
(2)设计外围电路:系统用方波信号源,直流工作电源。
(3)可要求设计制作整个系统,包括PCB的制作。
四、实验收获课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。
随着科学技术发展的日新月异,FPGA已经成为当今计算机应用中空前活跃的领域,在生活中可以说无处不在。
因此作为二十一世纪的大学来说掌握eda的开发技术是十分必要的。
回顾此次课程设计,我感慨颇多,的确,从理论到实践,在很长的一段时间里,可以说是苦多于甜,但确实学到了很多东西,不仅可以巩固以前学到的知识,还学到许多没学过的知识。
通过此次课程设计,使我了解了理论与实际结合的重要性,只有理论知识是远远不够的。
在设计的过程中,发现自己以前学习的知识理解不够深刻,掌握不够牢固等等。
通过这次课设之后,一定要把以前学习的知识温故知新。
这次的课设终于完成,通过老师的细心讲解,我解决了很多问题。
在这里,感谢老师的细心指导。
同时对于帮助我的同学,也表示衷心感谢。
附录1、液晶显示程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use IEEE.STD_LOGIC_ARITH.ALL;entity clock_lcd_disp isgeneric(divide_to_100k:integer:=500);port(clk:in std_logic;DATAIN:in std_logic_vector(31 downto 0);din: in INTEGER RANGE 15 DOWNTO 0;rw,rs,e,lcd_rst:out std_logic;lcd_data:out std_logic_vector(7 downto 0));end clock_lcd_disp;architecture tcl of clock_lcd_disp issignal mima:std_logic_vector(31 downto0):="00010010001101000101011001111000";signal clk_100k:std_logic;signal clkout:std_logic;signal temp:std_logic_vector(7 downto 0);type stateis(s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16,s17,s18, s19,s20,s21,s22,s23,s24,s25,s26,s27,s28,s29,s30,s31);signal current_s:state;type data_buffer is array(0 to 15)of std_logic_vector(7 downto 0);type data_buffer1 is array(0 to 7)of std_logic_vector(7 downto 0);signal time:std_logic_vector(23 downto 0);signal disp_time:data_buffer1:=(x"31",x"32",x"3a",x"33",x"34",x"3a",x"35",x"36");constant data_buf0:data_buffer:=(x"20",x"20",x"bb",x"aa", --华科武昌分校 80x"bf",x"c6",x"ce",x"e4",x"b2",x"fd", x"b7",x"d6",x"d0",x"a3",x"20",x"20");constant data_buf1:data_buffer:=(x"20",x"20",x"b5",x"e7", --电子密码锁90x"d7",x"d3",x"c3",x"dc",x"c2",x"eb",x"cb",x"f8",x"20",x"20",x"20",x"20");constant data_buf2:data_buffer:=(x"20",x"20",x"c7",x"eb",x"ca",x"e4",x"c8",x"eb", --请输入密码: 88x"c3",x"dc",x"c2",x"eb",x"3a",x"20",x"20",x"20");constant data_buf3:data_buffer:=(x"20",x"20",x"d6",x"d8",x"d0",x"c2",x"ca",x"e4", --重新输入x"c8",x"eb",x"20",x"20",x"20",x"20",x"20",x"20");constant data_buf4:data_buffer:=(x"20",x"20",x"bd",x"e2",x"cb",x"f8",x"b3",x"c9", --解锁成功x"b9",x"a6",x"20",x"20",x"20",x"20",x"20",x"20");constant data_buf5:data_buffer:=( x"20",x"20", --进入死锁状态x"bd",x"f8",x"c8",x"eb",x"cb",x"c0",x"cb",x"f8",x"d7",x"b4",x"cc",x"ac",x"20",x"20");constant data_buf6:data_buffer:=(x"20",x"20",x"bd",x"e2", --x"cb",x"f8",x"b3",x"c9",x"b9",x"a6", x"21",x"20",x"20",x"20",x"20",x"20"); begin--U1:divclk1 port map(clk,clk_100k);process(clk)variable cnt:integer range 0 to divide_to_100k;beginif(clk'event and clk='1')then cnt:=cnt+1;if(cnt=divide_to_100k)then cnt:=0;end if;if(cnt<divide_to_100k/2) then clk_100k<='0';else clk_100k<='1';end if;end if;end process;div_1Hz:process(clk)variable cnttemp:integer range 0 to 49999999;beginif clk='1' and clk'event thenif cnttemp=49999999 then cnttemp:=0;elseif cnttemp<25000000 then clkout<='1';else clkout<='0';end if;cnttemp:=cnttemp+1;end if;end if;end process div_1Hz;disp_time(7)<=DATAIN(3 downto 0)+x"30";disp_time(6)<=DATAIN(7 downto 4)+x"30";disp_time(5)<=DATAIN(11 downto 8)+x"30";disp_time(4)<=DATAIN(15 downto 12)+x"30";disp_time(3)<=DATAIN(19 downto 16)+x"30";disp_time(2)<=DATAIN(23 downto 20)+x"30";disp_time(1)<=DATAIN(27 downto 24)+x"30";disp_time(0)<=DATAIN(31 downto 28)+x"30";read_time:process(time)beginend process;process(clk_100k)variable cnt1:integer range 0 to 10000;variable cnt_1:integer range 0 to 1000;variable code_cnt:integer range 0 to 13;variable data_cnt:integer range 0 to 480;beginif(clk_100k'event and clk_100k='1')thencase current_s iswhen s0=>rw<='1';rs<='1';e<='1';cnt1:=cnt1+1; if cnt1<500 then lcd_rst<='0';elsif cnt1<1000 then lcd_rst<='1';elsif cnt1=1000 thenlcd_rst<='1';cnt1:=0;current_s<=s1;end if;when s1=>cnt_1:=cnt_1+1;if cnt_1<1*3 then e<='1';rs<='0';rw<='0';elsif cnt_1<2*3 then lcd_data<=x"0c";elsif cnt_1<10*3 then e<='0';elsif cnt_1=10*3 then cnt_1:=0;current_s<=s2; end if;when s2=>cnt_1:=cnt_1+1;if cnt_1<1*3 then e<='1';rs<='0';rw<='0';elsif cnt_1<2*3 then lcd_data<=x"90";elsif cnt_1<10*3 then e<='0';elsif cnt_1=10*3 then cnt_1:=0;current_s<=s3; end if;when s3=>if cnt_1<1*3 then e<='1';rs<='1';rw<='0';elsif cnt_1<2*3 thenlcd_data<=data_buf1(data_cnt);elsif cnt_1=2*3 then data_cnt:=data_cnt+1;elsif cnt_1<100 then e<='0';end if;cnt_1:=cnt_1+1;if cnt_1=100 then cnt_1:=0;if data_cnt=16 then current_s<=s4; data_cnt:=0;end if;end if;when s4=>cnt_1:=cnt_1+1;if cnt_1<1*3 then e<='1';rs<='0';rw<='0';elsif cnt_1<2*3 then lcd_data<=x"88";elsif cnt_1<10*3 then e<='0';elsif cnt_1=10*3 then cnt_1:=0;current_s<=s5; end if;when s5=>if cnt_1<1*3 then e<='1';rs<='1';rw<='0';elsif cnt_1<2*3 thenlcd_data<=data_buf2(data_cnt);elsif cnt_1=2*3 then data_cnt:=data_cnt+1;elsif cnt_1<100 then e<='0';end if;cnt_1:=cnt_1+1;if cnt_1=100 then cnt_1:=0;if data_cnt=16 then current_s<=s6; data_cnt:=0;end if;end if;when s6=>cnt_1:=cnt_1+1;if cnt_1<1*3 then e<='1';rs<='0';rw<='0';elsif cnt_1<2*3 then lcd_data<=x"80";elsif cnt_1<10*3 then e<='0';elsif cnt_1=10*3 then cnt_1:=0;current_s<=s7; end if;when s7=>if cnt_1<1*3 then e<='1';rs<='1';rw<='0';elsif cnt_1<2*3 thenlcd_data<=data_buf0(data_cnt);elsif cnt_1=2*3 then data_cnt:=data_cnt+1;elsif cnt_1<100 then e<='0';end if;cnt_1:=cnt_1+1;if cnt_1=100 then cnt_1:=0;if data_cnt=16 then current_s<=s8;data_cnt:=0;end if;end if;--动态显示when s8=>cnt_1:=cnt_1+1;if cnt_1<1*3 then e<='1';rs<='0';rw<='0';elsif cnt_1<2*3 then lcd_data<=x"9a";elsif cnt_1<10*3 then e<='0';elsif cnt_1=10*3 then cnt_1:=0;current_s<=s9;end if;when s9=>if cnt_1<1*3 then e<='1';rs<='1';rw<='0'; elsif cnt_1<2*3 thenlcd_data<=disp_time(data_cnt);elsif cnt_1=2*3 then data_cnt:=data_cnt+1;elsif cnt_1<100 then e<='0';end if;cnt_1:=cnt_1+1;if cnt_1=100 then cnt_1:=0;if data_cnt=8 then current_s<=s10;data_cnt:=0;end if;end if;--------------------------------------------------------------when s10=>cnt_1:=cnt_1+1;if din<=10 thenif cnt_1<1*3 then e<='1';rs<='0';rw<='0';elsif cnt_1<2*3 then lcd_data<=x"88";elsif cnt_1<10*3 then e<='0';elsif cnt_1=10*3 then cnt_1:=0;current_s<=s11;end if;else current_s<=s12;end if;when s11=>if cnt_1<1*3 then e<='1';rs<='1';rw<='0'; elsif cnt_1<2*3 thenlcd_data<=data_buf4(data_cnt);elsif cnt_1=2*3 then data_cnt:=data_cnt+1;elsif cnt_1<100 then e<='0';end if;cnt_1:=cnt_1+1;if cnt_1=100 then cnt_1:=0;if data_cnt=8 then current_s<=s0;data_cnt:=0;end if;end if;when s12=>cnt_1:=cnt_1+1;if cnt_1<1*3 then e<='1';rs<='0';rw<='0';elsif cnt_1<2*3 then lcd_data<=x"88";elsif cnt_1<10*3 then e<='0';elsif cnt_1=10*3 then cnt_1:=0;current_s<=s13;end if;when s13=>if cnt_1<1*3 then e<='1';rs<='1';rw<='0'; elsif cnt_1<2*3 thenlcd_data<=data_buf3(data_cnt);elsif cnt_1=2*3 then data_cnt:=data_cnt+1;elsif cnt_1<100 then e<='0';end if;cnt_1:=cnt_1+1;if cnt_1=100 then cnt_1:=0;if data_cnt=8 then current_s<=s14;data_cnt:=0;end if;end if;when s14=>cnt_1:=cnt_1+1;if cnt_1<1*3 then e<='1';rs<='0';rw<='0';elsif cnt_1<2*3 then lcd_data<=x"98";elsif cnt_1<10*3 then e<='0';elsif cnt_1=10*3 then cnt_1:=0;current_s<=s15;end if;when s15=>if cnt_1<1*3 then e<='1';rs<='1';rw<='0';elsif cnt_1<2*3 thenlcd_data<=disp_time(data_cnt);elsif cnt_1=2*3 then data_cnt:=data_cnt+1;elsif cnt_1<100 then e<='0';end if;cnt_1:=cnt_1+1;if cnt_1=100 then cnt_1:=0;if data_cnt=8 then current_s<=s16;data_cnt:=0;end if;end if;------------------------------------------------------------------------------------------------when s16=>cnt_1:=cnt_1+1;if din<=10 thenif cnt_1<1*3 then e<='1';rs<='0';rw<='0';elsif cnt_1<2*3 then lcd_data<=x"88";elsif cnt_1<10*3 then e<='0';elsif cnt_1=10*3 then cnt_1:=0;current_s<=s17;end if;else current_s<=s18;end if;when s17=>if cnt_1<1*3 then e<='1';rs<='1';rw<='0'; elsif cnt_1<2*3 thenlcd_data<=data_buf4(data_cnt);elsif cnt_1=2*3 then data_cnt:=data_cnt+1;elsif cnt_1<100 then e<='0';end if;cnt_1:=cnt_1+1;if cnt_1=100 then cnt_1:=0;if data_cnt=8 then current_s<=s0;data_cnt:=0;end if;end if;when s18=>cnt_1:=cnt_1+1;if cnt_1<1*3 then e<='1';rs<='0';rw<='0';elsif cnt_1<2*3 then lcd_data<=x"88";elsif cnt_1<10*3 then e<='0';elsif cnt_1=10*3 then cnt_1:=0;current_s<=s19;end if;when s19=>if cnt_1<1*3 then e<='1';rs<='1';rw<='0'; elsif cnt_1<2*3 thenlcd_data<=data_buf3(data_cnt);elsif cnt_1=2*3 then data_cnt:=data_cnt+1;elsif cnt_1<100 then e<='0';end if;cnt_1:=cnt_1+1;if cnt_1=100 then cnt_1:=0;if data_cnt=8 then current_s<=s20;data_cnt:=0;end if;end if;when s20=>cnt_1:=cnt_1+1;if cnt_1<1*3 then e<='1';rs<='0';rw<='0';elsif cnt_1<2*3 then lcd_data<=x"98";elsif cnt_1<10*3 then e<='0';elsif cnt_1=10*3 then cnt_1:=0;current_s<=s21;end if;when s21=>if cnt_1<1*3 then e<='1';rs<='1';rw<='0'; elsif cnt_1<2*3 thenlcd_data<=disp_time(data_cnt);elsif cnt_1=2*3 then data_cnt:=data_cnt+1;elsif cnt_1<100 then e<='0';end if;cnt_1:=cnt_1+1;if cnt_1=100 then cnt_1:=0;if data_cnt=8 then current_s<=s22;data_cnt:=0;end if;end if;------------------------------------------------------------------------------when s22=>cnt_1:=cnt_1+1;if din<=10 thenif cnt_1<1*3 then e<='1';rs<='0';rw<='0';elsif cnt_1<2*3 then lcd_data<=x"88";elsif cnt_1<10*3 then e<='0';elsif cnt_1=10*3 then cnt_1:=0;current_s<=s23;end if;else current_s<=s24;end if;when s23=>if cnt_1<1*3 then e<='1';rs<='1';rw<='0'; elsif cnt_1<2*3 thenlcd_data<=data_buf4(data_cnt);elsif cnt_1=2*3 then data_cnt:=data_cnt+1;elsif cnt_1<100 then e<='0';end if;cnt_1:=cnt_1+1;if cnt_1=100 then cnt_1:=0;if data_cnt=8 then current_s<=s0;data_cnt:=0;end if;end if;when s24=>cnt_1:=cnt_1+1;if cnt_1<1*3 then e<='1';rs<='0';rw<='0';elsif cnt_1<2*3 then lcd_data<=x"88";elsif cnt_1<10*3 then e<='0';elsif cnt_1=10*3 then cnt_1:=0;current_s<=s25;end if;when s25=>if cnt_1<1*3 then e<='1';rs<='1';rw<='0'; elsif cnt_1<2*3 thenlcd_data<=data_buf3(data_cnt);elsif cnt_1=2*3 then data_cnt:=data_cnt+1;elsif cnt_1<100 then e<='0';end if;cnt_1:=cnt_1+1;if cnt_1=100 then cnt_1:=0;if data_cnt=8 then current_s<=s26;data_cnt:=0;end if;end if;when s26=>cnt_1:=cnt_1+1;if cnt_1<1*3 then e<='1';rs<='0';rw<='0';elsif cnt_1<2*3 then lcd_data<=x"98";elsif cnt_1<10*3 then e<='0';elsif cnt_1=10*3 then cnt_1:=0;current_s<=s27;end if;when s27=>if cnt_1<1*3 then e<='1';rs<='1';rw<='0'; elsif cnt_1<2*3 thenlcd_data<=disp_time(data_cnt);elsif cnt_1=2*3 then data_cnt:=data_cnt+1;elsif cnt_1<100 then e<='0';end if;cnt_1:=cnt_1+1;if cnt_1=100 then cnt_1:=0;if data_cnt=8 then current_s<=s28;data_cnt:=0;end if;end if;--------------------------------------------------------------------------------------when s28=>cnt_1:=cnt_1+1;if din<=10 thenif cnt_1<1*3 then e<='1';rs<='0';rw<='0';elsif cnt_1<2*3 then lcd_data<=x"88";elsif cnt_1<10*3 then e<='0';elsif cnt_1=10*3 then cnt_1:=0;current_s<=s29;end if;else current_s<=s30;end if;when s29=>if cnt_1<1*3 then e<='1';rs<='1';rw<='0'; elsif cnt_1<2*3 thenlcd_data<=data_buf4(data_cnt);elsif cnt_1=2*3 then data_cnt:=data_cnt+1;elsif cnt_1<100 then e<='0';end if;cnt_1:=cnt_1+1;if cnt_1=100 then cnt_1:=0;if data_cnt=8 then current_s<=s0;data_cnt:=0;end if;end if;when s30=>cnt_1:=cnt_1+1;if cnt_1<1*3 then e<='1';rs<='0';rw<='0';elsif cnt_1<2*3 then lcd_data<=x"88";elsif cnt_1<10*3 then e<='0';elsif cnt_1=10*3 then cnt_1:=0;current_s<=s31;end if;when s31=>if cnt_1<1*3 then e<='1';rs<='1';rw<='0'; elsif cnt_1<2*3 thenlcd_data<=data_buf4(data_cnt);elsif cnt_1=2*3 then data_cnt:=data_cnt+1;elsif cnt_1<100 then e<='0';end if;cnt_1:=cnt_1+1;if cnt_1=100 then cnt_1:=0;if data_cnt=8 then current_s<=s30;data_cnt:=0;end if;end if;when others=>current_s<=s0;end case;end if;end process;end tcl;2、键盘控制子程序LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;ENTITY bian_ma0 IS ------编码PORT(en,clk:IN std_logic;kr3,kr2,kr1,kr0:IN std_logic;kc3,kc2,kc1:IN std_logic;SDIN,lock,sec,CR,set,crack:out std_logic; dout:OUT std_logic);END bian_ma0;ARCHITECTURE one OF bian_ma0 ISsignal data:std_logic_vector(5 downto 0); signal ker:std_logic_vector(3 downto 0); signal kec:std_logic_vector(2 downto 0); BEGINker<=kr3&kr2&kr1&kr0;kec<=kc3&kc2&kc1;PROCESS(ker)BEGINif(ker="1111")thencase kec iswhen others=>data<=data;end case;elsif(ker="1110") thencase kec iswhen "100"=>data<="000001";when "010"=>data<="000010";when "001"=>data<="000100";when others=>data<=data;end case;elsif(ker="1101") thencase kec iswhen "001"=>data<="001000";when others=>data<=data;end case;elsif(ker="1011") thencase kec iswhen "001"=>data<="010000";when others=>data<=data;end case;elsif(ker="0111") thencase kec iswhen "001"=>data<="100000";when others=>data<=data;end case;end if;dout<=((not kr3)or(not kr2)or(not kr1)or(not kr0)); end PROCESS;SDIN<=data(5);lock<=data(4);sec<=data(3);CR<=data(2);set<=data(1);crack<=data(0);END one;LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;ENTITY bian_ma IS ------编码PORT(en,clk:IN std_logic;kr3,kr2,kr1,kr0:IN std_logic;kc2,kc1,kc0:IN std_logic;kk: out std_logic_vector(31 downto 0); dout:OUT std_logic);END bian_ma;ARCHITECTURE one OF bian_ma ISsignal data:std_logic_vector(3 downto 0);signal ker:std_logic_vector(3 downto 0);signal d7,d6,d5,d4,d3,d2,d1,d0: std_logic_vector(3 downto 0); signal kec:std_logic_vector(2 downto 0);BEGINker<=kr3&kr2&kr1&kr0;kec<=kc2&kc1&kc0;PROCESS(ker)BEGINif(ker="1111")thencase kec iswhen others=>data<=data;end case;elsif(ker="1110") thencase kec iswhen "001"=>data<="1010";when others=>data<=data;end case;elsif(ker="1101") thencase kec iswhen "001"=>data<="0001";when "010"=>data<="0010";when "100"=>data<="0011";when others=>data<=data;end case;elsif(ker="1011") thencase kec iswhen "001"=>data<="0100";when "010"=>data<="0101";when "100"=>data<="0110";when others=>data<=data;end case;elsif(ker="0111") thencase kec iswhen "001"=>data<="0111";when "010"=>data<="1000";when "100"=>data<="1001";when others=>data<=data;end case;end if;dout<=((not kr3)or(not kr2)or(not kr1)or(not kr0));end PROCESS; d7<=data;d6<=data;d5<=data;d4<=data; d3<=data;d2<=data;d1<=data;d0<=data;kk<=d7&d6&d5&d4&d3&d2&d1&d0;END one;(3)工作状态选择library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_unsigned.all; --包含库--use IEEE.std_logic_arith.all;entity kong_zhi_qi isport(SDIN: IN std_logic; -- 串行数据输入trig : IN std_logic; -- 触发时钟lock : in std_logic; -- 上锁信号sec : in std_logic; -- 选择消隐输出CR: IN std_logic; -- 确认输入SET: IN std_logic; -- 设口令CRACK:IN std_logic; -- 解锁din: out integer range 15 downto 0; --输入的数据进行显示 n_err: out std_logic_vector(1 downto 0); --错误次数 n_cr : out std_logic_vector(2 downto 0); -- 输入数据个数ALERT: OUT std_logic; --报警输出REDL: out std_logic; -- 上锁显示标志sc: out std_logic; -- 消隐显示标志dead_lock: out std_logic; -- 死锁标志GREL: out std_logic --解锁显示标志);end entity kong_zhi_qi;architecture behv of kong_zhi_qi is--signal 声明signal pW_reg0: INTEGER RANGE 15 DOWNTO 0; --口令寄存器signal pW_reg1: INTEGER RANGE 15 DOWNTO 0;signal pW_reg2: INTEGER RANGE 15 DOWNTO 0;signal pW_reg3: INTEGER RANGE 15 DOWNTO 0;signal pW_reg4: INTEGER RANGE 15 DOWNTO 0;signal pW_reg5: INTEGER RANGE 15 DOWNTO 0;signal pW_reg6: INTEGER RANGE 15 DOWNTO 0;signal pW_reg7: INTEGER RANGE 15 DOWNTO 0;signal pc_reg0: INTEGER RANGE 15 DOWNTO 0; --解锁暂存器signal pc_reg1: INTEGER RANGE 15 DOWNTO 0;signal pc_reg2: INTEGER RANGE 15 DOWNTO 0;signal pc_reg3: INTEGER RANGE 15 DOWNTO 0;signal pc_reg4: INTEGER RANGE 15 DOWNTO 0;signal pc_reg5: INTEGER RANGE 15 DOWNTO 0;signal pc_reg6: INTEGER RANGE 15 DOWNTO 0;signal pc_reg7: INTEGER RANGE 15 DOWNTO 0;signal data_cnt: integer range 15 downto 0; --输入数据累加器 signal cr_cnt : std_logic_vector(2 downto 0);signal err_cnt: std_logic_vector(1 downto 0);signal tag: std_logic;signal sb : std_logic;--signal bff: INTEGER RANGE 15 DOWNTO 0;beginprocess(trig)beginif trig'event and trig = '1' thenif sec = '0' then sb <= not sb; sc <= sb; --消隐控制end if;if lock = '0' then REDL <= '0'; GREL<='1'; ALERT <= '1'; --上锁end if ;if tag = '1' then din <=1;REDL <= '0';ALERT <= '0'; GREL<='1'; -- 死锁else if SDIN = '0' thendin <= data_cnt;end if;end if;if tag = '0' thenif CR = '0' then -- 确认键按下if SET = '0' then -- 设置口令case cr_cnt iswhen "000" => pW_reg0 <= data_cnt; cr_cnt <= cr_cnt + '1';when "001" => pw_reg1 <= data_cnt; cr_cnt <= cr_cnt + '1';when "010" => pw_reg2 <= data_cnt; cr_cnt <= cr_cnt + '1';when "011" => pw_reg3 <= data_cnt; cr_cnt <= cr_cnt + '1';when "100" => pw_reg4 <= data_cnt; cr_cnt <= cr_cnt + '1';when "101" => pw_reg5 <= data_cnt; cr_cnt <= cr_cnt + '1';when "110" => pw_reg6 <= data_cnt; cr_cnt <= cr_cnt + '1';when "111" => pw_reg7 <= data_cnt; cr_cnt <= cr_cnt + '1';REDL <= '0'; GREL<='1'; ALERT <= '1';when others => pw_reg0 <= 0;end case;else if crack = '0' then -- 解锁case cr_cnt iswhen "000" => pc_reg0 <= data_cnt; cr_cnt <= cr_cnt + '1'; when "001" => pc_reg1 <= data_cnt; cr_cnt <= cr_cnt + '1';when "010" => pc_reg2 <= data_cnt; cr_cnt <= cr_cnt + '1';when "011" => pc_reg3 <= data_cnt; cr_cnt <= cr_cnt + '1';when "100" => pc_reg4 <= data_cnt; cr_cnt <= cr_cnt + '1';when "101" => pc_reg5 <= data_cnt; cr_cnt <= cr_cnt + '1';when "110" => pc_reg6 <= data_cnt; cr_cnt <= cr_cnt + '1';when "111" => cr_cnt <= cr_cnt + '1';-- when "11" => cr_cnt <= cr_cnt + '1';if (pc_reg0 = pw_reg0) thenif (pc_reg1 = pw_reg1) thenif (pc_reg2 = pw_reg2) then-- if (data_cnt = pw_reg3) thenif (pc_reg3 = pw_reg3) thenif (pc_reg4 = pw_reg4) thenif (pc_reg5 = pw_reg5) thenif (pc_reg6 = pw_reg6) thenif (data_cnt = pw_reg7) then din <=10;err_cnt <= "00";REDL <= '1';GREL<='0'; ALERT <= '1'; --解锁成功输出开锁信号else err_cnt <= err_cnt + '1';end if;else err_cnt <= err_cnt + '1';end if;else err_cnt <= err_cnt + '1';end if;else err_cnt <= err_cnt + '1';end if;else err_cnt <= err_cnt + '1';end if;else err_cnt <= err_cnt + '1';end if;else err_cnt <= err_cnt + '1';end if;else err_cnt <= err_cnt + '1';end if;when others => ALERT <= '1';end case;end if;end if;end if;end if;case err_cnt is -- 判断错误次数 when "00" => tag <= '0';when "01" => tag <= '0';when "10" => tag <= '0';when "11" => tag <= '1'; ALERT <= '1'; --死锁when others => tag <= '1'; ALERT <= '1';end case;n_cr <= cr_cnt; --送显示 n_err <= err_cnt;end if;dead_lock <= tag ;end process;end behv;。