名称:基于FPGA的空调控制器设计VHDL代码Quartus仿真
软件:Quartus
语言:VHDL
代码功能:
设计可调控制器,具有以下功能:
1、启动定时;
2、设置时间;
3、设置模式,制热制冷;
4、按键控制温度加;
5、按键控制温度减;
6、倒计时结束提示。
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
1. 工程文件
2. 程序文件
3. 程序编译
4. 仿真文件
5. 仿真图
整体仿真
设置时间为2小时,设置模式为制冷,cool_signal=1,设置温度为22度,按下timming信号开始定时.
倒计时
倒计时结束,end_reminder拉高提示
部分代码展示:
LIBRARY?ieee; ???USE?ieee.std_logic_1164.all; ???USE?ieee.std_logic_unsigned.all; ENTITY?air_conditioner?IS ???PORT?( ??????clk_1Hz????????????:?IN?STD_LOGIC; ??????timing?????????????:?IN?STD_LOGIC;--启动定时 ??????time_set???????????:?IN?STD_LOGIC;--设置时间 ??????mode_set???????????:?IN?STD_LOGIC;--设置模式,制热制冷 ??????cool_signal????????:?OUT?STD_LOGIC;--冷风 ??????hot_signal?????????:?OUT?STD_LOGIC;--热风 ??????temperature_add????:?IN?STD_LOGIC;--温度加 ??????temperature_sub????:?IN?STD_LOGIC;--温度减 ??????end_reminder???????:?OUT?STD_LOGIC;--倒计时结束提示 ??????temperature_H_HEX??:?OUT?STD_LOGIC_VECTOR(7?DOWNTO?0);--数码管 ??????temperature_L_HEX??:?OUT?STD_LOGIC_VECTOR(7?DOWNTO?0);--数码管 ??????min_shi_HEX????????:?OUT?STD_LOGIC_VECTOR(7?DOWNTO?0);--数码管 ??????min_ge_HEX?????????:?OUT?STD_LOGIC_VECTOR(7?DOWNTO?0);--数码管 ??????hour_shi_HEX???????:?OUT?STD_LOGIC_VECTOR(7?DOWNTO?0);--数码管 ??????hour_ge_HEX????????:?OUT?STD_LOGIC_VECTOR(7?DOWNTO?0)--数码管 ???); END?air_conditioner; ARCHITECTURE?behave?OF?air_conditioner?IS ???TYPE?State_type?IS?(s_idle,?s_timing,s_end);??--?定义状态 ???SIGNAL?state?:?State_Type;????--?创建信号 ???SIGNAL?temperature_H?:?STD_LOGIC_VECTOR(3?DOWNTO?0):="0010"; ???SIGNAL?temperature_L?:?STD_LOGIC_VECTOR(3?DOWNTO?0):="0000"; ???SIGNAL?sec_shi???????:?STD_LOGIC_VECTOR(3?DOWNTO?0); ???SIGNAL?sec_ge????????:?STD_LOGIC_VECTOR(3?DOWNTO?0); ???SIGNAL?min_shi???????:?STD_LOGIC_VECTOR(3?DOWNTO?0); ???SIGNAL?min_ge????????:?STD_LOGIC_VECTOR(3?DOWNTO?0); ???SIGNAL?hour_shi??????:?STD_LOGIC_VECTOR(3?DOWNTO?0); ???SIGNAL?hour_ge???????:?STD_LOGIC_VECTOR(3?DOWNTO?0); ???SIGNAL?mode??????????:?STD_LOGIC?:=?'0'; ??? ???SIGNAL?count?????????:?STD_LOGIC_VECTOR(7?DOWNTO?0)?:=?"00000000"; BEGIN ???PROCESS?(clk_1Hz)--设置温度 ???BEGIN ??????IF?(clk_1Hz'EVENT?AND?clk_1Hz?=?'1')?THEN ?????????IF?(temperature_add?=?'1')?THEN ????????????IF?(temperature_H?=?"0011"?AND?temperature_L?=?"0101")?THEN--温度最高35 ???????????????temperature_H?<=?"0011"; ???????????????temperature_L?<=?"0101"; ????????????ELSIF?(temperature_L?=?"1001")?THEN--个位9 ???????????????temperature_H?<=?temperature_H?+?"0001";--十位加1 ???????????????temperature_L?<=?"0000"; ????????????ELSE ???????????????temperature_H?<=?temperature_H; ???????????????temperature_L?<=?temperature_L?+?"0001";--个位加1 ????????????END?IF; ?????????ELSIF?(temperature_sub?=?'1')?THEN ????????????IF?(temperature_H?=?"0001"?AND?temperature_L?=?"0000")?THEN--最低10度 ???????????????temperature_H?<=?"0001"; ???????????????temperature_L?<=?"0000"; ????????????ELSIF?(temperature_L?=?"0000")?THEN--个位0 ???????????????temperature_H?<=?temperature_H?-?"0001";--十位减1 ???????????????temperature_L?<=?"1001"; ????????????ELSE ???????????????temperature_H?<=?temperature_H; ???????????????temperature_L?<=?temperature_L?-?"0001";--个位减1 ????????????END?IF; ?????????END?IF; ??????END?IF; ???END?PROCESS; ??? ???PROCESS?(clk_1Hz) ???BEGIN ??????IF?(clk_1Hz'EVENT?AND?clk_1Hz?=?'1')?THEN ?????????IF?(mode_set?=?'1')?THEN ????????????mode?<=?NOT(mode);--设置模式 ?????????END?IF; ??????END?IF; ???END?PROCESS; ??? ???cool_signal?<=?'1'?WHEN?(mode?=?'0')?ELSE--制冷 ??????????????????'0'; ???hot_signal?<=?'1'?WHEN?(mode?=?'1')?ELSE--制热 ?????????????????'0'; ??? --倒计时状态机 PROCESS?(clk_1Hz) ???BEGIN ??????IF?(clk_1Hz'EVENT?AND?clk_1Hz?=?'1')?THEN ?????????CASE?state?IS ????????????WHEN?s_idle?=> ???????????????IF?(timing?=?'1')?THEN--启动倒计时 ??????????????????state?<=?s_timing; ???????????????ELSE ??????????????????state?<=?s_idle; ???????????????END?IF; ????????????WHEN?s_timing?=>--倒计时状态 ???????????????IF?(hour_shi?=?"0000"?AND?hour_ge?=?"0000"?AND?min_shi?=?"0000"?AND?min_ge?=?"0000")?THEN ??????????????????state?<=?s_end; ???????????????ELSE ??????????????????state?<=?s_timing; ???????????????END?IF; ????????????WHEN?s_end?=>--倒计时结束 ???????????????IF?(count?>?"00001010")?THEN--结束提示持续10s ??????????????????state?<=?s_idle; ???????????????ELSE ??????????????????state?<=?s_end; ???????????????END?IF; ????????????WHEN?OTHERS?=> ?????????END?CASE; ??????END?IF; ???END?PROCESS; ??? ??? ???PROCESS?(clk_1Hz) ???BEGIN ??????IF?(clk_1Hz'EVENT?AND?clk_1Hz?=?'1')?THEN ?????????IF?(state?=?s_end)?THEN ????????????count?<=?count?+?"00000001"; ????????????end_reminder?<=?'1';----结束提示持续10s ?????????ELSE ????????????count?<=?"00000000"; ????????????end_reminder?<=?'0'; ?????????END?IF; ??????END?IF; ???END?PROCESS; ??? ???--计时 ???PROCESS?(clk_1Hz) ???BEGIN ??????IF?(clk_1Hz'EVENT?AND?clk_1Hz?=?'1')?THEN ?????????CASE?state?IS ????????????WHEN?s_idle?=> ???????????????IF?(time_set?=?'1')?THEN--设置时间 ??????????????????IF?(hour_shi?=?"0010"?AND?hour_ge?=?"0011")?THEN--23h回0 ?????????????????????hour_shi?<=?"0000"; ?????????????????????hour_ge?<=?"0000"; ??????????????????ELSIF?(hour_ge?=?"1001")?THEN--9 ?????????????????????hour_shi?<=?hour_shi?+?"0001";--+1 ?????????????????????hour_ge?<=?"0000"; ??????????????????ELSE ?????????????????????hour_shi?<=?hour_shi; ?????????????????????hour_ge?<=?hour_ge?+?"0001";--+1 ??????????????????END?IF; ???????????????END?IF; ????????????WHEN?s_timing?=>--倒计时 ???????????????IF?(hour_shi?=?"0000"?AND?hour_ge?=?"0000"?AND?min_shi?=?"0000"?AND?min_ge?=?"0000"?AND?sec_shi?=?"0000"?AND?sec_ge?=?"0000")?THEN ??????????????????hour_shi?<=?"0000"; ??????????????????hour_ge?<=?"0000"; ??????????????????min_shi?<=?"0000"; ??????????????????min_ge?<=?"0000"; ??????????????????sec_shi?<=?"0000"; ??????????????????sec_ge?<=?"0000"; ???????????????ELSIF?(hour_ge?=?"0000"?AND?min_shi?=?"0000"?AND?min_ge?=?"0000"?AND?sec_shi?=?"0000"?AND?sec_ge?=?"0000")?THEN ??????????????????hour_shi?<=?hour_shi?-?"0001"; ??????????????????hour_ge?<=?"1001"; ??????????????????min_shi?<=?"0101"; ??????????????????min_ge?<=?"1001"; ??????????????????sec_shi?<=?"0101"; ??????????????????sec_ge?<=?"1001"; ???????????????ELSIF?(min_shi?=?"0000"?AND?min_ge?=?"0000"?AND?sec_shi?=?"0000"?AND?sec_ge?=?"0000")?THEN ??????????????????hour_shi?<=?hour_shi; ??????????????????hour_ge?<=?hour_ge?-?"0001"; ??????????????????min_shi?<=?"0101"; ??????????????????min_ge?<=?"1001"; ??????????????????sec_shi?<=?"0101"; ??????????????????sec_ge?<=?"1001"; ???????????????ELSIF?(min_ge?=?"0000"?AND?sec_shi?=?"0000"?AND?sec_ge?=?"0000")?THEN ??????????????????hour_shi?<=?hour_shi; ??????????????????hour_ge?<=?hour_ge; ??????????????????min_shi?<=?min_shi?-?"0001"; ??????????????????min_ge?<=?"1001"; ??????????????????sec_shi?<=?"0101"; ??????????????????sec_ge?<=?"1001"; ???????????????ELSIF?(sec_shi?=?"0000"?AND?sec_ge?=?"0000")?THEN ??????????????????hour_shi?<=?hour_shi; ??????????????????hour_ge?<=?hour_ge; ??????????????????min_shi?<=?min_shi; ??????????????????min_ge?<=?min_ge?-?"0001"; ??????????????????sec_shi?<=?"0101"; ??????????????????sec_ge?<=?"1001"; ???????????????ELSIF?(sec_ge?=?"0000")?THEN ??????????????????hour_shi?<=?hour_shi; ??????????????????hour_ge?<=?hour_ge; ??????????????????min_shi?<=?min_shi; ??????????????????min_ge?<=?min_ge; ??????????????????sec_shi?<=?sec_shi?-?"0001"; ??????????????????sec_ge?<=?"1001"; ???????????????ELSE ??????????????????hour_shi?<=?hour_shi; ??????????????????hour_ge?<=?hour_ge; ??????????????????min_shi?<=?min_shi; ??????????????????min_ge?<=?min_ge; ??????????????????sec_shi?<=?sec_shi; ??????????????????sec_ge?<=?sec_ge?-?"0001"; ???????????????END?IF; ????????????WHEN?OTHERS?=> ?????????END?CASE; ??????END?IF; ???END?PROCESS; ??? ???--数码管段选 ???PROCESS?(temperature_H) ???BEGIN ??????CASE?temperature_H?IS ?????????WHEN?"0000"?=> ????????????temperature_H_HEX?<=?"11000000"; ?????????WHEN?"0001"?=> ????????????temperature_H_HEX?<=?"11111001"; ?????????WHEN?"0010"?=> ????????????temperature_H_HEX?<=?"10100100"; ?????????WHEN?"0011"?=> ????????????temperature_H_HEX?<=?"10110000"; ?????????WHEN?"0100"?=> ????????????temperature_H_HEX?<=?"10011001"; ?????????WHEN?"0101"?=> ????????????temperature_H_HEX?<=?"10010010"; ?????????WHEN?"0110"?=> ????????????temperature_H_HEX?<=?"10000010"; ?????????WHEN?"0111"?=> ????????????temperature_H_HEX?<=?"11111000"; ?????????WHEN?"1000"?=> ????????????temperature_H_HEX?<=?"10000000"; ?????????WHEN?"1001"?=> ????????????temperature_H_HEX?<=?"10010000"; ?????????WHEN?OTHERS?=> ??????END?CASE; ???END?PROCESS;
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=764
阅读全文
295