名称:基于FPGA的密码锁的设计VHDL代码Quartus仿真(文末获取)
软件:Quartus
语言:VHDL
代码功能:
实验目的
1.熟练掌握VHDL语言和 QuartusⅡ软件的使用
2.理解状态机的工作原理和设计方法
实验原理
本实验要求利用VHDL语言设计一个密码锁,利用状态机的工作原理和方法,实
现上锁、解锁、报警等功能。采用自顶向下的设计方法,先确定系统顶层实体的功能设计,按功能划分为若干模块,然后对毎一个模块进一步细分,直至得到简单易实现
的子模块,最后分别对各个子模块进行VHDL建模。系统结构图如下:
控制模块是整个系统的核心,其主要作用是接收按键和其他模块传递来的信号,然后根据系统的功能产生相应的控制信号并送到相关的模块,同时控制锁状态信号(开锁或上锁)和报警信号。控制模块采用有限状态机进行设计,例如:根据系统的运行情况,可以分为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;
源代码
扫描文章末尾的公众号二维码