【正文】
2 = CNT_R2 + 139。b1。 if(CNT_R2 4000000) begin clk1 = 1。 end else begin clk1 = 0。 end end always@(main_state or correct or error) //3位主狀態(tài)寄存器,1位輸入狀態(tài)寄存器correct,errorbegin case(main_state) //判斷主狀態(tài)寄存器 waits: //3b39。001 if(correct==1) begin//由waits轉(zhuǎn)換到pass的條件 next_state=pass。 end//3位next_state寄存器寫入等待狀態(tài) else if(error==1amp。amp。try_count==1) begin next_state=alarm。 end//由waits轉(zhuǎn)換到alarm的條件 else begin next_state=waits。 end pass: if(pass_count[7]==1) begin//由pass轉(zhuǎn)換到waits的條件 計時器時間到,由通過狀態(tài)變成等待狀態(tài) next_state=waits。 end else begin next_state=pass。 end alarm: if(alarm_count[10]==1) begin// 由alarm轉(zhuǎn)換到waits的條件 警告時間到達時變成等待狀態(tài) next_state=waits。 end else begin next_state=alarm。end//否則繼續(xù)警告 default://默認狀態(tài):waits next_state=waits。 endcase end //狀態(tài)轉(zhuǎn)換 always@(posedge clk1 or negedge resetb) begin if(!resetb) main_state=waits。 else main_state=next_state。 end //輸出控制部分 always@(posedge clk1 or negedge resetb) begin if(!resetb)//復位時,開鎖輸出與警報輸出都為零 begin passed=839。b10000001。 //passed=2b39。11。 end else if(main_state==pass)//當主機狀態(tài)為pass時,開鎖 begin passed=839。b00000001。 //passed=239。b01。 end else if(main_state==alarm)//當主機狀態(tài)為alarm時,警報 begin passed=839。b10000000。 //passed=239。b10。 end else//其它狀態(tài)復位 begin passed=839。b10000001。 //passed=2b39。11。 end end //alarm一段時間后,自動進入waits狀態(tài) //alarm定時器 always@(posedge clk1 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 clk1 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 clk1 or negedge resetb) begin if(!resetb) sub_state=first。 else sub_state=next_sub_state。 end always@(!zero||!one||!two||!three||!four||!yes or sub_state) //always@(key or sub_state) begin if(key_pressed_flag||!yes) if(!yes)//4個密碼輸完時,進行確認 next_sub_state=first。 //default為輸入了某位密碼,輸入完自動將狀態(tài)轉(zhuǎn)入下一位 else if (!zero||!one||!two||!three||!four) //zero1,one1,two1,three1,four1 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。 default: next_sub_state=sub_state。 endcase else next_sub_state=sub_state。 end //比較密碼,產(chǎn)生正確或者錯誤信息 always@(posedge clk1 or negedge resetb) begin if(!resetb) begin correct=0。 error=0。 end else if(!key_pressed_flagamp。amp。!yes) if(password==PASSWORD)//密碼正確時 begin correct=1。 error=0。 end else//密碼錯誤時 begin error=1。 correct=0。 end else begin correct=0。 error=0。 end end