名称:实现3位数字的密码锁设计Verilog代码VIVADO minisys板子
软件:VIVADO
语言:Verilog
代码功能:
实现3位数字的密码锁,每位数字取值1、2、3。
功能说明:
A.按S1复位进入初始状态,数码管显示00000000;
B.若已解锁,或未设置密码:按S2设置密码,通过4*4小键盘输入3位初始密码,输入满三位后按S5确定,成功后GLDO亮;
C.若已设置密码:按S3可以验证密码,通过小键盘逐位输入密码,输入满三位 后按S5确定,如果正确则进入解锁状态,累计失败次数清零,不正确则累计失败次数+1,显示对应数量红灯,若累计3次则系统锁住,数码管显示ff,所有功能无效(除复位);
D.每次进入新状态,数码管清除上个状态的输入,每个状态下,同步显示键盘输入到数码管,显示方式不限,只需要逐位显示3个数字即可;
E.密码匹配要求用状态机实现其他未说明的细节可自己决定。4*4小键盘代码在pkg目录下,需理解工作原理掌握使用方法。
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
本代码已在minisys板子验证,minisys板子如下,其他开发板可以修改管脚适配:
演示视频:
设计文档:
1. 工程文件
2. 程序文件
3. 程序编译
4. RTL图
5. 管脚分配(约束文件)
6. Testbench
7. 仿真图
整体仿真图(顶层模块)
密码输入模块
密码锁控制模块
数码管显示模块
仿真分析:
顶层信号及状态信号如下图所示
图中按时间先后一共仿真了以下情况:
1.复位
2.设置密码为321(设置完成后GLD0变为高电平)
3.验证密码,输入123,提示密码错误(RLD亮1个)
4.验证密码,输入321,提示密码正确(RLD灭)
5.验证密码,输入323,提示密码错误(RLD亮1个)
6.验证密码,输入121,提示密码错误(RLD亮2个)
7.验证密码,输入232,提示密码错误(RLD亮3个)
8.密码锁进入锁定状态
图中,state_o表示当前状态值,状态值对应的状态含义为:
即state_o为0表示空闲状态,state_o值为1时表示设置密码状态,以此类推。
图中依次进行了以下状态跳转:
其中最后一张图的状态跳转顺序为3->7->4->6,即验证密码->比较密码->密码错误->密码系统锁定。是由于密码累计错误达到3次,导致密码锁锁定。图中也可以看到指示密码错误次数的error_cnt信号等于3,如下图所示。
部分代码展示:
`timescale 1ns / 1ps //密码锁控制模块 module lock_ctrl( input clk, input reset,//S1 input S2,//设置密码 input S3,//验证密码 input S4,//上锁 input S5,//确定 input [11:0] in_password,//输入的密码 output [2:0] state_o,//输出状态值 output reg GLD0,//led output reg [2:0] RLD0//led ); reg [2:0] state; assign state_o=state; parameter s_idle=3'd0;//空闲状态 parameter s_set_code=3'd1;//设置密码 parameter s_set_done=3'd2;//设置密码完成 parameter s_check=3'd3;//验证密码 parameter s_error=3'd4;//错误 parameter s_right=3'd5;//正确 parameter s_waring=3'd6;//系统锁 parameter s_comp=3'd7;//比较密码是否正确 reg [11:0] set_password;//设置的密码 reg [1:0] error_cnt;//错误计数 always@(posedge clk or posedge reset) if(reset) state<=s_idle; else case(state) s_idle: if(S2) state<=s_set_code; s_set_code://设置密码 if(S5) state<=s_set_done; s_set_done://设置密码完成 if(S3) state<=s_check; s_check://验证密码 if(S5) state<=s_comp; s_comp://比较密码是否正确 if(in_password==set_password) state<=s_right; else state<=s_error; s_right://密码正确 if(S4) state<=s_set_done; s_error: if(error_cnt>=2) state<=s_waring; else state<=s_set_done; s_waring: state<=s_waring; default: state<=s_idle; endcase always@(posedge clk or posedge reset) if(reset) set_password<=12'h000; else if(state==s_set_code && S5==1) set_password<=in_password;//设置的密码 always@(posedge clk or posedge reset) if(reset) error_cnt<=0; else if(state==s_error) error_cnt<=error_cnt+1;//错误计数 else if(state==s_right) error_cnt<=0;//清零 always@(posedge clk or posedge reset) if(reset) GLD0<=1'b0; else if(state==s_set_code && S5==1) GLD0<=1;//设置密码成功 always@(posedge clk or posedge reset) if(reset) RLD0<=3'b000; else case(error_cnt) 2'b00:RLD0<=3'b000; 2'b01:RLD0<=3'b001; 2'b10:RLD0<=3'b011; 2'b11:RLD0<=3'b111; default:; endcase endmodule
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=1022
1158