名稱:基于VHDL語言的洗衣機控制器設(shè)計VHDL代碼Quartus仿真
軟件:Quartus
語言:VHDL
代碼功能:
基于VHDL語言的洗衣機控制器設(shè)計
設(shè)計要求:
設(shè)計一個洗衣機洗滌程序控制器,控制洗衣機的電動機按下圖所示的規(guī)律運轉(zhuǎn)。
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
演示視頻:
設(shè)計文檔:
洗衣機仿真
1.要求
2.工程文件
3.程序文件
4.程序編譯
5.VWF文件
6.仿真圖
部分代碼展示:
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;--啟動按鍵 ??????led????????:?OUT?STD_LOGIC_VECTOR(2?DOWNTO?0);--正轉(zhuǎn),反轉(zhuǎn),暫停 ??????end_led????:?OUT?STD_LOGIC;--洗衣結(jié)束信號 ??????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?RTL?OF?washing_machine?IS ???--定義中間信號 ???SIGNAL?state???????????????:?STD_LOGIC_VECTOR(1?DOWNTO?0)?:=?"01"; ???SIGNAL?washing_time????????:?STD_LOGIC_VECTOR(7?DOWNTO?0)?:=?"00000000";--預(yù)置洗衣時間12分鐘 ???SIGNAL?end_led_buf?????????:?STD_LOGIC?:=?'1'; ???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_1s????????:?STD_LOGIC?:=?'0'; ???SIGNAL?second_en???????????:?STD_LOGIC; ???SIGNAL?second_div_cnt??????:?STD_LOGIC_VECTOR(9?DOWNTO?0)?:=?"0000000000"; ???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?duanxuan2???????????:?STD_LOGIC_VECTOR(7?DOWNTO?0)?:=?"00000000"; ???SIGNAL?duanxuan1???????????:?STD_LOGIC_VECTOR(7?DOWNTO?0)?:=?"00000000"; BEGIN ???PROCESS?(clk_in)--狀態(tài)機 ???BEGIN ??????IF?(clk_in'EVENT?AND?clk_in?=?'1')?THEN ?????????CASE?state?IS ????????????WHEN?"00"?=>--狀態(tài)00,等待狀態(tài),若有啟動信號則到狀態(tài)01 ???????????????IF?(start_key?=?'1')?THEN ??????????????????state?<=?"01"; ???????????????ELSE ??????????????????state?<=?"00"; ???????????????END?IF; ????????????WHEN?"01"?=>--狀態(tài)01,倒計時狀態(tài),直到計時到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脈沖信號 ?????????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--秒計時到59,生產(chǎn)分計時脈沖 ????????????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?=?'1')?THEN ????????????washing_time?<=?"00001100";--?預(yù)置計時時間12分鐘 ?????????ELSIF?(min_en_rise?=?'1')?THEN--分鐘脈沖到了,分鐘時間減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; --75秒為一個周期 PROCESS?(clk_in) ???BEGIN ??????IF?(clk_in'EVENT?AND?clk_in?=?'1')?THEN ?????????IF?(start_key?=?'1')?THEN ????????????second_cnt?<=?"00000000"; ?????????ELSIF?(second_en?=?'1')?THEN ????????????IF?(second_cnt?>=?"01001010")?THEN--秒計時到74返回0 ???????????????second_cnt?<=?"00000000"; ????????????ELSE ???????????????second_cnt?<=?second_cnt?+?"00000001"; ????????????END?IF; ?????????ELSE ????????????second_cnt?<=?second_cnt; ?????????END?IF; ??????END?IF; ???END?PROCESS;
點擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=573
閱讀全文