?? passed_lock.v
字號:
module passed_lock(
clk,
resetb,
cmd,
alarmed,
passed,
password,
main_state,
try_count
);
input clk; //輸入時鐘信號
input resetb; //輸入復位信號
input [4:0] cmd; //輸入命令信號0
output alarmed; //輸出警報信號led
output passed; //輸出通過信號led
output [2:0] main_state;//lcd
output [1:0] try_count;
output [15:0] password;
wire clk;
wire resetb;
wire [4:0] cmd;
reg alarmed;
reg passed;
//輸入與輸出的聲明部分,其中,clk為輸入的時鐘信號,resetb為密碼舒服的輸入信號,cmd為輸入命令,需注意的時,cmd并不是總在表示密碼,也表示密碼的間隔,如當輸入4位密碼后需要一個確認“enter”信號,當密碼輸入錯誤時,需要取消“cancel”信號,這些信號之間在設計中通過有限狀態(tài)轉(zhuǎn)換機實現(xiàn)。
parameter PASSWORD=16'd1234;//盛放密碼的參數(shù)
reg [15:0] password;//輸入數(shù)值盛放寄存器
//輸入的數(shù)字編碼 0~9,enter,cancel
reg one=5'b10001,
two=5'b10010,
three=5'b10011,
four=5'b10100,
five=5'b10101,
six=5'b10110,
seven=5'b10111,
eight=5'b11000,
nine=5'b11001,
zero=5'b10000,
enter=5'b11010,
cancel=5'b11011;
reg cmd_t;//檢驗是否有按鍵按下
reg [2:0] main_state;//主狀態(tài)
reg [2:0] next_state;//下一個狀態(tài)
//主有限狀態(tài)轉(zhuǎn)換機的三個狀態(tài):waits、pass、alarm
parameter waits=3'b001,
pass=3'b010,
alarm=3'b100;
reg [2:0] sub_state;
reg [2:0] next_sub_state;
//主有限狀態(tài)轉(zhuǎn)換機的三個狀態(tài):first、second、third、fourth、finish。
parameter first=3'b000,
second=3'b001,
third=3'b010,
fourth=3'b011,
finish=3'b100;
//通過計時寄存器
reg [7:0] pass_count;
//警報計時寄存器
reg [10:0] alarm_count;
//嘗試次數(shù)寄存器
reg [1:0] try_count;
//輸入狀態(tài)寄存器:error和correct
reg error;
reg correct;
//以上為中間狀態(tài)的一些寄存器和一些所用到的參數(shù)
//主機狀態(tài)機部分
always@(main_state or correct or error)
begin
case(main_state)
waits:
if(correct==1) //由waits轉(zhuǎn)換到pass的條件
next_state=pass;
else if(error==1&&try_count==2)
next_state=alarm; //由waits轉(zhuǎn)換到alarm的條件
else
next_state=waits;
pass:
if(pass_count[7]==1)//由pass轉(zhuǎn)換到waits的條件
next_state=waits;
else
next_state=pass;
alarm:
if(alarm_count[10]==1)// 由alarm轉(zhuǎn)換到waits的條件
next_state=waits;
else
next_state=alarm;
default://默認狀態(tài):waits
next_state=waits;
endcase
end
//狀態(tài)轉(zhuǎn)換
always@(posedge clk or negedge resetb)
begin
if(!resetb)
main_state<=waits;
else
main_state<=next_state;
end
//輸出控制部分
always@(posedge clk or negedge resetb)
begin
if(!resetb)//復位時,開鎖輸出與警報輸出都為零
begin
passed<=0;
alarmed<=0;
end
else if(main_state==pass)//當主機狀態(tài)為pass時,開鎖
begin
passed<=1;
alarmed<=0;
end
else if(main_state==alarm)//當主機狀態(tài)為alarm時,警報
begin
passed<=0;
alarmed<=1;
end
else//其它狀態(tài)復位
begin
passed<=0;
alarmed<=0;
end
end
//alarm一段時間后,自動進入waits狀態(tài)
//alarm定時器
always@(posedge clk or negedge resetb)
begin
if(!resetb)
alarm_count<=0;
else if(main_state==alarm)//alarm狀態(tài)計時器alarm定時器加1
alarm_count<=alarm_count+1;
else
alarm_count<=0;
end
//鎖pass以后計數(shù)開始,當規(guī)定的時間到達后自動上鎖,并進入waits狀態(tài)
//pass定時器
always@(posedge clk or negedge resetb)
begin
if(!resetb)
pass_count<=0;
else if(main_state==pass) //pass狀態(tài)計時器pass定時器加1
pass_count<=pass_count+1;
else
pass_count<=0;
end
//從狀態(tài)機,用于輸入4位密碼
always@(posedge clk or negedge resetb)
begin
if(!resetb)
cmd_t<=0;
else
cmd_t<=-cmd[4];
end
always@(posedge clk or negedge resetb)
begin
if(!resetb)
sub_state<=first;
else
sub_state<=next_sub_state;
end
always@(cmd or cmd_t or sub_state)
//always@(cmd or sub_state)
begin
if(cmd_t==0&&cmd[4]==1)
case(cmd)
cancel://密碼輸入錯誤時,重復上一個狀態(tài)
begin
if(sub_state==first)// 第1個密碼輸入錯誤
next_sub_state=first;
else
case(sub_state)
second: // 第2個密碼輸入錯誤
next_sub_state=first;
third: // 第3個密碼輸入錯誤
next_sub_state=second;
fourth: // 第4個密碼輸入錯誤
next_sub_state=third;
finish:
next_sub_state=fourth;
endcase
end
enter://4個密碼輸完時,進行確認
next_sub_state=first;
//以下4個命令位無效的命令,狀態(tài)保持不變
5'b11100:
next_sub_state=next_sub_state;
5'b11101:
next_sub_state=next_sub_state;
5'b11110:
next_sub_state=next_sub_state;
5'b11111:
next_sub_state=next_sub_state;
//default為輸入了某位密碼,輸入完自動將狀態(tài)轉(zhuǎn)入下一位
default:
case(sub_state)
first:
next_sub_state=second;
second:
next_sub_state=third;
third:
next_sub_state=fourth;
fourth:
next_sub_state=finish;
//當輸入完4位密碼以后狀態(tài)保持不變,等待輸入enter命
//令
finish:
next_sub_state=finish;
endcase
endcase
else
next_sub_state=sub_state;
end
//比較密碼,產(chǎn)生正確或者錯誤信息
always@(posedge clk or negedge resetb)
begin
if(!resetb)
begin
correct<=0;
error<=0;
end
else if(cmd_t ==0&&cmd==enter)
if(password==PASSWORD)//密碼正確時
begin
correct<=1;
error<=0;
end
else//密碼錯誤時
begin
error<=1;
correct<=0;
end
else
begin
correct<=0;
error<=0;
end
end
//記錄密碼
always@(posedge clk or negedge resetb)
begin
if(!resetb)
password<=0;
else if(cmd_t==0&&cmd[4]==1)
case(sub_state)
first:
password[15:12]<=cmd[3:0];
second:
password[11:8]<=cmd[3:0];
third:
password[7:4]<=cmd[3:0];
fourth:
password[3:0]<=cmd[3:0];
default:
password<=password;
endcase
else
password<=password;
end
//記錄錯誤次數(shù)
always@(posedge clk or negedge resetb)
begin
if(!resetb)
try_count<=0;
else if(error==1)
try_count<=try_count+1;
else if(main_state==pass||main_state==alarm)
try_count<=0;
end
endmodule
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -