数电课程设计电子密码锁
数字电子技术课程设计电子密码锁

数字电子技术课程设计电子密码锁(总17页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--课程设计说明书课程名称:数字电子技术课程设计题目:电子密码锁学生姓名:专业:班级:学号:指导教师:日期:年月日电子密码锁一、设计任务与要求1.用电子器件设计制作一个密码锁,使之在输入正确的代码时开锁。
2.在锁的控制电路中设一个可以修改的4位代码,当输入的代码和控制电路的代码一致是锁打开。
3.用红灯亮、绿灯灭表示关锁,绿灯亮、红灯灭表示开锁4.如5s内未将锁打开,则电路自动复位进入自锁状态,并发报警信号。
二、方案设计与论证1、用按键输入四位十进制数字,输入密码要存储。
2、比较输入密码和原始密码。
当输入正确密码时,给出开锁信号,开锁信号用一个绿色指示灯表示,绿灯亮表示密码输入正确;如果输入密码不正确,用红灯表示。
3、锁的开关用红灯和绿灯表示,一次只能亮一盏。
红灯亮、绿灯灭表示关锁,绿灯亮、红灯灭表示开锁。
4、设置倒计时电路和自锁电路。
如果密码在5s内未能输入正确则发出报警声,并且自锁电路。
5、设置密码设置开关,开关闭合后,允许设置密码,设置好密码后,打开此开关。
6、需要在输入密码开始时识别输入,并由此触发计时电路。
方案一用74LS147译码器来把按键输入转化为二进制。
通过8片四位寄存器74LS194实现密码功能,其中四片用来存储预置密码,另四片则用来存储输入的密码。
当密码开始输入时开始计时,通过74LS192计数器实现计时功能;然后在密码输入期间,用74LS138数据选择器来选片存储。
数据选择器的输入端又一个两位的二进制的加法计数器来控制,当键盘有按键输入时计数器就加1,当一个按键按完后会轮到下一个芯片存储。
自锁功能利用74LS138来控制。
通过四片74LS85芯片判断原始密码和输入密码是否相同,接着用指示灯来表示密码的输入正确与否,如果密码没有输入正确的话,则红灯亮,否则则绿灯亮。
数电电子密码锁课程设计

数电电子密码锁课程设计一、课程目标知识目标:1. 理解数字电路基础知识,掌握电子密码锁的基本原理;2. 学会使用逻辑门、触发器等基本数字电路元件,并应用于电子密码锁的设计;3. 掌握电子密码锁的编码与解码技术,了解其安全性分析。
技能目标:1. 能够运用所学知识,设计并搭建一个简单的电子密码锁电路;2. 学会使用相关软件(如Multisim等)进行电路仿真,提高实际操作能力;3. 培养学生团队协作、动手实践和问题解决能力。
情感态度价值观目标:1. 培养学生对数字电路和电子技术的兴趣,激发创新意识;2. 增强学生的信息安全意识,了解密码学在生活中的应用;3. 树立正确的价值观,认识到科学技术对社会发展的积极作用。
课程性质:本课程为实践性较强的课程,结合理论知识,培养学生的实际操作能力和团队协作能力。
学生特点:学生在本年级已具备一定的数字电路基础,对电子技术有一定了解,但实际操作能力有待提高。
教学要求:教师应注重理论与实践相结合,关注学生个体差异,提供个性化指导,确保学生在课程中学有所获。
通过课程学习,使学生在知识、技能和情感态度价值观方面均取得具体的学习成果。
二、教学内容1. 数字电路基础知识回顾:逻辑门、触发器、计数器等基本元件的工作原理与应用;- 教材章节:第一章 数字逻辑电路基础2. 电子密码锁原理讲解:密码锁的工作流程、安全性分析;- 教材章节:第三章 安全电子密码锁3. 电子密码锁电路设计:使用逻辑门、触发器等元件设计密码锁电路;- 教材章节:第二章 组合逻辑电路设计4. 电路仿真与实验操作:利用Multisim软件进行电路仿真,实际搭建电子密码锁;- 教材章节:第四章 电路仿真与实验5. 编码与解码技术:了解常见编码方式,学习密码锁的解码技巧;- 教材章节:第三章 安全电子密码锁6. 团队协作与项目实施:分组进行项目实践,培养学生的团队协作能力和实际操作能力;- 教材章节:附录 实践项目指导教学进度安排:第一周:回顾数字电路基础知识,学习电子密码锁原理;第二周:设计电子密码锁电路,进行电路仿真;第三周:实际操作,搭建电子密码锁,学习编码与解码技术;第四周:团队协作,完成项目实施,进行成果展示与评价。
密码锁数电课程设计

密码锁数电课程设计一、课程目标知识目标:1. 学生能理解数字电路的基本原理,掌握密码锁中涉及的逻辑门电路及其功能。
2. 学生能描述密码锁数电课程的电路组成,解释其工作原理。
3. 学生能运用二进制数进行基本运算,并将其应用于密码锁的设计中。
技能目标:1. 学生能够运用所学知识,设计并搭建一个简单的密码锁电路。
2. 学生能够运用逻辑门电路进行问题分析,解决密码锁数电课程中遇到的实际问题。
3. 学生能够通过实验操作,培养动手能力和团队协作能力。
情感态度价值观目标:1. 学生培养对数字电路的兴趣,激发学习热情,形成主动探究的学习态度。
2. 学生在学习过程中,培养严谨、细心的实验操作习惯,增强安全意识。
3. 学生通过团队协作,培养沟通能力,学会尊重他人意见,形成合作共赢的意识。
分析课程性质、学生特点和教学要求,本课程目标注重理论与实践相结合,以项目式教学引导学生主动参与,旨在提高学生的数字电路知识水平,培养实际操作能力和团队协作精神。
通过本课程的学习,学生能够将所学知识应用于实际项目中,提高解决实际问题的能力。
二、教学内容本课程教学内容主要包括以下几部分:1. 数字电路基础知识:介绍逻辑门电路、触发器、计数器等基本概念和原理,对应教材第2章。
- 逻辑门电路:与门、或门、非门、与非门、或非门等。
- 触发器:RS触发器、D触发器、JK触发器等。
- 计数器:二进制计数器、十进制计数器等。
2. 密码锁原理及设计:分析密码锁的工作原理,学习设计简单的密码锁电路,对应教材第3章。
- 密码锁工作原理:介绍密码锁的基本组成、功能及其工作过程。
- 电路设计:根据密码锁原理,运用逻辑门电路设计密码锁。
3. 实践操作:分组进行实验,动手搭建和调试密码锁电路,对应教材第4章。
- 实验器材:准备逻辑门电路、触发器、计数器等实验器材。
- 实验步骤:根据教学大纲和实验指导书,分步完成密码锁电路的搭建和调试。
4. 教学进度安排:- 数字电路基础知识:2课时- 密码锁原理及设计:2课时- 实践操作:4课时三、教学方法针对本课程的教学目标、内容和学生的特点,采用以下多样化的教学方法:1. 讲授法:通过教师系统的讲解,使学生掌握数字电路基本原理和密码锁的相关知识。
数电实验报告电子密码锁设计

数电实验报告电子密码锁设计
实验报告
实验十四电子密码锁设计与实现
3.4.1 实验目的与设计要求
目的:(1)学习4位数值比较器CC14585和74LS85的功能。
(2)掌握电子密码锁的工作原理及综合实验技能。
要求:(1)电路可以由主持人预置16种不同的开锁密码,并能够更换。
(2)当输入和预置开锁密码相同时,发出开锁信号(LED 显示)。
(3)如果连续三次输入错误密码即产生报警信号。
报警信号用声光报警电路指示(蜂鸣器等)。
(4)具备能够取消报警状态的功能。
3.4.2 实验仪器与器件
直流稳压电源一台;数字实验箱一个;计算机一台。
74LS75锁存器、74LS00、74LS10、74LS20、4位数值比较器CC14585或74LS85。
3.4.3 实验原理框图
设计思路:用74LS194四位寄存器作锁存电路,74LS75四位锁密
码
预
置
输
入锁存电路密码比较电路密码锁存装置计数器确认按钮
报警电路开锁电路确认按钮
密码输入
存器作密码锁存装置,4位数值比较器4585作密码比较电路,74LS160作计数器。
当连续三次输入错误密码即产生报警信号同时锁住,此时再输入正确密码不产生开锁信号。
仿真图如下:。
数字电子技术课程设计密码锁

题目密码锁控制电路设计一、设计任务与要求设计任务:设计一个密码锁的控制电路,使二在输入正确的开锁代码时,输出开锁信号将锁开启;并用红灯亮,绿灯灭表示关锁;而绿灯亮,红灯灭表示开锁。
要求:1.在锁的控制电路中存储一个能够修改的4位代码,当开锁按钮开关的输入代码等于存储的代码时,将锁打开。
2.从第一个按钮触动以后的5S内若未将锁打开,则电路自动复位并进入自锁状态,使之无法再打开,并由杨声器发出报警信号(可用黄色发光二极管指示)。
二、方案设计与论证1方案论证基于数字系统的设计方式有两大类:1)、自下而上的设计方式;2)、自下而上的设计方式。
方案一:用TTL与COMS芯片设计,由下而上设计总个系统,第一组成功能单元电路在山此组装。
此方案设汁思路明确,所用知识简但。
易于调试安装接线,但利用器件较多,系统不是很稳固,用明显不足。
方案二:用TTL与COMS芯片设计,由下而上设计总个系统,第一肯定系统的逻辑功能,将系统分为控制器和逻辑器,再用ASM肯定控制器算法。
此方案系统集成度较高且稳固,但控制器实现算法较难设计,且接线繁乱(需用总线), 鉴于设计可实现问题。
方案三:用可编程逻辑器件ispLSI1061实现设计,山下而上设计总个系统将逻辑电路输入可编程开发系统,编译成JEDEC文件实现系统电路。
可是,基于初学者对可编程逻辑器件知识欠缺,对系统软件平台和硕件的不熟悉,所以该设计方案有明显的难度。
方案四:用单片机设计,用Keil编写一个C程序,将其拷进单片机系统,从而实现密码锁功能。
此方案只需再程序上花点功夫,易于实现,可是对于单片机未免牛鼎烹鸡,不适于大规模设计。
基于以上方案论证:相对于初学者而言,选择方案一较为实际,易于实现。
2方案设计现对方案一作如下设计讨论:数字密码锁控制电路的设计,能够理解为是数字信号的处置和控制,即信号的输入、存储、对比、分析、检测、反馈、输出。
第一,输入四位二进制数并把二进制数进行存储;第二;二进制数的数字逻辑与设置密码对比;再者,分析比较结果和比较位数;最后,检测输出控制锁信号。
密码锁数电课程设计

密码锁数电课程设计一、课程目标知识目标:1. 理解数字电路基本原理,掌握密码锁中涉及的逻辑门、触发器等组件的工作原理;2. 学会分析简单的数字电路图,识别密码锁电路中的关键电子元件及其功能;3. 掌握二进制数与十进制数的转换方法,并运用至密码锁的密码设置与破解。
技能目标:1. 能够运用所学知识设计简单的密码锁电路,并进行仿真测试;2. 培养学生动手操作能力,完成密码锁电路的搭建与调试;3. 提高学生问题解决能力,学会运用逻辑推理和分析方法解决密码锁相关的问题。
情感态度价值观目标:1. 培养学生对电子技术的兴趣,激发学习热情,形成积极探索科学技术的态度;2. 增强学生的团队协作意识,培养合作解决问题的能力;3. 强化学生的创新意识,鼓励学生在设计过程中提出独特见解,形成独立思考的习惯。
课程性质分析:本课程为初中信息技术课程,结合了电子技术与实际应用,旨在帮助学生将理论知识与实践操作相结合。
学生特点分析:初中学生对新鲜事物充满好奇,具备一定的动手操作能力和逻辑思维能力,但缺乏实际电子技术应用经验。
教学要求:1. 注重理论与实践相结合,强调动手实践在教学过程中的重要性;2. 以学生为主体,激发学生主动探索、合作学习的兴趣;3. 关注个体差异,鼓励学生发挥自身优势,提高综合素质。
二、教学内容1. 数字电路基础:包括逻辑门(与、或、非门等)、触发器(RS触发器、D触发器等)的基本原理与运用;2. 密码锁原理:介绍密码锁的基本构成,分析其工作原理,讲解密码设置与破解的方法;3. 二进制与十进制转换:学习二进制数与十进制数的转换方法,并应用于密码锁密码的设置与破解;4. 电路图分析:学会分析简单的数字电路图,识别密码锁电路中的关键电子元件及其功能;5. 密码锁电路设计与仿真:运用所学知识设计简单的密码锁电路,利用Multisim等软件进行仿真测试;6. 密码锁电路搭建与调试:动手操作,搭建密码锁电路,进行调试与优化。
电子密码锁数电课程设计

电子密码锁数电课程设计课程设计任务书学生姓名:专业班级:指导教师:工作单位:题目: 《数字电子密码锁》初始条件:利用集成集成芯片和门电路等设计一个数字电子密码锁。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)设计一个数字电子锁,有其预先设定好的密码,该密码可以修改。
(2) 输入密码按确定键后,若密码正确则锁打开;若密码不正确则电路发出报警信号。
任意输入密码而不按确定键的话电路不会有反应。
(3)任意输入密码而不按确定键的话电路不会有反应。
(4)打开的持续时间为Tx ,警报持续时间也为Tx,即按下确定键到松开后10秒,按住确定键不放的话一直打开或者报警。
时间安排:第17周理论讲解,地点:新3-205第18周理论设计及实验安装调试,地点: 鉴主15楼通信实验室第19周撰写报告及答辩,地点:鉴主16楼报告厅指导教师签名:年月日系主任(或责任教师)签名:年月日目录1 绪论 (1)1.1 课程设计的目的 (1)1.2 课程设计的任务及要求 (1)2 工作原理及方案选择 (1)2.1 电路设计的多种方案 (1)方案一 (2)方案二 (2)2.2 电路设计方案的比较 (2)3 电路设计及仿真 (3)3.1 数字电子密码锁的设计原理框图 (3)3.2 各组成部分电路的设计 (3)密码输入及验证电路的工作原理 (3)密码修改及输出锁定 (5)计时模块 (6)逻辑组合模块 (7)3.3 数字电子密码锁的总电路图 (8)3.4 电路参数的选择及计算 (8)4 电路软件仿真 (10)4.1 开锁的仿真 (10)4.2 报警的仿真 (11)4.3 数据测试 (12)5 电路的安装与调试 (15)5.1 焊接电路 (15)5.2 总电路的调试 (16)5.3 调试中遇到的问题及分析与总结 (16)6 心得体会 (17)7 附录 (18)7.1 仪器仪表电子元器件明细清单 (18)7.2参考文献 (19)摘要电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。
数电课程设计电子密码锁

数字逻辑设计课程设计报告书题目名称:电子密码锁学院:光电信息学院小组成员:钟永捷2011059080024侯晨涛2011059170003徐昊2011059060029指导教师:李力日期: 2013年6月28日一、小组成员分工情况侯晨涛:所有编程工作、资料查找工作量:60%钟永捷:辅助编程、图表制作、资料查找工作量:20%徐昊:论文写作、图表制作、资料查找工作量:20%二、题目分析1.输入信号通过扫描键盘的行与检测键盘的列得到输入信号。
2.输出信号通过译码器得到的显示器显示信息,开关锁动作。
三、设计总框图四、各模块说明(一)键盘扫描模块1.原理通过时序信号产生脉冲,不间断地向矩阵键盘的行输入1110-1101-1011-0111的循环序列。
同时将各列的电平置高,检测矩阵键盘各列的电平变化。
若在一定时间内,扫描到第n列电平为零时恰好第m行的m,位置上键被按下。
输入电平也为零,则判断键盘上[]n2. 模块框图3. 状态表此模块只需要通过编码器实现即可,假定前四位表示各行扫描结果,后三位表示各列扫描的结果。
4.仿真结果Key_in代表按键按下与否情况,Key_mem将其记录并输出,scan为行扫描信号,Key_out为按键输出值。
如上仿真结果所示,当scan为1110时,扫描第一行。
按下第一个键,即Key_in为110,此时Key_out 为0001,即输出值为1。
其它状态依此类推。
(二)输入模块1.原理设置两个寄存器,一个作为用户所想设置密码的密码寄存器。
另一个寄存器则是将键盘Input的键值存储起来。
最后通过一个比较器将两个寄存器的值进行比较。
若相同则输出“open”,反之,输出“error”。
比较器内部通过多位异或门实现。
2.模块框图3.状态图1)删除字符第一次输入值为0101,Number_sig第0到3位将其保存。
第二次输入值为0011,Number_sig第4到7位将其保存。
第三次输入值为0001,Number_sig第8到11位将其保存。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字逻辑设计课程设计报告书题目名称:电子密码锁学院:光电信息学院小组成员:钟永捷2011059080024侯晨涛2011059170003徐昊2011059060029指导教师:李*日期: 2013年6月28日一、小组成员分工情况侯晨涛:所有编程工作、资料查找工作量:60%钟永捷:辅助编程、图表制作、资料查找工作量:20%徐昊:论文写作、图表制作、资料查找工作量:20%二、题目分析1.输入信号通过扫描键盘的行与检测键盘的列得到输入信号。
2.输出信号通过译码器得到的显示器显示信息,开关锁动作。
三、设计总框图四、各模块说明(一)键盘扫描模块1.原理通过时序信号产生脉冲,不间断地向矩阵键盘的行输入1110-1101-1011-0111的循环序列。
同时将各列的电平置高,检测矩阵键盘各列的电平变化。
若在一定时间内,扫描到第n列电平为零时恰好第m行的m,位置上键被按下。
输入电平也为零,则判断键盘上[]n2. 模块框图3. 状态表此模块只需要通过编码器实现即可,假定前四位表示各行扫描结果,后三位表示各列扫描的结果。
按下“8”键1011 101 S8 1000按下“9”键1011 011 S9 1001按下“#”键0111 011 S10 1010按下“*”键0111 110 S11 10114.仿真结果Key_in代表按键按下与否情况,Key_mem将其记录并输出,scan为行扫描信号,Key_out为按键输出值。
如上仿真结果所示,当scan为1110时,扫描第一行。
按下第一个键,即Key_in为110,此时Key_out 为0001,即输出值为1。
其它状态依此类推。
(二)输入模块1.原理设置两个寄存器,一个作为用户所想设置密码的密码寄存器。
另一个寄存器则是将键盘Input的键值存储起来。
最后通过一个比较器将两个寄存器的值进行比较。
若相同则输出“open”,反之,输出“error”。
比较器内部通过多位异或门实现。
2.模块框图3.状态图4.仿真结果1)删除字符判断寄存器输入寄存器第一次输入值为0101,Number_sig第0到3位将其保存。
第二次输入值为0011,Number_sig第4到7位将其保存。
第三次输入值为0001,Number_sig第8到11位将其保存。
第四次输入值为1010,即删除键。
第五次输入值为0111,Number_sig第8到11位的值由0001变为0111,即实现了删除功能。
2)密码输入正确Correct=1说明密码输入正确,Number_sig的值为000011001101111000000000,Number_sig的值通过七段显示译码器之后将使数码管显示OPEn00。
3)密码输入错误Correct=1说明密码输入正确,Number_sig的值为110111111111000011110000,Number_sig的值通过七段显示译码器之后将使数码管显示ERROR0。
(三)密码判断及更改1.原理密码判断模块:通过比较器将输入寄存器与存储寄存器中的数据进行比较,如果数据相同,则判断密码正确。
如果数据不同,则返回输入等待状态,并对输入寄存器中的数据清零。
密码更改模块:将第一次与第二次输入寄存器中的数据输入比较器比较,如果数据相同则将该数据输入进密码存储寄存器中。
如果数据不同,则返回数据输入前的数据等待状态。
2.模块框图比较器相同不同存储寄存器返回输入前状态第一次输入寄存器第二次输入寄存器输入输入比较器输入寄存器存储寄存器输入输入不同相同判断密码正确3.仿真结果main_state为10000即update状态,按键六次输入值为0110,0110,0110,0110,0110,0010,第二次输入相同。
即将密码由666666改为266666。
第二次输入完成same为1,说明两次输入相同。
按“#”键确认后。
当状态变为01000时,即in_put输入密码Inputpd为001001100110011001100110即266666,correct 为1说明密码修改成功并开锁。
(四)主状态机1.原理状态分五个状态:Waits,Input,Pass,Update,Forbid。
在Waits状态下,摁下“#”进入密码“Input”状态,在“Input”状态下摁“*”可删除当前Input 的字符。
若密码输入正确则进去“Pass”状态,否则进入“Forbid”状态,这时若摁下“#”键,则重新返回“Waits”状态。
摁下“*”键进入“Update”状态,输入两次密码然后摁“#”键进行确定,若两次密码不相同则Update失败,重新返回到“Pass”状态。
若两次密码相同,则返回到“Waits”状态。
2.模块框图3. 状态表Waits in_put Pass Forbid Update Right1Right2Error当前状态S Waits in_put Pass Forbid Update Update Update DS*Key_scan#*00Waits in_put Update Forbid Update Update Update D01in_put in_put Pass Waits Update Update Waits Pass10Waits in_put Pass Forbid Update Update Update D11D Pass D D Right1Right2D D1D Forbid D D D Error D DRight4. 仿真结果1) 密码输入错误按下“#”键,进行密码输入(main_state 由00001变为01000),此时error 为1说明密码输入错误。
main_state 变为forbid 状态(由01000变为00100)。
再按下“#”键,重新返回waits 状态(由00100变为00001)。
2)密码输入正确,且修改密码成功按下“#”键,进行密码输入(main_state由00001变为01000),此时correct为1说明密码输入正确。
由in_put变为pass(由01000变为00010)。
按下“*”进行密码修改,由00010变为10000修改正确,主状态重新返为wait。
3)密码输入正确,但密码修改失败按下“#”键,进行密码输入(main_state由00001变为01000),此时correct为1说明密码输入正确。
由in_put变为pass(由01000变为00010)。
按下“*”进行密码修改,由00010变为00010主状态由修改错误重新返为pass。
(五) 显示1. 原理这里的选择24位数码管控制模块,将24位拆分为六组四位编码输入七段译码器。
将译码输出与扫描模块产生的扫描时序共同作用于六位数码管。
得到所需显示结果。
2. 模块框图3. 仿真结果输入信号Number_sig 的值为000100100011010001010110即123456,Scan_sig 的值为011111时,即第一个数码管亮时Duan_date 的值为0110000即数码管显示数字为1。
综合以上,此时第一个数码管显示为1,之后第二个数码管显示为2,第三个数码管显示为3……数码管控制模块 (24位)七段译码器扫描模块六位数码管输入扫描分六组输入四位编码开始扫描五、验证方案采取自上而下的设计方案,首先将题目要求拆分成各大模块,然后通过编写Verilog语言的程序实现各模块的功能。
在2quatus中仿真出时序逻辑图,并验证程序的正确性。
图1.设计总框图的实现六、课程设计心得体会通过这次数字密码锁的课程设计,我们掌握了如何通过数字逻辑知识来设计一个可应用于生产生活中的拥有实际应用功能的数字逻辑器件。
首先我们要了解其具体功能要求,然后采用自上而下的设计方法,建立整体逻辑框图并将其划分为各个具体功能模块。
之后,我们通过编写Verilog程序实现每一模块的功能。
在编译无错误后,通过quartus 2软件自带的波形仿真功能检测模块功能是否实现。
当波形达到要求,将各模块拼接,得到最终的密码锁整体逻辑结构(如图1)。
在讨论课程设计时,我们最初想通过简单的逻辑门和逻辑器件来实现密码锁功能,以简化程序部分。
但是因为状态之间转换的复杂性,无法实现。
之后我们决定每一功能模块均通过程序来实现,并自动生成状态图及逻辑图。
这样工作的任务全部转移到编程上。
编程的感想:对于编程,我想说从对verilog一窍不通(C也不太会)到能独立地使用其进行编程,这将近一月的时间里,我学会了很多,一开始面对这个题目,完全不知道从何下手,从图书馆借了一本书就开始慢慢看,然后就尝试着去写,有时候一个简单的错误困扰了我整整一天甚至两天都想不出来。
这个题目的程序是我这将近一个月的心血,每一行都是经过思考后写下的。
通过这次课程设计,我体会到了编程的乐趣,当你长时间困扰在一个问题上,突然间的一个奇思妙想就可以解决问题或者实现一个以前实现不了的功能,就是这种偶尔的惊喜使得我坚持了下来。
这次课程设计美中不足的是,虽然各个模块都可以实现其功能,但是将其和在一起就会有问题,虽然编译无错误,但是功能无法实现。
因为时间原因,无法对其进行修正,这是我的一个遗憾。
程序编写的同时我们进行状态表的绘制,不同于软件仿真出的状态表,我们将状态简化绘制表格,只体现编程时的大致思路。
在这个过程中,我们熟练掌握了如何将抽象的状态变化绘制成状态转移表。
以及简单状态图的绘制方法。
七、源文件(详见附件)源代码:top.v //顶层文件****************************************************************************************** module top(clk,Rst,key_out,Duan_date,Scan_sig);input clk;input Rst;input [3:0] key_out;output [6:0] Duan_date;output [5:0] Scan_sig;wire [3:0] scan;wire [2:0] key_in;wire [2:0] key_mem;wire correct;wire error;wire same;wire [4:0] main_state;wire [23:0] Number_sig;wire [23:0] Inputpd;main_state_machine M1(.clk(clk),.Rst(Rst),.key_out(key_out),.correct(correct),.error(error),.same(same),.main_state(main_state),.key_mem(key_mem));key_scan M2(.clk(clk),.Rst(Rst),.key_in(key_in),.scan(scan),.key_out(key_out),.key_mem(key_mem));In_put M3(.clk(clk),.Rst(Rst),.key_out(key_out),.key_mem(key_mem),.correct(correct),.error(error),.main_state(main_state),.Number_sig(Number_sig),.Inputpd(Inputpd));passwdcom M4(.clk(clk),.Rst(Rst),.key_out(key_out),.Inputpd(Inputpd),.main_state(main_state),.key_mem(key_mem),.correct(correct),.error(error),.same(same));top_led M5(.clk(clk),.Rst(Rst),.Number_sig(Number_sig),.Duan_date(Duan_date),.Scan_sig(Scan_sig));endmodule******************************************************************************************Key_scan.v //键盘扫描****************************************************************************************** module key_scan(clk,scan,key_in,key_out,key_mem,Rst);input clk;input Rst;input [2:0] key_in;output [3:0] scan;output [3:0] key_out;output [2:0] key_mem;reg [3:0] scan;reg [3:0] key_out;reg [31:0] counter;reg _20clk;reg [1:0] Q;reg [2:0] key_mem;always @(posedge clk or negedge Rst)if(!Rst)begincounter <= 0;endelsebegincounter <= counter + 1'b1;if( counter == 12500)begincounter <= 0;_20clk <= ~_20clk;endendalways @( posedge _20clk )beginQ <= Q + 1'b1;endalways @(posedge clk or negedge Rst)beginif(!Rst)key_mem <= 3'b111;elsecase(Q)2'b00:beginscan = 4'b1110;case( key_in )3'b110 :beginkey_out <= 4'd1;key_mem <= 3'b110;end3'b101 :beginkey_out <= 4'd2;key_mem <= 3'b101;end3'b011 :beginkey_out <= 4'd3;key_mem <= 3'b011;enddefault : key_out <= 4'dz; endcaseend2'b01:beginscan = 4'b1101;case( key_in )3'b110 :beginkey_out <= 4'd4;key_mem <= 3'b110;end3'b101 :beginkey_out <= 4'd5;key_mem <= 3'b101;end3'b011 :beginkey_out <= 4'd6;key_mem <= 3'b011;enddefault : key_out <= 4'dz; endcaseend2'b10:beginscan = 4'b1011;case( key_in )3'b110 :beginkey_out <= 4'd7;key_mem <= 3'b110;end3'b101 :beginkey_out <= 4'd8;key_mem <= 3'b101;end3'b011 :beginkey_out <= 4'd9;key_mem <= 3'b011;enddefault : key_out <= 4'dz; endcaseend2'b11:beginscan=4'b0111;case( key_in )3'b110 : key_out <= 4'd10; 3'b101 :beginkey_out <= 4'd0;key_mem <= 3'b101;end3'b011 : key_out <= 4'd11; default : key_out <= 4'dz; endcaseendendcaseendendmodule******************************************************************************************In_put.v //输入****************************************************************************************** module In_put (clk,Rst,key_mem,Number_sig,key_out,Inputpd,correct,error,main_state);input clk;input Rst;input [3:0] key_out;input [2:0] key_mem;input correct;input error;input [4:0] main_state;output [23:0] Number_sig; //数码管显示数据output [23:0] Inputpd;reg [23:0] Number_sig;reg [23:0] Inputpd;reg [5:0] cur_state;reg [5:0] next_state;parameter first = 6'b000_001,second = 6'b000_010,third = 6'b000_100,fourth = 6'b001_000,fifth = 6'b010_000,sixth = 6'b100_000,finish = 6'b111_111;parameter [4:0] waits = 5'b00001,pass = 5'b00010,forbid = 5'b00100,in_put = 5'b01000,update = 5'b10000;always @(posedge clk or negedge Rst)beginif(!Rst)cur_state <= first;elsecur_state <= next_state;endreg KH2L_f1; //检测按键电平reg KH2L_g1;reg KH2L_f2;reg KH2L_g2;reg KH2L_f3;reg KH2L_g3;wire H2L_sig1;wire H2L_sig2;wire H2L_sig3;always @(posedge clk or negedge Rst)if(!Rst)beginKH2L_f1 <= 1'b1;KH2L_g1 <= 1'b1;KH2L_f2 <= 1'b1;KH2L_g2 <= 1'b1;KH2L_f3 <= 1'b1;KH2L_g3 <= 1'b1;endelsebeginKH2L_f1 <= key_mem[0];KH2L_g1 <= KH2L_f1;KH2L_f2 <= key_mem[1];KH2L_g2 <= KH2L_f2;KH2L_f3 <= key_mem[2];KH2L_g3 <= KH2L_f3;endassign H2L_sig1 = (KH2L_g1&(!KH2L_f1))? 1'b1:1'b0; assign H2L_sig2 = (KH2L_g2&(!KH2L_f2))? 1'b1:1'b0; assign H2L_sig3 = (KH2L_g3&(!KH2L_f3))? 1'b1:1'b0;always @(posedge clk or negedge Rst)beginif(!Rst)Number_sig <= 24'b0000_0000_0000_0000_0000_0000;else if(main_state == in_put)beginif(correct == 1)Number_sig <= 24'b0000_1100_1101_1110_0000_0000;else if(error == 1)Number_sig <= 24'b1101_1111_1111_0000_1111_0000;else if(error == 0 && correct == 0)case(cur_state)first :if((H2L_sig1||H2L_sig2||H2L_sig3) && (key_out == 4'd10)) next_state <= first;else if((H2L_sig1||H2L_sig2||H2L_sig3) && (key_out != 4'd10)) beginNumber_sig[3:0] <= key_out;next_state <= second;endelsenext_state <= first;second :if((H2L_sig1||H2L_sig2||H2L_sig3) && (key_out == 4'd10)) next_state <= first;else if((H2L_sig1||H2L_sig2||H2L_sig3) && (key_out != 4'd10)) beginNumber_sig[7:4] <= key_out;next_state <= third;endelsenext_state <= second;third :if((H2L_sig1||H2L_sig2||H2L_sig3) && (key_out == 4'd10)) next_state <= second;else if((H2L_sig1||H2L_sig2||H2L_sig3) && (key_out != 4'd10)) beginNumber_sig[11:8] <= key_out;next_state <= fourth;endelsenext_state <= third;fourth :if((H2L_sig1||H2L_sig2||H2L_sig3) && (key_out == 4'd10)) next_state <= third;else if((H2L_sig1||H2L_sig2||H2L_sig3) && (key_out != 4'd10)) beginNumber_sig[15:12] <= key_out;next_state <= fifth;endelsenext_state <= fourth;fifth :if((H2L_sig1||H2L_sig2||H2L_sig3) && (key_out == 4'd10))next_state <= fourth;else if((H2L_sig1||H2L_sig2||H2L_sig3) && (key_out != 4'd10))beginNumber_sig[19:16] <= key_out;next_state <= sixth;endelsenext_state <= fifth;sixth :if((H2L_sig1||H2L_sig2||H2L_sig3) && (key_out == 4'd10))next_state <= fifth;else if((H2L_sig1||H2L_sig2||H2L_sig3) && (key_out != 4'd10))beginNumber_sig[23:20] <= key_out;next_state <= finish;endelsenext_state <= sixth;finish :if((H2L_sig1||H2L_sig2||H2L_sig3) && (key_out == 4'd10))next_state <= sixth;elsenext_state <= finish;default next_state <= first;endcaseendendalways @(posedge clk or negedge Rst)if(!Rst)Inputpd = 0;else if (cur_state == finish)Inputpd = Number_sig;endmodule****************************************************************************************** Led_encode.v //数码管加码****************************************************************************************** module led_encode(clk,Rst,Number_date,Duan_date);input clk;input Rst;input [3:0] Number_date;output [6:0] Duan_date;parameter _0 = 7'b1111_110,_1 = 7'b0110_000,_2 = 7'b1101_101,_3 = 7'b1111_001,_4 = 7'b0110_011,_5 = 7'b1011_011,_6 = 7'b1011_111,_7 = 7'b1110_000,_8 = 7'b1111_111,_9 = 7'b1111_011,_p = 7'b1100_111,_e = 7'b1001_111,_n = 7'b1110_110,_r = 7'b1110_111;reg [6:0] rDuan;always @(posedge clk or negedge Rst)if(!Rst)beginrDuan <= 7'b0000_000;endelsecase(Number_date)4'd0 : rDuan <= _0;4'd1 : rDuan <= _1;4'd2 : rDuan <= _2;4'd3 : rDuan <= _3;4'd4 : rDuan <= _4;4'd5 : rDuan <= _5;4'd6 : rDuan <= _6;4'd7 : rDuan <= _7;4'd8 : rDuan <= _8;4'd9 : rDuan <= _9;4'd12 : rDuan <= _p;4'd13 : rDuan <= _e;4'd14 : rDuan <= _n;4'd15 : rDuan <= _r;endcaseassign Duan_date = rDuan;endmodule******************************************************************************************passwdcom.v //密码比较及修改****************************************************************************************** module passwdcom(clk,Rst,Inputpd,main_state,key_out,correct,error,key_mem,same);input clk;input Rst;input [3:0] key_out;input [23:0] Inputpd;input [4:0] main_state;input [2:0] key_mem;output correct;output error;output same;reg correct;reg error;reg [5:0] cur_state;reg [5:0] next_state;reg one;reg same;reg [4:0] in_put ,update ;initialbeginin_put = 5'b01000;update = 5'b10000;endreg [23:0] Password = 24'b0110_0110_0110_0110_0110_0110; //初始密码666666always @(posedge clk or negedge Rst) //判断输入密码是否正确if(!Rst)begincorrect <= 0;error <= 0;endelse if(main_state == in_put)if(Inputpd === Password) //密码输入正确begincorrect <= 1;error <= 0;endelse //密码输入错误begincorrect <= 0;error <= 1;endparameter first = 6'b000_001, //定义按键状态 second = 6'b000_010,third = 6'b000_100,fourth = 6'b001_000,fifth = 6'b010_000,sixth = 6'b100_000,finish = 6'b111_111,finish2 = 6'b011_111;reg KH2L_f1; //检测按键电平reg KH2L_g1;reg KH2L_f2;reg KH2L_g2;reg KH2L_f3;reg KH2L_g3;wire H2L_sig1;wire H2L_sig2;wire H2L_sig3;always @(posedge clk or negedge Rst)if(!Rst)KH2L_f1 <= 1'b1;KH2L_g1 <= 1'b1;KH2L_f2 <= 1'b1;KH2L_g2 <= 1'b1;KH2L_f3 <= 1'b1;KH2L_g3 <= 1'b1;endelsebeginKH2L_f1 <= key_mem[0];KH2L_g1 <= KH2L_f1;KH2L_f2 <= key_mem[1];KH2L_g2 <= KH2L_f2;KH2L_f3 <= key_mem[2];KH2L_g3 <= KH2L_f3;endassign H2L_sig1 = (KH2L_g1&(!KH2L_f1))? 1'b1:1'b0; assign H2L_sig2 = (KH2L_g2&(!KH2L_f2))? 1'b1:1'b0; assign H2L_sig3 = (KH2L_g3&(!KH2L_f3))? 1'b1:1'b0;reg [23:0] password;reg [23:0] password2;always @(posedge clk or negedge Rst)beginif(!Rst)beginone = 1'b0;cur_state = first;endelse if(cur_state == finish && one == 0)beginone = 1'b1;cur_state = first;endelsecur_state = next_state;endalways @(posedge clk or negedge Rst) //修改密码beginif(!Rst)password = 24'b0110_0110_0110_0110_0110_0110;password2 = 24'b0110_0110_0110_0110_0110_0110;endelse if(main_state == update)case(one)0:case(cur_state)first :if(H2L_sig1||H2L_sig2||H2L_sig3)beginpassword[3:0] = key_out;next_state = second;endelsenext_state = first;second :if(H2L_sig1||H2L_sig2||H2L_sig3)beginpassword[7:4] = key_out;next_state = third;endelsenext_state = second;third :if(H2L_sig1||H2L_sig2||H2L_sig3)beginpassword[11:8] = key_out;next_state = fourth;endelsenext_state = third;fourth :if(H2L_sig1||H2L_sig2||H2L_sig3)beginpassword[15:12] = key_out;next_state = fifth;endelsenext_state = fourth;fifth :if(H2L_sig1||H2L_sig2||H2L_sig3)beginpassword[19:16] = key_out;next_state = sixth;endelsenext_state = fifth;sixth :if(H2L_sig1||H2L_sig2||H2L_sig3)beginpassword[23:20] = key_out;next_state = finish;endelsenext_state = sixth;finish :next_state = finish;default next_state = first;endcase1: //新密码第二次输入case(cur_state)first :if(H2L_sig1||H2L_sig2||H2L_sig3)beginpassword2[3:0] = key_out;next_state = second;endelsenext_state = first;second :if(H2L_sig1||H2L_sig2||H2L_sig3)beginpassword2[7:4] = key_out;next_state = third;endelsenext_state = second;third :if(H2L_sig1||H2L_sig2||H2L_sig3)beginpassword2[11:8] = key_out;next_state = fourth;endelsenext_state = third;fourth :if(H2L_sig1||H2L_sig2||H2L_sig3)beginpassword2[15:12] = key_out;next_state = fifth;endelsenext_state = fourth;fifth :if(H2L_sig1||H2L_sig2||H2L_sig3)beginpassword2[19:16] = key_out;next_state = sixth;endelsenext_state = fifth;sixth :if(H2L_sig1||H2L_sig2||H2L_sig3)beginpassword2[23:20] = key_out;next_state = finish2;endelsenext_state = sixth;finish2 :next_state = finish2;default next_state = first;endcaseendcaseendalways @(posedge clk or negedge Rst)beginif (!Rst)same <= 1'b0;else if (main_state == update && cur_state == finish2 && one == 1) beginif(password === password2)same <= 1'b1;elsesame <= 1'b0;endendalways @(posedge clk)beginif((H2L_sig1||H2L_sig2||H2L_sig3) && (key_out == 4'd10))Password = 24'b0110_0110_0110_0110_0110_0110;else if((H2L_sig1||H2L_sig2||H2L_sig3) && (key_out == 4'd11) && (same == 1))Password = password;elsePassword = Password;endendmodule******************************************************************************************led_scan.v //数码管扫描****************************************************************************************** module led_scan(clk,Rst,Scan_sig);input clk;input Rst;output [5:0] Scan_sig;parameter T1ms = 16'd49999;reg [15:0] C1;always @(posedge clk or negedge Rst)if(!Rst)C1 <= 16'd0;else if(C1 == T1ms)C1 <= 16'd0;elseC1 <= C1 + 1'b1;reg [3:0] i;reg [5:0] rScan;always @(posedge clk or negedge Rst)if(!Rst)begini <= 4'd0;rScan <= 6'b111_111;endelsecase(i)0:if(C1 == T1ms) i <= i + 1'b1;else rScan <= 6'b011_111;1:if(C1 == T1ms) i <= i + 1'b1;else rScan <= 6'b101_111;2:if(C1 == T1ms) i <= i + 1'b1;else rScan <= 6'b110_111;3:if(C1 == T1ms) i <= i + 1'b1;else rScan <= 6'b111_011;4:if(C1 == T1ms) i <= i + 1'b1;else rScan <= 6'b111_101;5:if(C1 == T1ms) i <= i + 1'b1;else rScan <= 6'b111_110;endcaseassign Scan_sig = rScan;endmodule******************************************************************************************led_control.v //数码管显示控制****************************************************************************************** module led_control(clk,Rst,Number_sig,Number_date);input clk;input Rst;input [23:0] Number_sig;output [3:0] Number_date;parameter T1ms = 16'd49999;reg [15:0] C1;always @(posedge clk or negedge Rst)if(!Rst)C1 <= 16'd0;else if(C1 == T1ms)C1 <= 16'd0;elseC1 <= C1 + 1'b1;reg [3:0] i;reg [3:0] rNumber;always @(posedge clk or negedge Rst)if(!Rst)begini <= 4'd0;rNumber <= 4'd0;endelsecase(i)0:if(C1 == T1ms) i <= i + 1'b1;else rNumber <= Number_sig[23:20];1:if(C1 == T1ms) i <= i + 1'b1;else rNumber <= Number_sig[19:16];2:if(C1 == T1ms) i <= i + 1'b1;else rNumber <= Number_sig[15:12];3:if(C1 == T1ms) i <= i + 1'b1;else rNumber <= Number_sig[11:8];4:if(C1 == T1ms) i <= i + 1'b1;else rNumber <= Number_sig[7:4];5:if(C1 == T1ms) i <= i + 1'b1;else rNumber <= Number_sig[3:0];endcaseassign Number_date = rNumber;endmodule******************************************************************************************main_state_machine.v //主状态机****************************************************************************************** module main_state_machine(clk,Rst,key_out,correct,error,main_state,same,key_mem);input clk;input Rst;input [3:0] key_out;input [2:0] key_mem;input correct;input error;input same;output [4:0] main_state;reg [4:0] main_state; //主状态parameter [4:0] waits = 5'b00001,pass = 5'b00010,forbid = 5'b00100,in_put = 5'b01000,update = 5'b10000;reg KH2L_f1; //检测按键电平reg KH2L_g1;reg KH2L_f2;reg KH2L_g2;reg KH2L_f3;reg KH2L_g3;wire H2L_sig1;wire H2L_sig2;wire H2L_sig3;always @(posedge clk or negedge Rst)if(!Rst)beginKH2L_f1 <= 1'b1;KH2L_g1 <= 1'b1;KH2L_f2 <= 1'b1;KH2L_g2 <= 1'b1;KH2L_f3 <= 1'b1;KH2L_g3 <= 1'b1;endelsebeginKH2L_f1 <= key_mem[0];KH2L_g1 <= KH2L_f1;KH2L_f2 <= key_mem[1];KH2L_g2 <= KH2L_f2;KH2L_f3 <= key_mem[2];KH2L_g3 <= KH2L_f3;endassign H2L_sig1 = (KH2L_g1&(!KH2L_f1))? 1'b1:1'b0;assign H2L_sig2 = (KH2L_g2&(!KH2L_f2))? 1'b1:1'b0;assign H2L_sig3 = (KH2L_g3&(!KH2L_f3))? 1'b1:1'b0;//主状态机always@(posedge clk or negedge Rst)beginif(!Rst)main_state <= waits;elsecase(main_state)waits:if ((H2L_sig1 || H2L_sig2 || H2L_sig3) &&(key_out === 4'd11)) main_state <= in_put;in_put:if(correct == 1) //由in_put转换到pass的条件main_state <= pass;//还要显示correctelse if (error == 1)main_state <= forbid;//显示errorpass:if((H2L_sig1 || H2L_sig2 || H2L_sig3) &&(key_out == 4'd10))main_state <= update; //进入修改密码状态else if((H2L_sig1 || H2L_sig2 || H2L_sig3) && (key_out == 4'd11)) //关锁main_state <= waits;update:if((H2L_sig1 || H2L_sig2 || H2L_sig3) && (key_out == 4'd11) && (same == 1)) main_state <= waits;else if((H2L_sig1 || H2L_sig2 || H2L_sig3) && (key_out == 4'd11) && (same == 0)) main_state <= pass;forbid:if((H2L_sig1 || H2L_sig2 || H2L_sig3) && (key_out == 4'd11))main_state <= waits;endcaseendendmodule******************************************************************************************top_led.v //数码管模块顶层封装****************************************************************************************** module top_led(clk,Rst,Number_sig,Duan_date,Scan_sig);input clk;input Rst;input [23:0] Number_sig;output [6:0] Duan_date;output [5:0] Scan_sig;wire [3:0] Number_date;led_control U1(.clk(clk),.Rst(Rst),.Number_sig(Number_sig),.Number_date(Number_date));led_encode U2(.clk(clk),.Rst(Rst),.Number_date(Number_date),.Duan_date(Duan_date));led_scan U3(.clk(clk),.Rst(Rst),.Scan_sig(Scan_sig));endmodule******************************************************************************************。