ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

FPGA密码锁

2021-11-01 00:00:49  阅读:258  来源: 互联网

标签:FPGA clk 密码 num rst 密码锁 reg change


功能

1.输入密码:十个拨码开关输入0-9密码(改进可以用矩阵键盘),4位密码,每输入一位,密码滚动进入显示。
2.开锁:按下开锁键开始成功灯亮。
3.关锁:按下关锁键,关锁灯灭。
4.修改密码:开锁状态下才可以修改密码,长按开锁键,灯闪一次后密码修改成功。
展示:B站

模块

基本需要下面几个模块来进行

compare_num密码对比
num_in输入的密码
num_reg已经设置的密码
-close关锁
ant_ok确认键
open0:锁上了、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

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

标签:FPGA,clk,密码,num,rst,密码锁,reg,change
来源: https://blog.csdn.net/weixin_46428375/article/details/121068893

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有