数字密码锁(下)
上篇整理了前两个模块,可以做出来功能按键以及数字按键的信号,接着就要利用这些信号对密码锁进行控制。
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<=