数字系统课程设计——VHDL密码锁控制器
@数字系统课程设计
VHDL密码锁控制器
VHDL语言设计的密码锁控制器,模拟仿真平台为vivado 2018。(学生:慌慌和张张)
使用器材:Nexys4 DDR Artix-7 FPGA
设计软件:Vivado2018
设计要求
(1)设计一个4位密码锁,用户拨动相应的开关进入输入密码状态,输入4位密码,按下确定键后,若密码正确,锁打开,若密码错误,将提示密码错误,要求重新输入,三次输入都错误,将发出报警信号。
(2)用户输入密码时,在按下确定键之前,可以通过按退格键修正,每按一次退格键消除一位密码。
(3)报警后,只有管理员作相应的处理(专用按键)才能停止报警。
(4)管理员可以通过设置(专用按键)更改密码。
(5)如果没有预置密码,密码缺省为“0000”。
(6)正确开锁后,用户处理完毕后,按下确定键,系统回到等待状态。
(7)系统操作过程中,只要密码锁没有打开,如果10秒没有对系统操作,系统回到等待状态。
(8)系统操作过程中,如果密码锁已经打开,如果20秒没有对系统操作,系统自动上锁,回到等待状态。
功能描述
(1)用户密码初始值为“1234”;
(2)管理员密码初始值为“0000”;
(3)非报警状态下,只要密码锁没有打开,如果10秒没有对系统操作,系统回到等待状态。
(4)非报警状态下,密码锁已经打开,如果20秒没有对系统操作,系统回到等待状态
(5)操作分为用户状态和管理员状态
(6)等待状态默认为用户状态
用户状态:
(1)设计一个4位密码锁,用户拨动相应开关进入输入密码状态,输入4位密码,通过数码管显示出来,按下确定键后,若密码正确,锁打开,数码管显示“HELLO”,若密码错误,数码管显示“ERROR”要求重新输入,三次输入都错误,将发出报警信号(10个LED灯闪烁)等待管理员操作。
(2)开锁后,用户可按相应键关锁,回到等待状态,也按下相应键进入修改密码状态,输入四位新密码,按下确认键则修改密码成功。
管理员状态:
(1)报警状态下,管理员按下相应键进入输密码状态,输入四位管理员密码,按下确定键进行验证(错误则提示“ERROR”重新输入,没有次数限制)。
(2)验证通过后,管理员可以按下管理员键停止报警,也可以按相应键修改用户密码,输入4位密码后按确认键则修改密码成功。
设计思路
根据自顶向下的设计方法,先确定系统顶层实体的功能设计,按功能划分成若干模块,系统主要由6个模块构成,分别是控制模块,分频模块,显示模块,计数器模块,输入模块,编码模块,然后由6个模块实现具体功能。其中控制模块主要由状态机构成。然后先编写test_bench文件,在仿真平台上运行代码,然后再下载到FPGA板子中,进行硬件的调试。
状态图:
接口设置:
状态机输入:共有16个按键输入,10个按键输入0~9,6个按键分别为重置,管理员键,用户键,改密码建,确定键,返回键;
状态机输出:16个LED灯,四位数码管输出。
时钟信号100MHz
状态描述
等待状态 S
等待输入第一位密码状态
等待输入第二位密码状态:S2
等待输入第三位密码状态:S3
等待输入第四位密码状态:S4
密码比较状态:S5
开锁状态:Sopen
管理员状态:Sadmin
报警状态:Salarm
错误状态:Serror
程序设计
密码锁显示模块:给七段数码管显示信号赋值
process(clk)
begin
case data is
when "0000"=>seg7<="10000001"; --数码管显示内容为0
when "0001"=>seg7<="11001111"; --数码管显示内容为1
when "0010"=>seg7<="10010010"; --数码管显示内容为2
when "0011"=>seg7<="10000110"; --数码管显示内容为3
when "0100"=>seg7<="11001100"; --数码管显示内容为4
when "0101"=>seg7<="10100100"; --数码管显示内容为5
when "0110"=>seg7<="10100000"; --数码管显示内容为6
when "0111"=>seg7<="10001111"; --数码管显示内容为7
when "1000"=>seg7<="10000000"; --数码管显示内容为8
when "1001"=>seg7<="10000101"; --数码管显示内容为9
when "1010"=>seg7<="11001000"; --数码管显示内容为H
when "1011"=>seg7<="10110000"; --数码管显示内容为E
When "1100"=>seg7<="11110001"; --数码管显示内容为L
when "1101"=>seg7<="10001000"; --数码管显示内容为R
When others =>seg7<="11111110"; --数码管显示内容为-
end case;
end process;
给数码管引脚赋值,进行显示
process(clk_in1) --数码管显示模块,固定显示4位密码variable n,m,x:std_logic_vector(2 downto 0):="000";beginif(clk_in1'event and clk_in1= '1') then --1khz的时钟信号触发,无法改变if (state = sopen) then --显示开锁信号case m iswhen "000"=> segselect8<="01111111";data<="1010"; --显示Hwhen "001" =>segselect8<="10111111";data<="1011"; --显示Ewhen "010" =>segselect8<="11011111";data<="1100"; --显示Lwhen "011" =>segselect8<="11101111";data<="1100"; --显示Lwhen "100" =>segselect8<="11110111";data<="0000"; --显示Owhen others =>segselect8<="11111111";data<="1111";end case; m := m+1;if(m="101") thenm:="000";end if; --显示错误elsif (state = serror or state = salarming)thencase x is
when "000"=> segselect8<="01111111";data<="1011"; --显示E
when "001" =>segselect8<="10111111";data<="1101"; --显示R
when "010" =>segselect8<="11011111";data<="1101"; --显示R
when "011" =>segselect8<="11101111";data<="0000"; --显示O
when "100" =>segselect8<="11110111";data<="1101"; --显示R
when others =>segselect8<="11111111";data<="1111";
end case;
x := x+1;
If(x="101") then
x:="000";
end if; --显示开锁信号elsecase n is
when "000"=> segselect8<="01111111";data<=code3; --显示第一位密码
when "001" =>segselect8<="10111111";data<=code2; --显示第二位密码
when "010" =>segselect8<="11011111";data<=code1; --显示第三位密码
when "011" =>segselect8<="11101111";data<=code0; --显示第四位密码
when others =>segselect8<="11111111";data<="1111";
end case;
n := n+1;
if(n="100") then
n:="000";end if;end if;end if;end process;
密码锁分频计数模块:
时钟分频信号2,产生1000HZ的时钟信号,用于数码管的显示
PROCESS(clk)
Variable count:integer range 0 to 100000; --
BEGINIF (clk'event AND clk='1') THEN --时钟上升沿IF(count<=49999) THENclk_in1<='1'; count := count +1;elsif(count=100000) thencount:=0;elsecount := count +1;clk_in1<= '0';End if;End if;
End process; --时钟分频信号验证成功
系统仿真波形
输入初始密码“1234”,从上述波形可以看到yonghumima代表正确用户密码,out_code代表输入的密码,这里可以看到密码输入成功,密码锁打开。
修改输入密码,首先输入初始密码“1234”,开锁后按下改密码键,将密码修改为“2345”;可以看到yonghumima用户密码从“1234”变为“2345”,表示修改密码成功。
Data[3~0]代表输入的4位密码,从图中也可以看到每次输入的密码。
仿真波形为:
硬件测试
正确输入密码“1234”,数码管显示:
按下确定键,验证密码正确,数码显示“HELLO”表示开锁成功。
密码输入错误,数码管显示“ERROR”提示输入密码错误:
三次密码输入错误,10个LED灯闪烁报警:
分析与总结
1.多时钟问题:
在写代码过程,在控制模块的进程使用了多个时钟信号来满足不同的功能,例子如下:在主进程中同时使用了判断条件(clk’event and clk = ‘1’)和(back’EVENT and back=‘1’),逻辑上并无错误,仿真也可以正常进行,并无错误,但是在综合布线时报错,
解决方案:
经查证,这个错误主要是由于一个process不可以由两个时钟触发,会产生竞争冒险,综合时会报错,因此可以给clk以外的时钟信号,增加一级状态,利用信号的值在进程结束以后才会更新的特点,利用寄存器来判断信号是否出现上升沿,例如(back’EVENT and back=‘1’)可以改写为
Process(clk)
Begin
If(clk’event and clk = ‘1’) then
Myback<=back;
If(Myback = ‘0’and back = ‘1’) then
……
End if;
End if;
这样就可以将back上升沿的判定改写为(Myback = ‘0’and back = ‘1’)。
2.数码管的显示问题
由于共阳极数码管每次只能点亮一个,因此需要将数码管按一定的频率依次点亮,利用视觉停留效果实现多个数码管的点亮,但是在实验中发现如果使用100Mhz的频率点亮数码管,数码管的显示会出现极大地错误,并不能显示相应的数字,而是会出现以下的效果,数码管出现混叠的状况,无法正常显示。
分工:
程序与仿真:慌慌,张张
硬件调试:慌慌,张张
实验报告:慌慌,张张
完整工程代码和实验报告:https://download.csdn.net/download/qq_41663196/20429906?spm=1001.2014.3001.5501
数字系统课程设计——VHDL密码锁控制器相关推荐
- 数字逻辑课程设计,简单的8位模型计算机verilog设计
简单8位模型计算机 0.摘要 1.绪论 1.1 模型计算机简介 1.2 设计主要内容 1.2.1 设计指标 1.2.2 设计思路 2.系统设计 2.1模型计算机原理 2.2 模型计算机组成 2.3 模 ...
- 嵌入式系统课程设计题目
简介:一些嵌入式系统课程设计题目,可以当做对你学习ARM的一个检测. 嵌入式系统课程设计-选题要求及课题 1.嵌入式系统课程设计时长两星期,要求学生分组进行课程设计,每组学生人数为2-3人(可在不超过 ...
- Verilog数字系统基础设计-数据转换器
绪论 在一些应用中,两个电路模块交界处,一个电路模块的输出数据位宽大于另一个模块的输入数据位宽,此时需要进行数据转换.例如,在SATA控制器中,内部数据位宽为32比特,但是与外部物理收发器PHY的接口 ...
- 2016计算机课程设计,2016年计算机组成原理课程设计-硬布线控制器的设计.doc
2016年计算机组成原理课程设计-硬布线控制器的设计 编 号: 学 号: 课 程 设 计 教 学 院计算机学院课程名称计算机组成原理课程设计题 目硬布线控制器的设计专 业计算机科学与技术班 级二班姓 ...
- matlab设计理想数字带通滤波器,基于matlab的数字带通滤波器课程设计报告
基于matlab的数字带通滤波器课程设计报告 1 西安文理学院机械电子工程系 课程设计报告 专业班级 08级电子信息工程1班 题 目 基于 MATLAB 的数字带通滤波器 学 号 学生姓名 指导教师 ...
- 火车站售票系统课程设计
火车站售票系统课程设计 一.课题内容和要求 设计目标:设计一个火车售票系统,用C语言实现.对该系统的要求如下: (1) 需求描述: 一.系统角色: 1.火车站售票员: 火车站售票员能够使用本系统完成基 ...
- 电信专业《数字信号处理课程设计》任务书
电信专业<数字信号处理课程设计>任务书 (一) clc;clear; Y_vect=[1 -0.5 0.25]; %num X_vect=[1 2 0 1]; %den figure(1) ...
- 计算机组成原理硬布线实验心得,计算机组成原理课程设计—硬布线控制器的设计与实现...
计算机组成原理课程设计-硬布线控制器的设计与实现 (13页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 硬布硬布线线控制器的控制器的设计 ...
- android课程设计计步器,数字计步器课程设计.doc
数字计步器课程设计 电子课程设计报告 题目名称: 数 字 计 步 器 姓 名: 杨 望 专 业: 计算机科学与技术 班 级: 090451班 学 号: 同 组 人: 徐 铁 指导教师 : 南昌航空大学 ...
最新文章
- 朱敏:40岁创业如何成就绝代明星?(五)
- PDF.NET数据开发框架操作MySQL实体类操作实例
- 【数理知识】《随机过程》方兆本老师-第1章-引论
- scrapy proxy and user_agent
- 使用码云中文乱码问题解决
- 揭秘软件开发的达摩克利斯之剑
- icmp协议介绍,type code 对应表
- mysql数据库undo日志恢复_MySQL的undo/redo日志和binlog日志,以及2PC
- 房地产开发如何选择最佳招标采购策略
- cv::Mat属性 step, size, step1, elemSize, elemSize1
- 网络攻击与防御-常用网络命令的使用
- 厦门情侣必去浪漫的餐厅
- hive以半小时为维度进行统计的需求
- MIT牛人解说数学体系
- 美国要求签证申请人提供社交媒体账号
- 基于android的记账APP大作业项目
- outlook2007 菜单灰色...不能使用的解决方案
- 时势造英雄—读《浪潮之巅》有感
- 一筐鸡蛋一个一个拿正好拿完java_求解:一筐鸡蛋:9个9个拿正好拿完8个8个拿还剩1个...
- 机器学习之线性回归值预测算法
热门文章
- FX3U源码V10.0
- 机房收费系统系列一:运行时错误‘-2147217843(80040e4d)’;用户‘sa’登陆失败
- GPT-4刚发布就有手机APP接入,上传照片视频一键解读,还当起了美版知乎的问答bot...
- 橡皮筋技术画移动直线
- 职称计算机考试word2003,最新职称计算机考试Word2003操作练习
- oracle数据库实现分区的几种方式
- pip问题:windows环境pip安装时一直报错Could not fetch URL
- c语言如何取字符串,c语言如何截取字符串?
- java 获取当前时间存入数据库
- java秒表代码_秒表 - java代码库 - 云代码