软件:Quartus
语言:VHDL
代码功能:
洗衣机控制器设计
要求:
(1)设计一个电子定时器,控制洗衣机作如下运转;定时启动→正转20秒→暂停10秒→反转20秒→暂停10秒→定时未到回到“正转20秒→暂停10秒→.....定时到则停止。
(2)洗涤过程由“启动”信号开始,若定时到,需发出提示音响;
(3)用两个数码管显示洗涤的预置时间(分钟数),按倒计时方式对洗涤过程作计时显示,直到时间到停机,用三只LED灯表示“正转”,“反转” “暂停”三个状态。
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
洗衣机仿真
1.要求
2.程序文件
3.程序运行
4.管脚设置
5.仿真
部分代码展示:
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; ENTITY washing_machine IS PORT ( clk_in : IN STD_LOGIC;--50Hz start_key : IN STD_LOGIC;--启动按键 led : OUT STD_LOGIC_VECTOR(2 DOWNTO 0);--正转,反转,暂停 end_led : OUT STD_LOGIC;--洗衣结束信号 dig_led1 : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--数码管1 dig_led2 : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)--数码管2 ); END washing_machine; ARCHITECTURE trans OF washing_machine IS SIGNAL state : STD_LOGIC_VECTOR(1 DOWNTO 0) := "01"; SIGNAL start_key_rise : STD_LOGIC; SIGNAL start_key_1 : STD_LOGIC := '0'; SIGNAL start_key_2 : STD_LOGIC := '0'; SIGNAL washing_time : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00001111";--预置洗衣时间15分钟 SIGNAL end_led_buf : STD_LOGIC := '1'; SIGNAL end_led_buf2 : STD_LOGIC := '1'; SIGNAL end_led_rise : STD_LOGIC; SIGNAL bell_cnt : STD_LOGIC_VECTOR(27 DOWNTO 0) := "0101111101011110000100000000"; SIGNAL bell_flag : STD_LOGIC; SIGNAL bell_clk : STD_LOGIC := '0'; SIGNAL bell_clk_cnt : STD_LOGIC_VECTOR(16 DOWNTO 0) := "00000000000000000"; SIGNAL second_cnt : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000000"; SIGNAL min_en : STD_LOGIC := '0'; SIGNAL min_en_buf : STD_LOGIC := '0'; SIGNAL min_en_rise : STD_LOGIC; SIGNAL second_en_fast : STD_LOGIC := '0'; SIGNAL second_en_1s : STD_LOGIC := '0'; SIGNAL second_en : STD_LOGIC; SIGNAL second_div_cnt_fast : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000000"; SIGNAL second_div_cnt : STD_LOGIC_VECTOR(9 DOWNTO 0) := "0000000000"; SIGNAL jishu : STD_LOGIC_VECTOR(15 DOWNTO 0) := "0000000000000000"; SIGNAL shang : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL yushu : STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL state_div : STD_LOGIC_VECTOR(1 DOWNTO 0) := "00"; SIGNAL data_buf : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000000"; SIGNAL shang_buf : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000000"; SIGNAL yushu_buf : STD_LOGIC_VECTOR(3 DOWNTO 0) := "0000"; SIGNAL display_data : STD_LOGIC_VECTOR(3 DOWNTO 0) := "0000"; SIGNAL duanxuan2 : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000000"; SIGNAL duanxuan1 : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000000"; BEGIN PROCESS (clk_in) BEGIN IF (clk_in'EVENT AND clk_in = '1') THEN start_key_1 <= start_key; start_key_2 <= start_key_1;-- 启动按钮寄存器缓存 END IF; END PROCESS; start_key_rise <= start_key_1 AND (NOT(start_key_2));--chenck the rise EVENT of start_key--start_key上升沿 PROCESS (clk_in)--状态机 BEGIN IF (clk_in'EVENT AND clk_in = '1') THEN CASE state IS WHEN "00" =>--状态00,等待状态,若有启动信号则到状态01 IF (start_key_rise = '1') THEN state <= "01"; ELSE state <= "00"; END IF; WHEN "01" =>--状态01,倒计时状态,直到计时到0,到状态01 IF (washing_time > "00000000") THEN state <= "01"; ELSE state <= "10"; END IF; WHEN "10" =>--结束状态,返回00 state <= "00"; WHEN OTHERS => state <= "00"; END CASE; END IF; END PROCESS; PROCESS (clk_in) BEGIN IF (clk_in'EVENT AND clk_in = '1') THEN IF (state = "00") THEN end_led_buf <= '1';--状态00,提示洗衣结束 ELSE end_led_buf <= '0'; END IF; END IF; END PROCESS; end_led <= end_led_buf; PROCESS (clk_in)--设输入clk为50Hz,分频到1Hz BEGIN IF (clk_in'EVENT AND clk_in = '1') THEN IF (second_div_cnt >= "0000110010") THEN--50 second_div_cnt <= "0000000000"; second_en_1s <= '1';--1S脉冲信号 ELSE second_div_cnt <= second_div_cnt + "0000000001"; second_en_1s <= '0'; END IF; END IF; END PROCESS; PROCESS (clk_in) BEGIN IF (clk_in'EVENT AND clk_in = '1') THEN IF (second_cnt = "00111011") THEN--秒计时到59,生产分计时脉冲 min_en <= '1'; ELSE min_en <= '0'; END IF; END IF; END PROCESS; PROCESS (clk_in) BEGIN IF (clk_in'EVENT AND clk_in = '1') THEN min_en_buf <= min_en; END IF; END PROCESS; min_en_rise <= min_en AND (NOT(min_en_buf)); PROCESS (clk_in) BEGIN IF (clk_in'EVENT AND clk_in = '1') THEN IF (start_key_rise = '1') THEN washing_time <= "00001111";-- 预置计时时间15分钟 ELSIF (min_en_rise = '1') THEN--分钟脉冲到了,分钟时间减1 IF (washing_time > "00000000") THEN washing_time <= washing_time - "00000001"; ELSE washing_time <= "00000000"; END IF; ELSE washing_time <= washing_time; END IF; END IF; END PROCESS; second_en <= second_en_1s; -- second_en <= second_en_1s; PROCESS (clk_in) BEGIN IF (clk_in'EVENT AND clk_in = '1') THEN IF (start_key_rise = '1') THEN second_cnt <= "00000000"; ELSIF (second_en = '1') THEN IF (second_cnt >= "00111011") THEN--秒计时到59返回0 second_cnt <= "00000000"; ELSE second_cnt <= second_cnt + "00000001"; END IF; ELSE second_cnt <= second_cnt; END IF; END IF; END PROCESS;
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=572
阅读全文
528