扫码加入

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

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

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

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
    下载

相关推荐