名称:基于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;
源代码
扫描文章末尾的公众号二维码