• 方案介绍
  • 附件下载
  • 相关推荐
申请入驻 产业图谱

基于FPGA的密码锁的设计VHDL代码Quartus仿真

07/21 08:25
360
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

2-2403041603451L.doc

共1个文件

名称:基于FPGA的密码锁的设计VHDL代码Quartus仿真

软件:Quartus

语言:VHDL

代码功能:

实验目的:

1.熟练掌握VHDL语言和 QuartusⅡ软件的使用。

2.理解状态机的工作原理和设计方法。

实验原理:

本实验要求利用VHDL语言设计一个密码锁,利用状态机的工作原理和方法,实现上锁、解锁、报警等功能。采用自顶向下的设计方法,先确定系统顶层实体的功能设计,按功能划分为若干模块,然后对毎一个模块进一步细分,直至得到简单易实现的子模块,最后分别对各个子模块进行VHDL建模。

系统结构图如下:

QQ图片20240304155958.png

控制模块是整个系统的核心,其主要作用是接收按键和其他模块传递来的信号,然后根据系统的功能产生相应的控制信号并送到相关的模块,同时控制锁状态信号(开锁或上锁)和报警信号。

控制模块采用有限状态机进行设计,例如:根据系统的运行情况,可以分为6个状态,即开锁状态、上锁状态、输入密码状态、密码初验正确状态、密码初验错误状态和报警状态。

在开锁状态下按下上锁键,进入上锁状态,更新锁状态信号。

在上锁状态下按下输入密码键,进入输入密码状态。

在输入密码状态下,如果通过比较模块比较密码正确的话,则进入密码初验正确状态;如果密码错误,则进入密码初验错误状态。

在密码初验正确状态,按下确认键,进入开锁状态;在密码初验错误状态,按下确认键,进入报警状态;在报警状态,输岀报警信号,如果按下报警复位键,则进入上锁状态。

寄存器模块主要用来存储4位二进制密码。

较模块的功能是将密码输入端的输入值与寄存器端的密码进行比较,给出密码受否正确的信号。

实验内容:

基本内容(占70%

设计制作一个密码锁,要求有以下功能:

使用上锁按键可以使密码锁进入上锁状态,并给出上锁指示。

采用4位二进制密码输入,且在密码正确的情况下,按下确认键,才能打开密码锁,并给出解锁指示。

密码输入错误时进行报警通过报警复位键清除报警信号。

FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com

演示视频:

设计文档:

1. 工程文件

2. 程序文件

3. 程序编译

4. RTL图

5. 仿真文件(VWF文件)

6. 仿真图

初始密码为1234

仿真图为:先输入初始密码1234,开锁,开锁指示灯亮。按下修改密码按键,输入5678,确认后将密码修改为5678。再输入1234,此时无法开锁,密码错误,报警。按下报警复位按键,清除报警。再输入5678,确认,开锁,开锁指示灯亮。再按下关锁键,关锁,开锁指示灯灭。

部分代码展示:

LIBRARY?ieee;
???USE?ieee.std_logic_1164.all;
???USE?ieee.std_logic_unsigned.all;
--密码锁控制模块
ENTITY?mimasuo_ctrl?IS
???PORT?(
??????clk???????????????:?IN?STD_LOGIC;
??????password??????????:?IN?STD_LOGIC_VECTOR(15?DOWNTO?0);--输入密码
??????correct_password??:?IN?STD_LOGIC_VECTOR(15?DOWNTO?0);--正确密码
??????confirm???????????:?IN?STD_LOGIC;--确认
??????reset?????????????:?IN?STD_LOGIC;--重置
??????modify????????????:?IN?STD_LOGIC;--修改
??????lock_up???????????:?IN?STD_LOGIC;--锁住
??????alarm?????????????:?OUT?STD_LOGIC;--报警
??????led_open??????????:?OUT?STD_LOGIC;--开锁指示灯
??????current_state?????:?OUT?STD_LOGIC_VECTOR(2?DOWNTO?0)--输出当前状态
???);
END?mimasuo_ctrl;
ARCHITECTURE?trans?OF?mimasuo_ctrl?IS
???
???SIGNAL?state????????:?STD_LOGIC_VECTOR(2?DOWNTO?0)?:=?"000";
???SIGNAL?led_open_buf?:?STD_LOGIC?:=?'0';
???SIGNAL?confirm_rise?:?STD_LOGIC?:=?'0';
???SIGNAL?confirm_buf1?:?STD_LOGIC?:=?'0';
???SIGNAL?confirm_buf2?:?STD_LOGIC?:=?'0';
BEGIN
???current_state?<=?state;
???PROCESS?(clk)
???BEGIN
??????IF?(clk'EVENT?AND?clk?=?'1')?THEN???
confirm_buf1?<=?confirm;
confirm_buf2?<=?confirm_buf1;
??????END?IF;
???END?PROCESS;
???confirm_rise<=?confirm_buf1?AND?(NOT?confirm_buf2);--confirm信号上升沿
--状态控制6个状态
--?current_state=000;锁住
--?current_state=001;密码比对
--?current_state=010;开锁
--?current_state=011;密码错误
--?current_state=100;修改密码
--?current_state=101;报警
???PROCESS?(clk)
???BEGIN
??????IF?(clk'EVENT?AND?clk?=?'1')?THEN
?????????CASE?state?IS
????????????WHEN?"000"?=>--?锁住
???????????????IF?(confirm_rise?=?'1')?THEN
??????????????????state?<=?"001";
???????????????ELSE
??????????????????state?<=?"000";
???????????????END?IF;
????????????WHEN?"001"?=>--密码比对
???????????????IF?(correct_password?=?password)?THEN
??????????????????state?<=?"010";
???????????????ELSE
??????????????????state?<=?"011";
???????????????END?IF;
????????????WHEN?"010"?=>--开锁
???????????????IF?(modify?=?'1')?THEN
??????????????????state?<=?"100";
???????????????ELSIF?(lock_up?=?'1')?THEN
??????????????????state?<=?"000";
???????????????ELSE
??????????????????state?<=?"010";
???????????????END?IF;
????????????WHEN?"011"?=>--密码错误
??????????????????state?<=?"101";
????????????WHEN?"101"?=>--报警
IF?(reset?=?'1')?THEN--报警复位
??????????????????state?<=?"000";
???????????????ELSE
??????????????????state?<=?"101";
???????????????END?IF;
????????????WHEN?"100"?=>--修改密码
???????????????IF?(confirm_rise?=?'1')?THEN
??????????????????state?<=?"010";
???????????????ELSE
??????????????????state?<=?"100";
???????????????END?IF;
????????????WHEN?OTHERS?=>
???????????????state?<=?"000";
?????????END?CASE;
??????END?IF;
???END?PROCESS;
???PROCESS?(clk)
???BEGIN
??????IF?(clk'EVENT?AND?clk?=?'1')?THEN
?????????IF?(state?=?"101")?THEN--state?=?"101"表示进入报警状态
????????????alarm?<=?'1';--输出报警信号
?????????ELSE
????????????alarm?<=?'0';
?????????END?IF;
??????END?IF;
???END?PROCESS;
???
???--控制开锁指示灯
???PROCESS?(clk)
???BEGIN
??????IF?(clk'EVENT?AND?clk?=?'1')?THEN
?????????IF?(state?=?"100"?OR?state?=?"010")?THEN
????????????led_open_buf?<=?'1';--高电平表示开锁
?????????ELSE
????????????led_open_buf?<=?'0';
?????????END?IF;
??????END?IF;
???END?PROCESS;
???
???
???led_open?<=?led_open_buf;--输出开锁指示灯
???
END?trans;

点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=688

  • 2-2403041603451L.doc
    下载

相关推荐