FPGA学习——数字密码锁(下)

数字密码锁(下)

上篇整理了前两个模块,可以做出来功能按键以及数字按键的信号,接着就要利用这些信号对密码锁进行控制。

3、控制模块

第三个模块为控制模块,主要实现的是一些信号的处理,也是整个工程的重中之重,主要完成了密码的接收、核对、更改、以及确认
首先就是接收从功能分配模块接受传送过来的信号,包括:

input clk;
input check;
input [3:0] number_key;
input state_lock;  //密码锁开启/关闭状态
input reset;
input clear_flag;  //清零状态
input lock;
input rece_flag;   //密码输入标志
input [3:0] rece_cnt;

接着就考虑输出的信号都有哪些。与控制模块的相接的就是最后的显示模块了,所以要考虑与显示相关的信号有哪些:

output reg  led;
output reg [3:0] disp_in1;
output reg [3:0] disp_in2;
output reg [3:0] disp_in3;
output reg [3:0] disp_in4;
output reg beep;		

做好接口以后,就开始做内部的逻辑电路设计。
首先做一个密码的初始化,即刚开机时候的密码:

initial
  begin
    password1<=4'd1;    //初始密码为1234
	 password2<=4'd2;
	 password3<=4'd3;
	 password4<=4'd4;
  end

然后接下来的设计主要分为三块:一是密码的接收,二是密码的判断,三是密码的更改
一共定义两组密码变量,一组是存储在寄存器中的真正密码,一组是用于接收按键输入的预备密码
下面为密码的接收部分:

always@(posedge clk)
    if(state_lock==1) begin
	   case(reset_state)
	    0:if(clear_flag==1)  begin
		        preword1<=4'd0;
				  preword2<=4'd0;
				  preword3<=4'd0;
				  preword4<=4'd0;
				 end
		   else begin
		       case(rece_cnt)
					0:begin
		            preword1<=4'd0;
					   preword2<=4'd0;
					   preword3<=4'd0;
					   preword4<=4'd0;
					  end
		         1:preword1<=number_key;
				 2:preword2<=number_key;
				 3:preword3<=number_key;
				 4:preword4<=number_key;
				default:begin
		           preword1<=preword1;
				   preword2<=preword2;
				   preword3<=preword3;
				   preword4<=preword4;
				   end
			endcase
	     end
		1:begin
			preword1<=password1;
			preword2<=password2;
			preword3<=password3;
			preword4<=password4;
		  end
		endcase 
   end
  

当输入的预备密码与存储在寄存器中的真正密码一致时,按下确认键才会打开密码锁

密码判断部分:

/****************密**码**核**实***************/  
always@(posedge clk)
 begin
  if(check==1)  confirm<=1;
  else if(clear_flag==1) confirm<=0;
  else if(state_lock==0) confirm<=0;
  else confirm<=confirm;
 end
  
assign right0[0]=(password1==preword1);
assign right0[1]=(password2==preword2);
assign right0[2]=(password3==preword3);
assign right0[3]=(password4==preword4);

always@(posedge clk)
   if(state_lock==1) begin
	    if(confirm==1)  begin
            if(right0==4'b1111)begin
					   led<=0; //输入密码正确指示灯亮
					   right<=1;
					   end
				else begin
			           led<=1;
					     right<=0;
					  end 
		      end
		 else if(reset_state==1)begin
		        led<=0;
				right<=1;
				end
		 else if((reset_state==0)&&(clear_flag==1))begin
			    led<=1;
				 right<=0;
				 end
		 else begin
		      led<=led;
				right<=right;
		      end
		end 
	else begin
	     led<=1;
		  right<=0;
		  end


由于只有三次输入密码的机会,所以也要对密码的确认次数进行限制,根据确认的次数以及密码的正确与否来对输入密码次数做出限制:

//*************密码确认次数控制****************//
always@(posedge confirm)
  begin
  if(state_lock==1) begin
     if(right==0) begin
        if(w_cnt==2'b11) w_cnt<=2'b00;
		  else w_cnt<=w_cnt+2'b1;
		  end
	  else w_cnt<=2'b00;	
     end
  else w_cnt<=2'b00;	  
  end

密码更改部分:

/*************更**改**密**码**********************/
  
always@(posedge clk)
   if(right==1) begin     //输入密码正确才可进入修改密码状态
      if(reset==1) reset_state<=1;
	   else if(lock==1) reset_state<=0;
		else reset_state<=reset_state;
		end
	else reset_state<=0;

always@(posedge clk)
    if(state_lock==1) begin
				case(reset_state)
				 1: if(clear_flag==1) begin
						 password1<=4'd0;
						 password2<=
  • 17
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 22
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肆意..

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值