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

实现3位数字的密码锁设计Verilog代码VIVADO minisys板子

08/20 09:29
1158
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

2-240Z31R34T49.doc

共1个文件

名称:实现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板子如下,其他开发板可以修改管脚适配:

minisys板子.jpg

演示视频:

设计文档:

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

  • 2-240Z31R34T49.doc
    下载

相关推荐