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

名称:基于FPGA的密码锁的设计VHDL代码Quartus仿真(文末获取)

软件:Quartus

语言:VHDL

代码功能:

实验目的

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

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

实验原理

本实验要求利用VHDL语言设计一个密码锁,利用状态机的工作原理和方法,实

现上锁、解锁、报警等功能。采用自顶向下的设计方法,先确定系统顶层实体的功能设计,按功能划分为若干模块,然后对毎一个模块进一步细分,直至得到简单易实现

的子模块,最后分别对各个子模块进行VHDL建模。系统结构图如下:

QQ图片20240304155958.png

控制模块是整个系统的核心,其主要作用是接收按键和其他模块传递来的信号,然后根据系统的功能产生相应的控制信号并送到相关的模块,同时控制锁状态信号(开锁或上锁)和报警信号。控制模块采用有限状态机进行设计,例如:根据系统的运行情况,可以分为6个状态,即开锁状态、上锁状态、输入密码状态、密码初验正确状态、密码初验错误状态和报警状态。在开锁状态下按下上锁键,进入上锁状态,更新锁状态信号。在上锁状态下按下输入密码键,进入输入密码状态。在输入密码状态下,如果通过比较模块比较密码正确的话,则进入密码初验正确状态;如果密码错误,则进入密码初验错误状态。在密码初验正确状态,按下确认键,进入开锁状态;在密码初验错误状态,按下确认键,进入报警状态;在报警状态,输岀报警信号,如果按下报警复位键,则进入上锁状态。

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

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

实验内容

基本内容(占70%

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

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

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

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

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;
源代码

 扫描文章末尾的公众号二维码

在电子技术飞速发展的今天,具有防盗报警等功能的电子密码锁代替弹子锁和密码量少,安全性差的机械式密码锁已是必然趋势。随着电子技术的发展,电子密码锁设计也在不断地发展,有传统的PCB板设计、用PLC设计或者用单片机设计等。其中,使用较多的是基于单片机技术的设计。以单片机为主要器件, 其编码器与解码器的生成为软件方式。在实际应用中, 由于程序容易跑飞, 系统的可靠性能较差。而用VHDL可以更加快速、灵活地设计出符合各种要求的密码锁,优于其他设计方法。 本文介绍的是一种基于现场可编程门阵列FPGA 器件的电子密码锁设计方法。本文采用EDA技术,利用Quartus II工作平台和硬件描述语言,设计了一种电子密码锁,并通过一片FPGA芯片实现。 设计充分利用了FPGA的资源可编程特性,可高效率的对系统进行升级与改进.用FPGA 器件构造系统, 所有算法完全由硬件电路来实现, 使得系统的工作可靠性大为提高。由于FPGA具有IsP功能,当设计需要更改时, 只需更改FPGA 中的控制和接口电路, 利用EDA 工具将更新后的设计下载到FPGA 中即可, 无需更改外部电路的设计, 大大提高了设计的效率。 另外,在本文设计的系统中充分考虑了实际生活的需要,加入了键盘防抖、数码显示控制、自动报警的功能使得设计人性化、实用化,真正起到了为现实生化服务的目的。因此,该密码锁具有较高的推广价值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值