基于VHDL的洗衣机控制器设计
- 格式:doc
- 大小:366.50 KB
- 文档页数:14
.数字系统设计与硬件描述语言期末考试作业题目:洗衣机控制器的设计学院:电子信息工程学院专业:物联网工程学号:3014204328姓名:刘涵凯2016-12-10一、选题设计描述1.功能介绍洗衣机控制器,能够实现开始与暂停、注水,洗涤、排水、脱水和警报提醒的功能,并且可以随时更改洗衣模式。
洗衣机提供两种模式:模式1:注水-洗涤-排水-注水-洗涤-排水-脱水;模式2:脱水。
洗衣模式决定洗衣时间。
默认模式为模式2。
洗衣机界面如下图所示:运转方式如下图所示:2.算法简介总程序描述:总程序通过调用5种模块,在洗衣机控制器输入变化时,立刻转换模式并产生对应输出。
当开关关闭时,所有输出为0;暂停时,除显示开关状态的输出外,所有输出为0。
开关开启后,设置洗衣模式,之后按下“开始”即可开始工作。
在洗衣机控制器输入变化时,立刻转换模式并产生对应输出。
电子元器件模型如下图所示:switch为开关信号,modelselect为开关选择信号,clkin为系统时序脉冲信号,sorp 为开始/暂停信号。
waterstate为注水程序的工作状态,washrstate为洗涤程序的工作状态,drainstate为排水程序的工作状态,drystate为脱水程序的工作状态。
alarmout为警报提醒的状态。
switchstate为数码管显示的开关的状态(0/1),spstate为数码管显示的开始/暂停的状态(0/1),state为数码管显示的洗衣机工作状态(0~4),currentmodel为数码管显示的当前模式(0~2),timedecade为数码管显示的剩余时间的十位,timeunit为数码管显示的剩余时间的个位。
下面介绍各模块功能与算法:1)开关与模式选择模块a接收开关信息,b接收模式选择信息。
c输出总电路的开关信息(开启洗衣机并且设置完毕电路后,即可准备工作,等待“开始”信号)。
e为开关信息,将输入到数码管中显示。
time1与time2分别代表洗衣时间的十位和个位,将输入到计数器与警报模块中。
y为模式信息,将输入到码管中显示。
2)开始/暂停模块a接收开关信息,b接收开始/暂停信息,clk接收系统时序脉冲信号。
startorpause输出受开始/暂停信息调控的系统时序脉冲信号。
y为开始/暂停信息,将输入到码管中显示。
3)计数器与警报模块clk接收受开始/暂停信息调控的系统时序脉冲信号,a接收开关信息,time1和time2分别接收洗衣时间的十位和个位。
alarm输出警报信息;outtime1和outtime2分别为剩余时间的十位和个位,将输入到数码管中显示,同时将输入到控制模块中。
在脉冲信号的控制下,剩余时间逐渐减少,当剩余时间为0时,停止减小,并开启警报。
4)控制模块a接收开关信息,b接收开始/暂停信息,time1和time2分别接收剩余时间的十位和个位。
water、wash、drain、dry分别输出注水、洗涤、排水、脱水的控制信息。
act为模块内部使用的BUFFER量。
控制模块根据剩余时间的多少决定工作状态。
如:剩余时间为16-30分钟时洗涤,31-35分钟时注水。
则剩余时间33分钟时,water为1,其他控制信息为0;剩余时间21分钟时,wash为1,其他控制信息为0。
5)译码器与数码管显示模块b接收开关信息,a接收4位二进制数据。
q在数码管上显示字形。
二、程序源代码及说明程序代码由主程序及5个模块代码组成1)主程序LIBRARY IEEE ;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL ;ENTITY xyj ISPORT(switch,modelselect,clkin,sorp: IN STD_LOGIC; --电源开关、模式选择、时钟、开始/暂停按键状态的输入waterstate,washstate,drainstate,drystate,alarmout: OUT STD_LOGIC; --注水程序、洗涤程序、排水程序、脱水程序、警报状态的输出switchstate,spstate,state,currentmodel,timedecade,timeunit: OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); --工作状态、工作模式、剩余时间的输出END ENTITY xyj;ARCHITECTURE behave OF xyj ISCOMPONENT model --调用开关与模式选择模块PORT(a,b: IN STD_LOGIC;c: OUT STD_LOGIC;e,time1,time2,y: OUT STD_LOGIC_VECTOR ( 3 DOWNTO 0 ));END COMPONENT model;COMPONENT count --调用计数器与警报模块PORT(clk,a: IN STD_LOGIC;time1,time2: IN STD_LOGIC_VECTOR(3 DOWNTO 0);alarm: OUT STD_LOGIC;outtime1,outtime2: OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END COMPONENT count;COMPONENT BCD7 --调用译码器与数码管显示模块PORT(b: IN STD_LOGIC;a: IN STD_LOGIC_VECTOR(3 DOWNTO 0);q : OUT STD_LOGIC_VECTOR(0 TO 6) );END COMPONENT BCD7;COMPONENT startpause --调用开始/暂停模块PORT(a,b,clk: IN STD_LOGIC;startorpause: OUT STD_LOGIC;e: OUT STD_LOGIC_VECTOR ( 3 DOWNTO 0 ));END COMPONENT startpause;COMPONENT control --调用控制模块PORT(a,b: IN STD_LOGIC;time1,time2: IN STD_LOGIC_VECTOR(3 DOWNTO 0);water,wash,drain,dry: OUT STD_LOGIC;act: BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0));END COMPONENT control;SIGNALsig1,sig2,sigBCD7_1,sigBCD7_2,sigBCD7_3,sigBCD7_4,sigBCD7_5,sigBCD7_6:STD_LO GIC_VECTOR(3 DOWNTO 0);SIGNAL aout,bout:STD_LOGIC;BEGINU1: model PORT MAP(a=>switch,b=>modelselect,c=>aout,y=>sigBCD7_1,time1=>sig1,time2=>sig2,e=>sigB CD7_5);U2: startpause PORT MAP(a=>aout,b=>sorp,clk=>clkin,startorpause=>bout,e=>sigBCD7_6);U3: control PORT MAP(a=>aout,b=>sorp,time1=>sigBCD7_2,time2=>sigBCD7_3,water=>waterstate,wash=> washstate,drain=>drainstate,dry=>drystate,act=>sigBCD7_4);U4: count PORT MAP(a=>aout,clk=>bout,time1=>sig1,time2=>sig2,alarm=>alarmout,outtime1=>sigBCD7_2 ,outtime2=>sigBCD7_3);U5: BCD7 PORT MAP(b=>aout,a=>sigBCD7_1,q=>currentmodel);U6: BCD7 PORT MAP(b=>aout,a=>sigBCD7_2,q=>timedecade);U7: BCD7 PORT MAP(b=>aout,a=>sigBCD7_3,q=>timeunit);U8: BCD7 PORT MAP(b=>aout,a=>sigBCD7_4,q=>state);U9: BCD7 PORT MAP(b=>aout,a=>sigBCD7_5,q=>switchstate);U10: BCD7 PORT MAP(b=>aout,a=>sigBCD7_6,q=>spstate);END ARCHITECTURE behave;2)开关与模式选择模块LIBRARY IEEE ;USE IEEE.STD_LOGIC_1164.ALL;ENTITY model IS --开关与模式选择模块PORT(a,b: IN STD_LOGIC; --定义开关和模式选择按键的输入c: OUT STD_LOGIC; --洗衣机工作开关的输出e,time1,time2,y: OUT STD_LOGIC_VECTOR ( 3 DOWNTO 0 )); --定义所需时间/min,time1为十位,time2为各位END ENTITY model;ARCHITECTURE behave OF model ISBEGINPROCESS(a,b)BEGINIF(a='1')THEN --开关开启时执行CASE b ISWHEN '1' => y<="0001";time1<="0110";time2<="0000"; --模式1:60分钟WHEN '0' => y<="0010";time1<="0001";time2<="0000"; --模式2:10分钟END CASE;c<='1';e<="0001"; --开关开启且模式选择完毕,开始工作ELSE y<="0000";time1<="0000";time2<="0000";c<='0';e<="0000"; --开关关闭时不工作END IF;END PROCESS;END ARCHITECTURE behave;3)开始/暂停模块LIBRARY IEEE ;USE IEEE.STD_LOGIC_1164.ALL;ENTITY startpause IS --开始/暂停模块PORT(a,b,clk: IN STD_LOGIC;startorpause: OUT STD_LOGIC;e: OUT STD_LOGIC_VECTOR ( 3 DOWNTO 0 ));END ENTITY startpause;ARCHITECTURE behave OF startpause ISBEGINPROCESS(a,b)BEGINIF(a='1')THENCASE b ISWHEN '1' => startorpause<=clk;e<="0001";WHEN '0' => startorpause<='0';e<="0000";END CASE;ELSIF(a='0')THENstartorpause<='0';e<="0000";END IF;END PROCESS;END ARCHITECTURE behave;4)计数器与警报模块LIBRARY IEEE ;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL ;ENTITY count IS --计数器与警报模块PORT(clk,a: IN STD_LOGIC;time1,time2: IN STD_LOGIC_VECTOR(3 DOWNTO 0);alarm: OUT STD_LOGIC;outtime1,outtime2: OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END ENTITY count;ARCHITECTURE behave OF count ISSIGNAL intime11 : STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";SIGNAL intime22 : STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";SIGNAL intime3 : STD_LOGIC_VECTOR(1 DOWNTO 0):="01"; --intime3与intime4联系,实现变量的合理赋值SIGNAL intime4 : STD_LOGIC_VECTOR(1 DOWNTO 0):="00";BEGINPROCESS(time1) --此段的作用为当模式更改时,令变量重新赋值BEGINIF(time1/="0110")THENintime3<="10";ELSIF(time1/="0001")THENintime3<="11";ELSE intime3<="01";END IF;intime11<=time1;intime22<=time2;END PROCESS;PROCESS(clk,intime3,intime4)V ARIABLE intime1,intime2 : STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINIF(clk'EVENT AND clk='1')THENIF(a='1')THENIF(intime3/=intime4)THEN --第一个PROCESS运行时,变量被重新赋值intime4<=intime3;intime1:=intime11;intime2:=intime22;END IF;IF(intime2/="0000")THENintime2:=intime2-'1';alarm<='0';ELSIF(intime1/="0000")THENintime2:="1001";intime1:=intime1-'1';alarm<='0';ELSE alarm<='1';END IF;outtime1<=intime1;outtime2<=intime2;END IF;END IF;END PROCESS;END ARCHITECTURE behave;5)控制模块LIBRARY IEEE ;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL ;ENTITY control IS --控制模块PORT(a,b: IN STD_LOGIC;time1,time2: IN STD_LOGIC_VECTOR(3 DOWNTO 0);water,wash,drain,dry: OUT STD_LOGIC;act: BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0)); END ENTITY control;ARCHITECTURE behave OF control ISBEGINPROCESS(time1,time2)BEGINIF(a='1')THENIF(b='1')THENIF(time1&time2>"01010101")THENact<="0001"; --注水ELSIF(time1&time2>"01000000")THENact<="0010"; --洗涤ELSIF(time1&time2>"00110101")THENact<="0011"; --排水ELSIF(time1&time2>"00110000")THENact<="0001"; --注水ELSIF(time1&time2>"00010101")THENact<="0010"; --洗涤ELSIF(time1&time2>"00010000")THENact<="0011"; --排水ELSIF(time1&time2>"00000000")THENact<="0100"; --脱水ELSE act<="0000";END IF;ELSE act<="0000";END IF;ELSE act<="0000";END IF;CASE act ISWHEN "0001" => water<='1';wash<='0';drain<='0';dry<='0';WHEN "0010" => water<='0';wash<='1';drain<='0';dry<='0';WHEN "0011" => water<='0';wash<='0';drain<='1';dry<='0';WHEN "0100" => water<='0';wash<='0';drain<='0';dry<='1';WHEN OTHERS => water<='0';wash<='0';drain<='0';dry<='0';END CASE;END PROCESS;END ARCHITECTURE behave;6)译码器与数码管显示模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY BCD7 IS --译码器与数码管显示模块PORT(b: IN STD_LOGIC;a: IN STD_LOGIC_VECTOR(3 DOWNTO 0); --数据输入q : OUT STD_LOGIC_VECTOR(0 TO 6) ); --7段输出END BCD7;ARCHITECTURE behav OF BCD7 ISBEGINPROCESS (a)BEGINIF(b='1')THENCASE a(3 DOWNTO 0) IS -- BCD 7段译码表WHEN "0000" => q<="1111110"; WHEN "0001" => q<="0110000";WHEN "0010" => q<="1101101"; WHEN "0011" => q<="1111001";WHEN "0100" => q<="0110011"; WHEN "0101" => q<="1011011";WHEN "0110" => q<="1011111"; WHEN "0111" => q<="1110000";WHEN "1000" => q<="1111111"; WHEN "1001" => q<="1111011";WHEN OTHERS => q<="0000000";END CASE;ELSE q<="1111110";END IF;END PROCESS;END behav;三、仿真结果及分析首先对每个模块进行仿真:1)开关与模式选择模块1、仿真结果表明,只有a为1时,输出变化。