【正文】
h8e。 //顯示e439。he : seg = 839。ha1。 //顯示c439。hc : seg = 839。h83。 //顯示a439。ha : seg = 839。h90。 //顯示8439。h8 : seg = 839。hf8。 //顯示6439。h6 : seg = 839。h92。 //顯示4439。h4 : seg = 839。hb0。 //顯示2439。h2 : seg = 839。hf9。 //顯示0439。h0 : seg = 839。b011: seg0=password[3:0]。b010: seg0=password[7:4]。b001: seg0=password[11:8]。b000: seg0=password[15:12]。b1000。 339。b010: dig=439。b0010。 339。b000: dig=439。 end else begin digyi=digyi+1。 end end always (posedge clk0_div) begin if(digyi==339。 if(CNT_R0 4096) begin clk0_div = 1。 end end //diaplay always (posedge clk0) begin CNT_R0 = CNT_R0 + 139。key=439。b1001。!change) begin key_pressed_flag=1。 end else if(!fouramp。key=439。amp。b0111。!change) begin key_pressed_flag=1。 end else if(!twoamp。key=439。amp。b0101。!change) begin key_pressed_flag=1。 end else if(!zeroamp。key=439。amp。b0011。change) begin key_pressed_flag=1。 end else if(!threeamp。key=439。amp。b0001。change) begin key_pressed_flag=1。 end else if(!oneamp。key=439。amp。b0000。 // 鍵盤按下標志 always(posedge clk1 or negedge resetb) begin if(!resetb) begin key_pressed_flag=0。 end else if(main_state==pass||main_state==alarm) begin try_count=0。 endend //記錄錯誤次數(shù) always(posedge clk1 or negedge resetb) begin if(!resetb) begin try_count=0。 default: password=password。 third: password[7:4]=key。 end else if(!zero||!one||!two||!three||!four) begin case(sub_state) first: password[15:12]=key。 error=0。 correct=0。 error=0。amp。 error=0。 endcase else next_sub_state=sub_state。 //當輸入完4位密碼以后狀態(tài)保持不變,等待輸入enter命令 finish: next_sub_state=finish。 third: next_sub_state=fourth。 //default為輸入了某位密碼,輸入完自動將狀態(tài)轉入下一位 else if (!zero||!one||!two||!three||!four) //zero1,one1,two1,three1,four1 case(sub_state) first: next_sub_state=second。 else sub_state=next_sub_state。 else pass_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==alarm)//alarm狀態(tài)計時器alarm定時器加1 alarm_count=alarm_count+1。11。b10000001。b10。b10000000。b01。b00000001。11。b10000001。 else main_state=next_state。end//否則繼續(xù)警告 default://默認狀態(tài):waits next_state=waits。 end alarm: if(alarm_count[10]==1) begin// 由alarm轉換到waits的條件 警告時間到達時變成等待狀態(tài) next_state=waits。 end pass: if(pass_count[7]==1) begin//由pass轉換到waits的條件 計時器時間到,由通過狀態(tài)變成等待狀態(tài) next_state=waits。try_count==1) begin next_state=alarm。 end//3位next_state寄存器寫入等待狀態(tài) else if(error==1amp。 end end always(main_state or correct or error) //3位主狀態(tài)寄存器,1位輸入狀態(tài)寄存器correct,errorbegin case(main_state) //判斷主狀態(tài)寄存器 waits: //3b39。 if(CNT_R2 4000000) begin clk1 = 1。 // 鍵盤按下標志 //以上為中間狀態(tài)的一些寄存器和一些所用到的參數(shù) //主機狀態(tài)機部分 always (posedge clk0) begin CNT_R2 = CNT_R2 + 139。 reg correct。 //alarm計時完后回到wait狀態(tài)//嘗試次數(shù)寄存器 reg [1:0] try_count。 //通過計時寄存器 reg [7: