軟件:Quartus
語言:VHDL
代碼功能:
洗衣機控制器設計
要求:
(1)設計一個電子定時器,控制洗衣機作如下運轉;定時啟動→正轉20秒→暫停10秒→反轉20秒→暫停10秒→定時未到回到“正轉20秒→暫停10秒→.....定時到則停止。
(2)洗滌過程由“啟動”信號開始,若定時到,需發(fā)出提示音響;
(3)用兩個數(shù)碼管顯示洗滌的預置時間(分鐘數(shù)),按倒計時方式對洗滌過程作計時顯示,直到時間到停機,用三只LED燈表示“正轉”,“反轉”?“暫?!比齻€狀態(tài)。
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
演示視頻:
設計文檔:
洗衣機仿真
1.要求
2.程序文件
3.程序運行
4.管腳設置
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;--啟動按鍵 ?????? ??????led????????:?OUT?STD_LOGIC_VECTOR(2?DOWNTO?0);--正轉,反轉,暫停 ??????end_led????:?OUT?STD_LOGIC;--洗衣結束信號 ?????? ??????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";--預置洗衣時間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;--?啟動按鈕寄存器緩存 ??????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)機 ???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_rise?=?'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"?=>--結束狀態(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,提示洗衣結束 ?????????ELSE ????????????end_led_buf?<=?'0'; ?????????END?IF; ??????END?IF; ???END?PROCESS; ??? ???end_led?<=?end_led_buf; ??? ???PROCESS?(clk_in)--設輸入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_rise?=?'1')?THEN ????????????washing_time?<=?"00001111";--?預置計時時間15分鐘 ?????????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; --???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--秒計時到59返回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=572
閱讀全文