软件:Quartus
语言:VHDL
代码功能:
洗衣机控制器设计
要求:
(1)设计一个电子定时器,控制洗衣机作如下运转;定时启动→正转20秒→暂停10秒→反转20秒→暂停10秒→定时未到回到“正转20秒→暂停10秒→.....定时到则停止。
(2)洗涤过程由“启动”信号开始,若定时到,需发出提示音响;
(3)用两个数码管显示洗涤的预置时间(分钟数),按倒计时方式对洗涤过程作计时显示,直到时间到停机,用三只LED灯表示“正转”,“反转”?“暂停”三个状态。
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);--数码管1 ??????dig_led2???:?OUT?STD_LOGIC_VECTOR(7?DOWNTO?0)--数码管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)--状态机 ???BEGIN ??????IF?(clk_in'EVENT?AND?clk_in?=?'1')?THEN ?????????CASE?state?IS ????????????WHEN?"00"?=>--状态00,等待状态,若有启动信号则到状态01 ???????????????IF?(start_key_rise?=?'1')?THEN ??????????????????state?<=?"01"; ???????????????ELSE ??????????????????state?<=?"00"; ???????????????END?IF; ????????????WHEN?"01"?=>--状态01,倒计时状态,直到计时到0,到状态01 ???????????????IF?(washing_time?>?"00000000")?THEN ??????????????????state?<=?"01"; ???????????????ELSE ??????????????????state?<=?"10"; ???????????????END?IF; ????????????WHEN?"10"?=>--结束状态,返回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';--状态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,生产分计时脉冲 ????????????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
阅读全文
369