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
具体工程需要的可以私信我