天天看點

數字邏輯結課實驗 VHDL語言設計洗衣機控制系統

  • 實驗題目

洗衣機控制系統設計與實作

  • 實驗目的
  1. 熟悉數字系統的組成。

     2. 掌握自頂向下的設計方法。

     3. 了解洗衣機的工作原理。

     4. 掌握建立狀态機和實作狀态機的方法。

     5. 了解狀态機在洗衣機控制器設計中的應用。

  • 實驗步驟
  1. 需求分析

洗衣機的主要工作流程為注水—漂洗(漂洗強度的選擇)—脫水—排水—響鈴提醒等功能,家用洗衣機擁有多種模式選擇,每種模式下有相應的工作流程。例如常用的三種模式:

注水—洗滌—脫水—排水—響鈴;

注水—洗滌—排水—響鈴;

脫水—排水—響鈴;

模式的選擇需要有相應的選擇器選擇實作,在完成一項功能後還需要狀态的轉換,由于狀态的轉換與輸入狀态有關,是以需要mealy機實作,一共有至少五種狀态需要互相轉換。洗衣機在洗滌過程中還有輪機的左右轉動需要用計時器表示。

    2.子產品劃分

數字邏輯結課實驗 VHDL語言設計洗衣機控制系統

3.控制子產品的ASM圖

數字邏輯結課實驗 VHDL語言設計洗衣機控制系統

4.具體實作

模式選擇器輸入://一共有三種模式,對三種模式用15位編碼,每三位編碼對應一個過程,例如001為注水,002為洗滌等等,當三位編碼為000時則說明不執行此流程。而三種模式的選擇是靠模式選擇器的3位編碼的輸入來實作選擇的,具體代碼如下:

LIBRARY IEEE;  

USE IEEE.STD_LOGIC_1164.ALL;

entity import is

port(

     into:in std_logic_vector(2 downto 0);

  reset:in std_logic;

  pour:out std_logic_vector(14 downto 0));

end import;

architecture imports of import is

begin

process(into,reset)

begin

 if reset='1'then

   pour<="000000000000000";

elsif into="001"then

pour<="000000011100101";

elsif into<="010"then

pour<="001010011100101";

elsif into="011"then

pour<="001010000100101";

else

pour<="000000000000000";

end if;

end process;

end imports;

mealy狀态機://一共有7種狀态,其中S0為初始狀态15為編碼預設為0,S1表示注水,S2表示洗滌,S3表示脫水,S4表示排水,S5表示響鈴提醒,S6表示工作結束,關閉所有計時器的使能端。

狀态的轉換與15位編碼和計時器的傳回值有關,具體代碼如下:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY ME IS

PORT(RESET:IN STD_LOGIC;

    CP :IN STD_LOGIC;  --CLOCK

 --PUSH_TIME:IN std_logic_vector(2 DOWNTO 0);

 PIAO_TiME:IN std_logic_vector(2 DOWNTO 0);

 TIME_3:IN STD_LOGIC;

 TIME_4:IN STD_LOGIC;

 TIME_5:IN STD_LOGIC;

 TIMEP:IN STD_LOGIC;

 TIMEP1:IN STD_LOGIC;

 TIMEP2:IN STD_LOGIC;

 ENTIMEP:out STD_LOGIC;

 ENTIMEP1:out STD_LOGIC;

 ENTIMEP2:out STD_LOGIC;

 ENTIME_3:out STD_LOGIC;

 ENTIME_4:out STD_LOGIC;

 ENTIME_5:out STD_LOGIC;

 MOBILE:IN STD_logic_vector(14 DOWNTO 0));

END ME;

ARCHITECTURE A OF ME IS

TYPE State_type is(s0,s1,s2,s3,s4,s5,s6);

signal State:State_type;

signal DIN:std_logic_vector(2 downto 0);

signal DIN_DIN:std_logic_vector(2 downto 0);

BEGIN

PROCESS(STATE,MOBILE)

BEGIN

IF RESET='1'THEN

IF(CP'EVENT AND CP='1')THEN

STATE<=S0;

CASE STATE IS

WHEN S0=> --STATE S0

   DIN<=MOBILE(14)&MOBILE(13)&MOBILE(12);

DIN_DIN<=MOBILE(8)&MOBILE(7)&MOBILE(6);

IF DIN="001" THEN

STATE<=S1;

ENTIME_3<='0';

ENTIME_4<='0';

ENTIME_5<='0';

ENTIMEP<='1';

ENTIMEP1<='0';

    ENTIMEP2<='0';

--IF PUSH_TIME="011"THEN

--ENTIME_3<='1';

--ENTIME_4<='0';

--ENTIME_5<='0';

--ELSIF PUSH_TIME="100"THEN

--ENTIME_3<='0';

--ENTIME_4<='1';

--ENTIME_5<='0';

--ELSIF PUSH_TIME="101"THEN

--ENTIME_3<='0';

--ENTIME_4<='0';

--ENTIME_5<='1';

--END IF;

ELSIF (DIN="000" AND DIN_DIN="011")THEN

STATE<=S3;

ENTIME_3<='0';

ENTIME_4<='0';

ENTIME_5<='0';

ENTIMEP<='0';

ENTIMEP1<='1';

ENTIMEP2<='0';

ELSE

STATE<=S0;

END IF;

WHEN S1=> --STATE S1

   DIN<=MOBILE(11)&MOBILE(10)&MOBILE(9);

IF (DIN="010"AND (TIME_3='1' OR TIME_4='1'OR TIME_5='1' OR TIMEP='1'OR TIMEP1='1'OR TIMEP2='1')) THEN --INPUT=1

STATE<=S2;

IF piao_TIME="011"THEN

ENTIME_3<='1';

ENTIME_4<='0';

ENTIME_5<='0';

ENTIMEP<='0';

ENTIMEP1<='0';

ENTIMEP2<='0';

ELSIF piao_TIME="100"THEN

ENTIME_3<='0';

ENTIME_4<='1';

ENTIME_5<='0';

ENTIMEP<='0';

ENTIMEP1<='0';

ENTIMEP2<='0';

ELSIF piao_TIME="101"THEN

ENTIME_3<='0';

ENTIME_4<='0';

ENTIME_5<='1';

ENTIMEP<='0';

ENTIMEP1<='0';

ENTIMEP2<='0';

END IF;

ELSE

STATE<=S1;

END IF;

WHEN S2=> --STATE S2

   DIN<=MOBILE(8)&MOBILE(7)&MOBILE(6);

DIN_DIN<=MOBILE(5)&MOBILE(4)&MOBILE(3);

IF (DIN="011"and (TIME_3='1' OR TIME_4='1'OR TIME_5='1' OR TIMEP='1'OR TIMEP1='1'OR TIMEP2='1')) THEN --INPUT=1

STATE<=S3;

ENTIME_3<='0';

ENTIME_4<='0';

ENTIME_5<='0';

ENTIMEP<='0';

ENTIMEP1<='1';

ENTIMEP2<='0';

ELSIF (DIN="000" AND DIN_DIN="100" AND (TIME_3='1' OR TIME_4='1'OR TIME_5='1' OR TIMEP='1'OR TIMEP1='1'OR TIMEP2='1')) THEN

STATE<=S4;

   ENTIME_3<='0';

ENTIME_4<='0';

ENTIME_5<='0';

ENTIMEP<='1';

ENTIMEP1<='0';

ENTIMEP2<='0';

ELSE

   STATE<=S2;

END IF;

WHEN S3=> --STATE S3

   DIN<=MOBILE(5)&MOBILE(4)&MOBILE(3);

IF (DIN="100" AND (TIME_3='1' OR TIME_4='1'OR TIME_5='1' OR TIMEP='1'OR TIMEP1='1'OR TIMEP2='1'))THEN --INPUT=1

STATE<=S4;

ENTIME_3<='0';

ENTIME_4<='0';

ENTIME_5<='0';

      ENTIMEP<='1';

      ENTIMEP1<='0';

   ENTIMEP2<='0';

ELSE

STATE<=S3;

END IF;

WHEN S4=>

DIN<=MOBILE(2)&MOBILE(1)&MOBILE(0);

IF (DIN="101" AND (TIME_3='1' OR TIME_4='1'OR TIME_5='1' OR TIMEP='1'OR TIMEP1='1'OR TIMEP2='1'))THEN

STATE<=S5;

ENTIME_3<='0';

ENTIME_4<='0';

ENTIME_5<='0';

      ENTIMEP<='0';

      ENTIMEP1<='0';

      ENTIMEP2<='1';

ELSE

STATE<=S4;

END IF;

WHEN S5=>

IF (TIME_3='1' OR TIME_4='1'OR TIME_5='1' OR TIMEP='1'OR TIMEP1='1'OR TIMEP2='1') THEN

STATE<=S6;

ELSE

STATE<=S5;

END IF;

WHEN S6=>

   ENTIME_3<='0';

ENTIME_4<='0';

ENTIME_5<='0';

   ENTIMEP<='0';

   ENTIMEP1<='0';

ENTIMEP2<='0';

END CASE;

END IF;

end if;

END PROCESS;

END A;

控制洗滌計時器的分頻器://實作對計時器的控制,連接配接使能端可以讓兩個計時器交替進行轉到

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.all;

entity division_1 IS

PORT(CLK:IN STD_LOGIC;

S1,S2:BUFFER STD_LOGIC;

CNT,TIME1:BUFFER INTEGER;

Q,co:OUT STD_LOGIC);

END ENTITY;

ARCHITECTURE ONE OF division_1 IS

BEGIN

PROCESS(CLK)

BEGIN

IF CLK'EVENT AND CLK='1' THEN

IF TIME1 = 60 then

TIME1 <= 0;

co <= '1';

else

TIME1<=TIME1+1;

co <= '0';

END IF;

END IF;

IF CLK'EVENT AND CLK='1' THEN

IF CNT=10 then CNT<=0;

else CNT<=CNT+1;

END IF;

END IF;

END PROCESS;

PROCESS(CNT,CLK)

BEGIN

IF CLK'EVENT AND CLK='1' THEN

IF CNT=10 then S1<=NOT S1;

ELSE S1<=S1;

END IF;

ELSIF CLK'EVENT AND CLK='0' THEN

IF CNT=5 then S2<=NOT S2;

ELSE S2<=S2;

END IF;

END IF;

END PROCESS;

Q<=S1 XOR S2;

END;

5s計時器:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.all;

USE IEEE.STD_LOGIC_unsigned.ALL;

entity counter_5 is

port(cp:in std_logic;

     en:in std_logic;

     --reset:in std_logic;

     time_5:out std_logic;

Q:buffer std_logic_vector(3 downto 0));

end entity;

architecture counter of counter_5 is

begin

process(cp,en)

begin

--if reset='1'then

--Q<="0000";

if(en='0')then

Q<="0000";

--time_5<='0';

--end if;

--if en='0'then

--Q<="0000";

time_5<='0';

elsif (cp'EVENT and cp='1') then

if en='1' and Q/="0101" then

 Q<=Q+'1';

 time_5<='0';

 elsif Q="0101" then

 time_5<='1';

 --reset<=time_5;

end if;

end if;

end process;

end architecture;

洗滌功能時的計時器:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_unsigned.ALL;

ENTITY counter_3 IS

PORT (EN,CP:IN STD_LOGIC;

   CLK:in STD_LOGIC;

CO: OUT STD_LOGIC;

   Q:BUFFER STD_LOGIC_VECTOR (3 DOWNTO 0));

END counter_3;

ARCHITECTURE use_3 OF counter_3 IS

BEGIN

PROCESS(CP,EN)

BEGIN

  --CLK<=(Q(0) and Q(1));

  if(CLK='1')then

  Q<="0000";

  ELSIF(CP'EVENT AND CP='1')THEN

    IF (EN='1')THEN

    Q<=Q+'1';

 ELSE         

 Q<=Q;

 END IF;

 end if;

 END PROCESS;

 CO<='1'WHEN (Q="0011"AND EN='1')ELSE'0';

 END architecture;

與門,非門:

library ieee;

use ieee.std_logic_1164.all;

entity yumen is

port(A,B : in std_logic;

  Q : out std_logic);

end entity;

architecture use_1 of yumen is

begin

process(A,B)

begin

Q <= A and B;

end process;

end architecture;

library ieee;

use ieee.std_logic_1164.all;

entity not1 is

port(A : in std_logic;

  Q : out std_logic);

end entity;

architecture use_1 of not1 is

begin

process(A)

begin

Q <= not A;

end process;

end architecture;

5.測試及分析

數字邏輯結課實驗 VHDL語言設計洗衣機控制系統

器件連接配接圖

數字邏輯結課實驗 VHDL語言設計洗衣機控制系統

本圖為脫水—排水—響鈴模式的仿真,圖中可以看到脫水的計時器Qt開始計時5秒表示脫水過程正在進行,之後排水的計時器Qzp計時5秒表示排水過程正在進行,時間到之後響鈴提示的計時器啟動,響鈴5秒。整個過程中隻有脫水—排水—響鈴的計時器依次進行工作,其餘計時器均不工作。

數字邏輯結課實驗 VHDL語言設計洗衣機控制系統

本圖為注水—洗滌—脫水—排水—響鈴模式的仿真圖,圖中注水的計時器Qzp先工作5秒,之後表示洗滌的兩個計時器依次交替進行,因為這裡選擇的洗滌強度為弱洗滌,是以兩個計時器交替計時4次半,之後脫水的計時器Qt,排水的計時器Qzp,響鈴提示的計時器Qx依此計時5秒。

數字邏輯結課實驗 VHDL語言設計洗衣機控制系統

本圖為注水—洗滌—排水—響鈴模式的仿真圖,圖中注水的計時器Qzp先工作5秒,之後表示洗滌的兩個計時器依次交替進行,因為這裡選擇的洗滌強度為弱洗滌,是以兩個計時器交替計時4次半,之後排水的計時器Qzp,響鈴提示的計時器Qx依此計時5秒。

  • 總結與思考

本實驗主要實作了洗衣機的部分功能,3種模式分别為脫水—排水—響鈴,注水—洗滌—脫水—排水—響鈴,注水—洗滌—排水—響鈴;模式的選擇設計了一個模式選擇器,将5種狀态編碼為001 010 011 100 101,當狀态為000時表示此狀态不工作。是以對應于3種模式有3種不同地15位編碼。再通過模式選擇器輸入001或010或011來選擇相應地15位編碼,進而選擇對應地模式。類似于模式選擇器輸入為001時,模式選擇器輸出為000000011100101,輸入為010時,輸出為001010011100101。控制器子產品實作狀态的轉換主要靠mealy狀态機判斷在選擇的模式下目前狀态之後相應的狀态的編碼是否為有效的編碼,如果有效則選擇相應的狀态進行轉換,否則依舊保持此狀态。狀态的轉換過程中還伴随着相應的計時器使能端的開閉。計時器子產品主要設計了兩類計時器,一類是普通的5秒計時器,例如排水注水計時器Qzp,脫水計時器Qt,響鈴計時器Qx。另一類是表示洗滌的交替計時器。它有弱洗滌計時器,中洗滌計時器,強洗滌計時器之分,3種計時器的選擇是靠在控制器中輸入相應的強度編碼來打開的。計時器交替進行的實作是設計了分頻器,分頻器的輸出外加一些門電路連接配接兩個計時器的使能端,實作計時器能夠在相應段位上工作進而實作交替。分頻器中還有計時的語句,到達一定時間時,分頻器會給控制器一個信号,停止工作。計時語句的總時間不同,其控制的交替計時器交替的次數不同進而表現為洗滌的強度不同。

本次實驗的難點在于狀态的轉換以及洗滌時計時器的交替進行,我們的解決方法獨特有效,滿足了我們需求,通過本次實驗,鍛煉了我們子產品化設計能力,進一步掌握了語言的運用,同時還提高了我們解決問題的創新能力。整個洗衣機控制系統可以實作洗衣機的基本需求,整體設計符合需求。

繼續閱讀