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

简单洗衣机控制器设计VHDL代码Quartus仿真

07/03 09:20
528
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

2-240116091S44B.doc

共1个文件

名称:简单洗衣机控制器设计VHDL代码Quartus仿真

软件: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

  • 2-240116091S44B.doc
    下载

相关推荐