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

名称:基于FPGA的空调控制器设计VHDL代码Quartus仿真(文末获取)

软件:Quartus

语言:VHDL

代码功能:

设计可调控制器,具有以下功能:

1、启动定时

2、设置时间

3、设置模式,制热制冷

4、按键控制温度加

5、按键控制温度减

6、倒计时结束提示

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;
源代码

 扫描文章末尾的公众号二维码

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
电梯控制器是现代化公寓、办公大厦、商场等建筑物必备的一个关键系统,它控制着电梯的运行、安全以及运行效率等多种方面。在电梯控制器设计中,一个重要的工具就是QuartusQuartus是业内知名的可编程逻辑设备(FPGA)编程软件。 设计电梯控制器需要一定的知识技能,例如电子工程、计算机科学等方面的知识。在实际应用中,常常需要使用可编程逻辑器件(FPGA)进行编程,在这种情况下,Quartus是一种非常重要的工具。利用Quartus,我们可以直接将设计好的电梯控制器逻辑图进行编程,实现控制器的低延迟、高可靠等特点。 使用Quartus进行电梯控制器设计,首先需要完成逻辑电路的设计,即对电梯控制器的功能、输入输出等进行定义,以及完成各种逻辑门、时序电路等电路的设计。在Quartus中,可以采用VHDL、Verilog等多种编程语言进行代码编写,这些代码可以直接转换为可编程逻辑器件的配置文件。在完成代码编写后,需要进行仿真和调试,以确保电梯控制器的功能和性能完全符合要求。 总之,Quartus是电梯控制器设计过程中不可或缺的工具,它的高效性能和强大的编程功能为电梯控制器设计师提供了极大的便利。通过Quartus设计师可以快速、准确地实现电梯控制器设计,并且确保该电梯控制器具有高可靠性、高性能等特点,从而为用户提供更好的使用体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值