功能
1.输入密码:十个拨码开关输入0-9密码(改进可以用矩阵键盘),4位密码,每输入一位,密码滚动进入显示。
2.开锁:按下开锁键开始成功灯亮。
3.关锁:按下关锁键,关锁灯灭。
4.修改密码:开锁状态下才可以修改密码,长按开锁键,灯闪一次后密码修改成功。
展示:B站
模块
基本需要下面几个模块来进行
compare_num | 密码对比 |
---|---|
num_in | 输入的密码 |
num_reg | 已经设置的密码 |
-close | 关锁 |
ant_ok | 确认键 |
open | 0:锁上了、1:锁开了 |
dig8_6 | 数码管显示模块 |
---|---|
[15:0] set_data | 显示数据 |
[3:0] dig | 位显示 |
[7:0] dict | 段显示 |
contorl_sw | 控制输入密码逐个进入 |
---|---|
close | 关锁 |
value | 用户输入的一位密码 |
keys | |
num | 数码管要显示的数据 |
|
btn_deb | 消抖 |
---|---|
N | 需要消抖按键个数 |
inputs | 输入的按键信号 |
btn_deb | 输入的按键信号消抖后 |
distinguish | 解码按键输入信号为密码 |
---|---|
inputs | 按键输入信号 |
temp | 按键输入对应一位密码 |
num_change | 进入修改 --密码修改 |
---|---|
please_change_numb | 请求修改信号 |
num | 输入要修改的密码 |
open | 锁状态 |
ok_change_numb | 修改成功 |
num_reg | 输出修改后密码 |
代码
下面给主要模块部分的代码
1.顶层文件
module cal_top(
input clk, //50MHz
input rst, //异步复位 低电平有效
input [9:0] inputs,
input [1:0] keys,
output ant_change_numb,
output ok_change_numb,
output open,
output [3:0] dig,
output [7:0] dict
);
/******************************************************/
/* 消抖 */
/******************************************************/
wire [1:0] keys_deb;
wire [9:0] btn_deb;//消抖后输出
btn_deb#( .N (10) )
btn_deb1
(
. clk(clk), //100MHz
. btn_in(inputs),
. btn_deb(btn_deb)
);
btn_deb#( .N (2) )
btn_deb2
(
. clk(clk), //100MHz
. btn_in(keys),
. btn_deb(keys_deb)
);
/******************************************************/
/* 解码 */
/******************************************************/
wire [3:0] temp;//解码后输出
distinguish distinguish1(
. clk(clk),
. rst(rst),
. inputs(btn_deb),
.temp(temp)
);
/******************************************************/
/* 输入数字逐个进入 */
/******************************************************/
wire [15:0] num;
wire close;//关锁
contorl_sw contorl_sw1(
.clk (clk),
.rst(rst),
. value(temp),
.close(close),
.num(num)
);
/******************************************************/
/* 按键长按检测 --密码修改 */
/******************************************************/
wire pleas_change_numb;//密码修改的按键按下
key_test_long key_test_long(
.clk(clk), //时钟信号:50Mhz
.rst(rst), //按键复位
.key(ant_ok), //用户按键
.out(ant_change_numb) //1:按 0;松
);
/******************************************************/
/* 能否进入修改 --密码修改 */
/******************************************************/
wire [15:0] num_reg;
num_change(
. please_change_numb(ant_change_numb),
. clk(clk),
. rst(rst),
. num(num),
. open(open),
.ok_change_numb(ok_change_numb), //是否可以修改密码
. num_reg(num_reg)
);
/******************************************************/
/* 密码比对 */
/******************************************************/
assign close = keys_deb[0]; //
assign ant_ok = keys_deb[1]; //ant_ok按一下解锁,长安修改密码
compare_num compare_num1(
.num_in(num),//输入的密码、
. num_reg(num_reg),//已经设置的密码
.clk(clk),
.rst(rst),
.close(close ),
.ant_ok(ant_ok),
.open(open)//0:锁上了、1:锁开了
);
/******************************************************/
/* 显示 */
/******************************************************/
wire [15:0] set_data;
//assign set_data = {temp,temp,temp,temp};
assign set_data = num;
dig8_6 dig8_6_1(
.clk(clk),
.rst(rst),
.set_data(set_data),
.dig(dig), //六位独热码表示六个数码管
.dict(dict) //位选数码管
);
endmodule
2.密码修改
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2021/10/29 11:25:37
// Design Name:
// Module Name: num_change
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module num_change(
input please_change_numb,
input clk,
input rst,
input [15:0] num,
input open,
output reg ok_change_numb, //是否可以修改密码
output reg [15:0] num_reg
);
always@(posedge clk )
begin
if (!rst)
ok_change_numb <= 1'b0;
else if(open&&please_change_numb)//开锁且修改键按下
ok_change_numb <= 1'b1;
end
always@(posedge clk )
begin
if (!rst)
num_reg <= 16'b0001_0010_0011_0100;
else if(ok_change_numb)//开锁且修改键按下
num_reg <= num;
end
endmodule
3.密码输入
module contorl_sw(
input clk,
input rst,
input back,
input close,
input [3:0] value,
input keys,//删除键
output reg [3:0] num1,
output reg [3:0] num2,
output reg [3:0] num3,
output reg [3:0] num4,
output reg [15:0] num
);
reg [3:0] value_1;
reg flag;
// reg back_1;
// reg flag_back;
always@(posedge clk )begin
if(!rst)begin
value_1 <= 4'd0;
end
else
begin
value_1[3:0] <= value[3:0] ;
end
end
always@(posedge clk )begin
if(!rst)
begin
flag <= 4'd0;
end
else if(value_1[3:0]!=value[3:0] )
flag <= 1'b1;
else
flag <= 1'b0;
end
always@(posedge flag or negedge rst )begin
if(!rst)
begin
num4<=4'd0;
num3<=4'd0;
num2<=4'd0;
num1<=4'd0;
end
else if(flag)
begin
num4<=num3; //开始左移
num3<=num2;
num2<=num1;
num1<=value;
end
// else if(close)
// begin
// num4<=4'd0;
// num3<=4'd0;
// num2<=4'd0;
// num1<=4'd0;
// end
end
always@(posedge clk )begin
if(!rst)
num<= 16'd0;
else if(close)
num<= 16'd0;
else
num<={num1,num2,num3,num4};
end
endmodule
具体工程需要的可以私信我