FPGA密码锁

功能

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

具体工程需要的可以私信我

上一篇:spark-sql实践


下一篇:yolox head