• 方案介绍
  • 附件下载
  • 相关推荐
申请入驻 产业图谱

基于FPGA的空调控制器设计VHDL代码Quartus仿真

07/25 08:42
295
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

2-2405161AG3363.doc

共1个文件

名称:基于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

  • 2-2405161AG3363.doc
    下载

相关推荐