名稱:簡單洗衣機(jī)控制器設(shè)計(jì)VHDL代碼Quartus仿真
軟件:Quartus
語言:VHDL
代碼功能:
洗衣機(jī)控制器設(shè)計(jì)
要求:
(1)設(shè)計(jì)一個(gè)電子定時(shí)器,控制洗衣機(jī)作如下運(yùn)轉(zhuǎn);定時(shí)啟動(dòng)→正轉(zhuǎn)20秒→暫停10秒→反轉(zhuǎn)20秒→暫停10秒→定時(shí)未到回到“正轉(zhuǎn)20秒→暫停10秒→.....定時(shí)到則停止。
(2)洗滌過程由“啟動(dòng)”信號(hào)開始,若定時(shí)到,需發(fā)出提示音響;
(3)用兩個(gè)數(shù)碼管顯示洗滌的預(yù)置時(shí)間(分鐘數(shù)),按倒計(jì)時(shí)方式對洗滌過程作計(jì)時(shí)顯示,直到時(shí)間到停機(jī),用三只LED燈表示“正轉(zhuǎn)”,“反轉(zhuǎn)”?“暫?!比齻€(gè)狀態(tài)。
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
演示視頻:
設(shè)計(jì)文檔:
洗衣機(jī)仿真
1.要求
2.程序文件
3.程序運(yùn)行
4.管腳設(shè)置
5.仿真
部分代碼展示:
LIBRARY?ieee; ???USE?ieee.std_logic_1164.all; ???USE?ieee.std_logic_unsigned.all; ENTITY?washing_machine?IS ???PORT?( ??????clk_in?????:?IN?STD_LOGIC;--50Hz ??????start_key??:?IN?STD_LOGIC;--啟動(dòng)按鍵 ?????? ??????led????????:?OUT?STD_LOGIC_VECTOR(2?DOWNTO?0);--正轉(zhuǎn),反轉(zhuǎn),暫停 ??????end_led????:?OUT?STD_LOGIC;--洗衣結(jié)束信號(hào) ?????? ??????dig_led1????:?OUT?STD_LOGIC_VECTOR(7?DOWNTO?0);--數(shù)碼管1 ??????dig_led2???:?OUT?STD_LOGIC_VECTOR(7?DOWNTO?0)--數(shù)碼管2 ???); END?washing_machine; ARCHITECTURE?trans?OF?washing_machine?IS ??? ???SIGNAL?state???????????????:?STD_LOGIC_VECTOR(1?DOWNTO?0)?:=?"01"; ??? ???SIGNAL?start_key_rise??????:?STD_LOGIC; ???SIGNAL?start_key_1?????????:?STD_LOGIC?:=?'0'; ???SIGNAL?start_key_2?????????:?STD_LOGIC?:=?'0'; ??? ???SIGNAL?washing_time????????:?STD_LOGIC_VECTOR(7?DOWNTO?0)?:=?"00001111";--預(yù)置洗衣時(shí)間15分鐘 ??? ???SIGNAL?end_led_buf?????????:?STD_LOGIC?:=?'1'; ??? ???SIGNAL?end_led_buf2????????:?STD_LOGIC?:=?'1'; ??? ???SIGNAL?end_led_rise????????:?STD_LOGIC; ??? ???SIGNAL?bell_cnt????????????:?STD_LOGIC_VECTOR(27?DOWNTO?0)?:=?"0101111101011110000100000000"; ??? ???SIGNAL?bell_flag???????????:?STD_LOGIC; ??? ???SIGNAL?bell_clk????????????:?STD_LOGIC?:=?'0'; ???SIGNAL?bell_clk_cnt????????:?STD_LOGIC_VECTOR(16?DOWNTO?0)?:=?"00000000000000000"; ??? ???SIGNAL?second_cnt??????????:?STD_LOGIC_VECTOR(7?DOWNTO?0)?:=?"00000000"; ???SIGNAL?min_en??????????????:?STD_LOGIC?:=?'0'; ??? ???SIGNAL?min_en_buf??????????:?STD_LOGIC?:=?'0'; ??? ???SIGNAL?min_en_rise?????????:?STD_LOGIC; ??? ???SIGNAL?second_en_fast??????:?STD_LOGIC?:=?'0'; ???SIGNAL?second_en_1s????????:?STD_LOGIC?:=?'0'; ???SIGNAL?second_en???????????:?STD_LOGIC; ??? ???SIGNAL?second_div_cnt_fast?:?STD_LOGIC_VECTOR(7?DOWNTO?0)?:=?"00000000"; ??? ???SIGNAL?second_div_cnt??????:?STD_LOGIC_VECTOR(9?DOWNTO?0)?:=?"0000000000"; ??? ???SIGNAL?jishu???????????????:?STD_LOGIC_VECTOR(15?DOWNTO?0)?:=?"0000000000000000"; ??? ???SIGNAL?shang???????????????:?STD_LOGIC_VECTOR(7?DOWNTO?0); ???SIGNAL?yushu???????????????:?STD_LOGIC_VECTOR(3?DOWNTO?0); ??? ???SIGNAL?state_div???????????:?STD_LOGIC_VECTOR(1?DOWNTO?0)?:=?"00"; ???SIGNAL?data_buf????????????:?STD_LOGIC_VECTOR(7?DOWNTO?0)?:=?"00000000"; ???SIGNAL?shang_buf???????????:?STD_LOGIC_VECTOR(7?DOWNTO?0)?:=?"00000000"; ???SIGNAL?yushu_buf???????????:?STD_LOGIC_VECTOR(3?DOWNTO?0)?:=?"0000"; ??? ???SIGNAL?display_data????????:?STD_LOGIC_VECTOR(3?DOWNTO?0)?:=?"0000"; ??? ???SIGNAL?duanxuan2?????????????:?STD_LOGIC_VECTOR(7?DOWNTO?0)?:=?"00000000"; ???SIGNAL?duanxuan1????????????:?STD_LOGIC_VECTOR(7?DOWNTO?0)?:=?"00000000"; BEGIN ???PROCESS?(clk_in) ???BEGIN ??????IF?(clk_in'EVENT?AND?clk_in?=?'1')?THEN ?????????start_key_1?<=?start_key; ?????????start_key_2?<=?start_key_1;--?啟動(dòng)按鈕寄存器緩存 ??????END?IF; ???END?PROCESS; ??? ???start_key_rise?<=?start_key_1?AND?(NOT(start_key_2));--chenck?the?rise?EVENT?of?start_key--start_key上升沿 ??? ???PROCESS?(clk_in)--狀態(tài)機(jī) ???BEGIN ??????IF?(clk_in'EVENT?AND?clk_in?=?'1')?THEN ?????????CASE?state?IS ????????????WHEN?"00"?=>--狀態(tài)00,等待狀態(tài),若有啟動(dòng)信號(hào)則到狀態(tài)01 ???????????????IF?(start_key_rise?=?'1')?THEN ??????????????????state?<=?"01"; ???????????????ELSE ??????????????????state?<=?"00"; ???????????????END?IF; ????????????WHEN?"01"?=>--狀態(tài)01,倒計(jì)時(shí)狀態(tài),直到計(jì)時(shí)到0,到狀態(tài)01 ???????????????IF?(washing_time?>?"00000000")?THEN ??????????????????state?<=?"01"; ???????????????ELSE ??????????????????state?<=?"10"; ???????????????END?IF; ????????????WHEN?"10"?=>--結(jié)束狀態(tài),返回00 ???????????????state?<=?"00"; ????????????WHEN?OTHERS?=> ???????????????state?<=?"00"; ?????????END?CASE; ??????END?IF; ???END?PROCESS; ??? ???PROCESS?(clk_in) ???BEGIN ??????IF?(clk_in'EVENT?AND?clk_in?=?'1')?THEN ?????????IF?(state?=?"00")?THEN ????????????end_led_buf?<=?'1';--狀態(tài)00,提示洗衣結(jié)束 ?????????ELSE ????????????end_led_buf?<=?'0'; ?????????END?IF; ??????END?IF; ???END?PROCESS; ??? ???end_led?<=?end_led_buf; ??? ???PROCESS?(clk_in)--設(shè)輸入clk為50Hz,分頻到1Hz ???BEGIN ??????IF?(clk_in'EVENT?AND?clk_in?=?'1')?THEN ?????????IF?(second_div_cnt?>=?"0000110010")?THEN--50 ????????????second_div_cnt?<=?"0000000000"; ????????????second_en_1s?<=?'1';--1S脈沖信號(hào) ?????????ELSE ????????????second_div_cnt?<=?second_div_cnt?+?"0000000001"; ????????????second_en_1s?<=?'0'; ?????????END?IF; ??????END?IF; ???END?PROCESS; ??? ???PROCESS?(clk_in) ???BEGIN ??????IF?(clk_in'EVENT?AND?clk_in?=?'1')?THEN ?????????IF?(second_cnt?=?"00111011")?THEN--秒計(jì)時(shí)到59,生產(chǎn)分計(jì)時(shí)脈沖 ????????????min_en?<=?'1'; ?????????ELSE ????????????min_en?<=?'0'; ?????????END?IF; ??????END?IF; ???END?PROCESS; ??? ???PROCESS?(clk_in) ???BEGIN ??????IF?(clk_in'EVENT?AND?clk_in?=?'1')?THEN ?????????min_en_buf?<=?min_en; ??????END?IF; ???END?PROCESS; ??? ???min_en_rise?<=?min_en?AND?(NOT(min_en_buf)); ???PROCESS?(clk_in) ???BEGIN ??????IF?(clk_in'EVENT?AND?clk_in?=?'1')?THEN ?????????IF?(start_key_rise?=?'1')?THEN ????????????washing_time?<=?"00001111";--?預(yù)置計(jì)時(shí)時(shí)間15分鐘 ?????????ELSIF?(min_en_rise?=?'1')?THEN--分鐘脈沖到了,分鐘時(shí)間減1 ????????????IF?(washing_time?>?"00000000")?THEN ???????????????washing_time?<=?washing_time?-?"00000001"; ????????????ELSE ???????????????washing_time?<=?"00000000"; ????????????END?IF; ?????????ELSE ????????????washing_time?<=?washing_time; ?????????END?IF; ??????END?IF; ???END?PROCESS; ??? ???second_en?<=?second_en_1s; --???second_en?<=?second_en_1s; PROCESS?(clk_in) ???BEGIN ??????IF?(clk_in'EVENT?AND?clk_in?=?'1')?THEN ?????????IF?(start_key_rise?=?'1')?THEN ????????????second_cnt?<=?"00000000"; ?????????ELSIF?(second_en?=?'1')?THEN ????????????IF?(second_cnt?>=?"00111011")?THEN--秒計(jì)時(shí)到59返回0 ???????????????second_cnt?<=?"00000000"; ????????????ELSE ???????????????second_cnt?<=?second_cnt?+?"00000001"; ????????????END?IF; ?????????ELSE ????????????second_cnt?<=?second_cnt; ?????????END?IF; ??????END?IF; ???END?PROCESS;
點(diǎn)擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=572