名稱:DE1-SOC板電子密碼鎖4位數(shù)字密碼鎖數(shù)碼管顯示(代碼在文末下載)
軟件:Quartus II
語言:Verilog
代碼功能:
設(shè)計(jì)密碼鎖:
基礎(chǔ)要求:
1.輸入密碼:通過按鈕來輸入密碼[3:0],至少4位;
2.上鎖:解鎖后,用戶應(yīng)該能夠通過輸入相同的兩次按鍵序列來鎖定系統(tǒng)如果第二個(gè)按鈕順序與第一個(gè)按鈕序列不匹配,則系統(tǒng)應(yīng)保持解鎖狀態(tài);
3.鎖定后,用戶應(yīng)該能夠通過輸入鎖定設(shè)備的密碼來解鎖。如果嘗試使用不正確的按鍵順序來解鎖系統(tǒng),則系統(tǒng)應(yīng)保持鎖定狀態(tài)并顯示錯(cuò)誤消息 顯示:系統(tǒng)應(yīng)將7段LED數(shù)碼管用作顯示器。當(dāng)系統(tǒng)鎖定時(shí),數(shù)碼管上顯示“ LOCKED 或類似內(nèi)容。當(dāng)系統(tǒng)打開時(shí),應(yīng)該在數(shù)碼管上顯示“OPEN或類似的字樣。
硬件電路板: Altera DE1-SOC
編寫軟件: Quartus
編寫語言: Verilog
本代碼已在DE1-SOC開發(fā)板驗(yàn)證,其他開發(fā)板可以通過修改管腳適配,開發(fā)板如下:
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
部分代碼展示:
module?digital_lock( input?clk,//50MHz input?key_0,//按鍵0 input?key_1,//按鍵1 input?key_2,//按鍵2 input?key_3,//按鍵3 output?led_open,//開鎖指示燈 output?[6:0]HEX0,//數(shù)碼管 output?[6:0]HEX1,//數(shù)碼管 output?[6:0]HEX2,//數(shù)碼管 output?[6:0]HEX3//數(shù)碼管 ); wire?key0_neg; wire?key1_neg; wire?key2_neg; wire?key3_neg; wire?[2:0]?current_state;//當(dāng)前狀態(tài) negedge_check?i0_negedge_check( .?clk(clk), .?key(key_0),//輸入按鍵 .?key_neg(key0_neg)//輸出下降沿 ); negedge_check?i1_negedge_check( .?clk(clk), .?key(key_1),//輸入按鍵 .?key_neg(key1_neg)//輸出下降沿 ); negedge_check?i2_negedge_check( .?clk(clk), .?key(key_2),//輸入按鍵 .?key_neg(key2_neg)//輸出下降沿 ); negedge_check?i3_negedge_check( .?clk(clk), .?key(key_3),//輸入按鍵 .?key_neg(key3_neg)//輸出下降沿 ); //密碼鎖控制模塊 mimasuo_ctrl?i_mimasuo_ctrl( .?clk(clk), .?key0_neg(key0_neg), .?key1_neg(key1_neg), .?key2_neg(key2_neg), .?key3_neg(key3_neg), .?led_open(led_open), .?current_state(current_state)//當(dāng)前狀態(tài) ); //顯示模塊 display?i_display ( .?clk(clk), .?current_state(current_state),//當(dāng)前狀態(tài) .?key0_neg(key0_neg), .?key1_neg(key1_neg), .?key2_neg(key2_neg), .?key3_neg(key3_neg), .?HEX0(HEX0),//數(shù)碼管段選 .?HEX1(HEX1),//數(shù)碼管段選 .?HEX2(HEX2),//數(shù)碼管段選 .?HEX3(HEX3)?//數(shù)碼管段選 ); endmodule //密碼鎖控制模塊 module?mimasuo_ctrl( input?clk, input?key0_neg, input?key1_neg, input?key2_neg, input?key3_neg, output?led_open, output?[2:0]?current_state//當(dāng)前狀態(tài) ); //定義6個(gè)狀態(tài) parameter?s_lock=3'd0; parameter?s_compare=3'd1; parameter?s_pass=3'd2; parameter?s_error=3'd3; parameter?s_pass_error=3'd4; parameter?s_pass_right=3'd5; reg?[2:0]?state=3'd0; assign?current_state=state; reg?[3:0]?key_cnt=4'd0; always@(posedge?clk) if(state==s_compare?||?state==s_pass_right?||?state==s_pass_error)//密碼比對(duì) key_cnt<=4'd0; else if(key0_neg?|?key1_neg?|?key2_neg?|?key3_neg) key_cnt<=key_cnt+4'd1; reg?[31:0]?password_buf=32'd0;// always@(posedge?clk) if(state==s_compare)//密碼比對(duì) password_buf<=32'd0; else if(key0_neg==1) password_buf<={password_buf[27:0],4'd0};//數(shù)字按鍵0輸入 else?if(key1_neg==1) password_buf<={password_buf[27:0],4'd1};//數(shù)字按鍵1輸入 else?if(key2_neg==1) password_buf<={password_buf[27:0],4'd2};//數(shù)字按鍵2輸入 else?if(key3_neg==1) password_buf<={password_buf[27:0],4'd3};//數(shù)字按鍵3輸入 else password_buf<=password_buf; reg?[15:0]?right_password=16'h0123;//right_password //狀態(tài)機(jī)控制 always@(posedge?clk) case(state) s_lock://鎖定狀態(tài) if(key_cnt>=3'd4)//輸入4個(gè)密碼 state<=s_compare; else state<=s_lock; s_compare://比對(duì)密碼狀態(tài) if(password_buf[15:0]==right_password) state<=s_pass; else state<=s_error; s_pass://密碼正確
點(diǎn)擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=232