名稱:Quartus洗衣機(jī)控制器Verilog代碼遠(yuǎn)程云端平臺
軟件:Quartus
語言:Verilog
代碼功能:
洗衣機(jī)控制器設(shè)計(jì)要求
設(shè)計(jì)一個電子定時器,控制洗衣機(jī)作如下運(yùn)轉(zhuǎn)定時啟動→正轉(zhuǎn)20秒→暫停10秒→反轉(zhuǎn)20秒→暫停10秒,每個循環(huán)1分鐘;
按正計(jì)時方式用兩個數(shù)碼管顯示正轉(zhuǎn)、暫停、反轉(zhuǎn)時間,同時用三只LED燈表示“正轉(zhuǎn)”“反轉(zhuǎn)”、“暫?!比齻€狀態(tài);
用兩個數(shù)碼管顯示洗滌的預(yù)置時間(分鐘數(shù)),按倒計(jì)時方式對洗滌過程作計(jì)時顯示,時間到停機(jī),停機(jī)指示燈亮;
洗滌過程由“開始”開關(guān)開始,設(shè)置“暫停”開關(guān)。
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
本代碼已在遠(yuǎn)程云端平臺驗(yàn)證,遠(yuǎn)程云端平臺如下,其他遠(yuǎn)程云端平臺可以修改管腳適配:
演示視頻:
部分代碼展示:
module?washing_machine(clk_in,?dataout,en,reset_n,?start_key,?stop_key,led,?end_beep); ???input????????clk_in;//1000Hz ???input????????reset_n;//復(fù)位按下低電平 ???input????????start_key;//啟動按下低電平 input????????stop_key;//暫停按下低電平 ??? ???output?[2:0]?led;//正反轉(zhuǎn)燈??? ???output???????end_beep;//結(jié)束報(bào)警 ??? output[7:0]?dataout;//數(shù)碼管段選 output[3:0]?en;//COM使能輸出 ??? ??? ???reg?[1:0]????state; ???reg?[2:0]????led;??? ???reg?[7:0]????washing_time;??? ???reg??????????end_beep_buf; ???reg?[7:0]????second_cnt; ???reg??????????min_en;??? ???reg??????????second_en_1s; ???reg?[31:0]????second_div_cnt; ??? reg?[31:0]?beep_cnt=32'd0;??? ???always?@(posedge?clk_in?or?negedge?reset_n) if(!reset_n) state<=2'b00;//空閑狀態(tài) else ?????????case?(state) ????????????2'b00?://空閑狀態(tài) ???????????????if?(start_key?==?1'b0) ??????????????????state?<=?2'b01; ???????????????else ??????????????????state?<=?2'b00; ????????????2'b01?://倒計(jì)時狀態(tài) ???????????????if(stop_key==0) ??????????????????state?<=?2'b11; ???????????????else?if?(washing_time?>?8'b00000000) ??????????????????state?<=?2'b01; else? state?<=?2'b10; ????????????2'b10?://結(jié)束 state?<=?2'b10; ????????????2'b11?://暫停 ???????????????if?(start_key?==?1'b0) ??????????????????state?<=?2'b01; ???????????????else ??????????????????state?<=?2'b11; ????????????default?: ???????????????state?<=?2'b00; ?????????endcase ? ???always?@(posedge?clk_in)?????? ??????begin ?????????if?(state?==?2'b10)//結(jié)束計(jì)數(shù) ????????????beep_cnt?<=beep_cnt+?1'b1; ??????end??? ??? ???always?@(posedge?clk_in)?????? ??????begin ?????????if?(state?==?2'b10)//結(jié)束 ????????????end_beep_buf?<=?1'b1; ?????????else ????????????end_beep_buf?<=?1'b0; ??????end ?? ???assign?end_beep?=?end_beep_buf; ??? ??? ???always?@(posedge?clk_in) if(state!=2'b01)//非倒計(jì)時狀態(tài)清零 begin ????????????second_div_cnt?<=?32'd0; ????????????second_en_1s?<=?1'b0; end else//倒計(jì)時狀態(tài)計(jì)時 ??????begin ?????????if?(second_div_cnt?>=?32'd1000)//計(jì)數(shù)1000為1s,仿真將計(jì)數(shù)器改小為50 ?????????begin ????????????second_div_cnt?<=?32'd0; ????????????second_en_1s?<=?1'b1;//50MHz分頻為1Hz ?????????end ?????????else ?????????begin ????????????second_div_cnt?<=?second_div_cnt?+?32'd1; ????????????second_en_1s?<=?1'b0; ?????????end ??????end ??? ???always?@(posedge?clk_in)????? ??????begin ?????????if?(state!=2'b01)//非倒計(jì)時狀態(tài)清零 ????????????second_cnt?<=?8'b00000000; ?????????else?if?(second_en_1s?==?1'b1)//倒計(jì)時狀態(tài)計(jì)時 ?????????begin ????????????if?(second_cnt?>=?8'd59)//59s ???????????????second_cnt?<=?8'd0; ????????????else ???????????????second_cnt?<=?second_cnt?+?8'd1; ?????????end ?????????else ????????????second_cnt?<=?second_cnt; ??????end ?? ???always?@(posedge?clk_in) ?????? ??????begin ?????????if?(second_en_1s?==?1'b1?&&?second_cnt?==?8'd59) ????????????min_en?<=?1'b1;//分鐘信號 ?????????else ????????????min_en?<=?1'b0; ??????end ??? ??? ???always?@(posedge?clk_in)????? ??????begin ?????????if?(state?==?2'b00) ????????????washing_time?<=?8'd5;//默認(rèn)5分鐘 ?????????else?if?(min_en?==?1'b1)//分鐘信號 ?????????begin ????????????if?(washing_time?>?8'd0) ???????????????washing_time?<=?washing_time?-?8'd1;//倒計(jì)時 ????????????else ???????????????washing_time?<=?8'd0; ?????????end ?????????else ????????????washing_time?<=?washing_time; ??????end reg?[7:0]?second_time; ???always?@(posedge?clk_in) ???if(state==2'b01)?? ??????begin ?????????if?(washing_time?>?8'b00000000) ?????????begin ????????????if?(second_cnt?<?8'd20)//秒計(jì)時小于20,正轉(zhuǎn)燈亮 ???????????????led?<=?3'b100; ????????????else?if?(second_cnt?>=?8'd20?&?second_cnt?<?8'd30)//秒計(jì)時20~30,暫停燈亮 ???????????????led?<=?3'b010; ????????????else?if?(second_cnt?>=?8'd30?&?second_cnt?<?8'd50)//秒計(jì)時30~50,反轉(zhuǎn)燈亮 ???????????????led?<=?3'b001; ????????????else ???????????????led?<=?3'b010;//秒計(jì)時50~59,暫停燈亮 ?????????end ?????????else ????????????led?<=?3'b000; ??????end else led?<=?3'b000; ???always?@(posedge?clk_in) ???if(state==2'b01)?? ??????begin ?????????if?(washing_time?>?8'b00000000) ?????????begin ????????????if?(second_cnt?<?8'd20)//秒計(jì)時小于20,正轉(zhuǎn)燈亮 ???????????????second_time?<=?second_cnt; ????????????else?if?(second_cnt?>=?8'd20?&?second_cnt?<?8'd30)//秒計(jì)時20~30,暫停燈亮 ???????????????second_time?<=?second_cnt-20; ????????????else?if?(second_cnt?>=?8'd30?&?second_cnt?<?8'd50)//秒計(jì)時30~50,反轉(zhuǎn)燈亮 ???????????????second_time?<=?second_cnt-30; ????????????else ???????????????second_time?<=?second_cnt-50;//秒計(jì)時50~59,暫停燈亮 ?????????end ?????????else ????????????second_time?<=?8'b0; ??????end else second_time?<=?8'b0; ??? ??? //實(shí)現(xiàn)的動態(tài)數(shù)碼管顯示 reg[7:0]?dataout;//各段數(shù)據(jù)輸出 reg[3:0]?en; reg?[7:0]?data_num; //數(shù)碼管位選 reg?[1:0]sel_cnt?=2'd0; always?@(posedge?clk_in?)??//4個數(shù)碼管 begin sel_cnt<=sel_cnt+2'd1; end always?@(*)??//位選切換 begin case?(sel_cnt) 2'd0: begin en<=~4'b0111; data_num<=?second_time%10; end 2'd1: begin? en<=~4'b1011; data_num?<=?second_time/10;??? end 2'd2: begin? en<=~4'b1101; data_num?<=?washing_time%10; end???? 2'd3: begin en<=~4'b1110; data_num?<=?washing_time/10;? end default:; endcase end always?@(*) begin case?(data_num)??//數(shù)字顯示碼 8'd0:?dataout<=?8'b1100_0000; 8'd1:?dataout<=?8'b1111_1001; 8'd2:?dataout<=?8'b1010_0100; 8'd3:?dataout<=?8'b1011_0000; 8'd4:?dataout<=?8'b1001_1001; 8'd5:?dataout<=?8'b1001_0010; 8'd6:?dataout<=?8'b1000_0010; 8'd7:?dataout<=?8'b1111_1000; 8'd8:?dataout<=?8'b1000_0000; 8'd9:?dataout<=?8'b1001_0000; default:; endcase end ??? endmodule
點(diǎn)擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=367