這個是一個密碼鎖的密碼模塊,但是我鍵盤輸入的鍵值無法進入,我仿真時鍵盤輸入了準備值(13),然后輸入了數字,但是四個密碼的暫存器就是不變,有沒有大神幫忙看看
module admin(clk,key,p0,p1,p2,p3,boom,error,flag);
input clk;
input [3:0] key;//按鍵輸入
input flag;
output reg [3:0] p0,p1,p2,p3;//密碼暫存
output reg boom,error;
parameter idle= 4'b0000;
parameter s0= 4'b0001;
parameter s1= 4'b0010;
parameter s2= 4'b0011;
parameter s3= 4'b0100;
parameter check= 4'b0101;
parameter boom0= 4'b0110;
parameter error0= 4'b0111;
parameter change0= 4'b1000;
parameter change1= 4'b1001;
parameter change2= 4'b1010;
parameter change3= 4'b1011;
parameter check0= 4'b1100;
reg [3:0] m0,m1,m2,m3;//老密碼
reg[3:0] next_state;//次態
reg[3:0] current_state;//現態
reg set;//設定密碼表示位
reg [12:0] cnt;
always@(posedge clk)
begin
current_state<=next_state;
end
always@(posedge clk)
begin
case(current_state)
idle://等待
begin
if(key==13)//準備
begin
next_state<=s0;
end
else
begin
next_state<=idle;
end
if(key==10)//設定密碼
begin
set<=1;
next_state<=s0;
end
else
begin
next_state<=idle;
end
end
s0://第一位密碼
begin
if(key==0||key==1||key==2||key==3||key==4||key==5||key==6||key==7||key==8||key==9)//鍵盤數字鍵輸入標志
begin
p0<=key;
next_state<=s1;
end
else
begin
next_state<=s0;
end
end
s1://第二位密碼
begin
if(key==0||key==1||key==2||key==3||key==4||key==5||key==6||key==7||key==8||key==9)
begin
p1<=key;
next_state<=s2;
end
else
begin
next_state<=s1;
end
if(key==11)//退格
begin
p0<=4'b0000;
next_state<=s0;
end
else
begin
next_state<=s1;
end
end
s2:
begin
if(key==0||key==1||key==2||key==3||key==4||key==5||key==6||key==7||key==8||key==9)
begin
p2<=key;
next_state<=s3;
end
else
begin
next_state<=s2;
end
if(key==11)
begin
p1<=4'b0000;
next_state<=s1;
end
else
begin
next_state<=s2;
end
end
s3:
begin
if(key==0||key==1||key==2||key==3||key==4||key==5||key==6||key==7||key==8||key==9)
begin
p3<=key;
next_state<=check;
end
else
begin
next_state<=s3;
end
if(key==11)
begin
p2<=4'b0000;
next_state<=s2;
end
else
begin
next_state<=s3;
end
end
check://密碼檢查
begin
if(key==11)
begin
p3<=4'b0000;
next_state<=s3;
end
else
begin
next_state<=check;
end
if(key==14)
begin
if(m3==p3&&m2==p2&&m1==p1&&m0==p0)
begin
if(set==1)//進入密碼設定
begin
next_state<=change0;
p0<=4'b0000;
p1<=4'b0000;
p2<=4'b0000;
p3<=4'b0000;
set<=0;
end
if(set==0)//不進入密碼設定
begin
next_state<=boom0;
p0<=4'b0000;
p1<=4'b0000;
p2<=4'b0000;
p3<=4'b0000;
end
end
else//密碼錯了
begin
next_state<=error0;
p0<=4'b0000;
p1<=4'b0000;
p2<=4'b0000;
p3<=4'b0000;
end
end
else
begin
next_state<=check;
end
end
change0://設定密碼第一位
begin
if(key==0||key==1||key==2||key==3||key==4||key==5||key==6||key==7||key==8||key==9)
begin
p0<=key;
next_state<=change1;
end
else
begin
next_state<=change0;
end
end
change1:
begin
if(key==0||key==1||key==2||key==3||key==4||key==5||key==6||key==7||key==8||key==9)
begin
p1<=key;
next_state<=change2;
end
else
begin
next_state<=change1;
end
if(key==11)
begin
p0<=4'b0000;
next_state<=change0;
end
else
begin
next_state<=change1;
end
end
change2:
begin
if(key==0||key==1||key==2||key==3||key==4||key==5||key==6||key==7||key==8||key==9)
begin
p2<=key;
next_state<=change3;
end
else
begin
next_state<=change2;
end
if(key==11)
begin
p1<=4'b0000;
next_state<=change1;
end
else
begin
next_state<=change2;
end
end
change3:
begin
if(key==0||key==1||key==2||key==3||key==4||key==5||key==6||key==7||key==8||key==9)
begin
p3<=key;
next_state<=check0;
end
else
begin
next_state<=change3;
end
if(key==11)
begin
p2<=4'b0000;
next_state<=change2;
end
else
begin
next_state<=change3;
end
end
check0:
begin
if(key==11)
begin
p3<=4'b0000;
next_state<=change3;
end
else
begin
next_state<=check0;
end
if(key==14)//確定,賦給原密碼
begin
m3<=p3;
m2<=p2;
m1<=p1;
m0<=p0;
p0<=4'b0000;
p1<=4'b0000;
p2<=4'b0000;
p3<=4'b0000;
next_state<=idle;
end
else
begin
next_state<=check0;
end
end
boom0://爆炸預警
begin
if(cnt<5000)
begin
boom<=1;
cnt<=cnt+1;
next_state<=boom0;
end
else
begin
boom<=0;
cnt<=0;
next_state<=idle;
end
end
error0://錯誤預警
begin
if(key==12)
begin
error<=0;
next_state<=idle;
end
else
begin
error<=1;
next_state<=error0;
end
end
endcase
end
endmodule
uj5u.com熱心網友回復:
這樣硬看,查不出問題還費時間,用modelsim仿真來查錯吧uj5u.com熱心網友回復:
always@(posedge clk)begin
case(current_state)
idle://等待
begin
改成
always@*
begin
case(current_state)
idle://等待
begin
uj5u.com熱心網友回復:
這是行家

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/33847.html
標籤:硬件使用
