《洗衣机控制器.doc》由会员分享,可在线阅读,更多相关《洗衣机控制器.doc(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流洗衣机控制器.精品文档. 洗衣机控制器院系:通信工程指导老师:孙丹丹老师姓名:高扬班级:07111班班内序号:25号学号:070336摘要:本实验在Quartus软件环境下,利用实验室集成芯片,使用VHDL语言编写程序实现模拟一个洗衣机控制系统的基本功能。整个系统的设计过程中,采用了up _to_ down的设计思想,完成了洗衣机的开始/暂停,洗涤、漂洗、脱水、漂洗和脱水、洗涤、漂洗和脱水一次完成的模式选择,各项模式下时间的倒计时显示,完成指示灯亮灭显示报警,在各状态中指示灯提示等功能。总体来说基本上完成了洗衣机控制器的基本功能。才用分块设计
2、思想,各主要模块中,分频模块,获得低频时钟供显示模块使用,控制模块控制显示模块以及时间倒计时模块,后两个模块进行状态和时间的显示,并通过下载到开发板上验证了程序的正确性,达到了实验的要求。关键词:洗衣机 模式 VHDL 分块 功能一 设计课题实验目的及任务要求:(1)实验目的:1. 熟练掌握 VHDL 语言和QuartusII 软件的使用;2. 理解状态机的工作原理和设计方法;3. 掌握利用 EDA 工具进行自顶向下的电子系统设计方法;(2)基本任务:1. 洗衣机的工作步骤为洗衣、漂洗和脱水三个过程,工作时间分别为:洗衣 20 秒,漂洗25 秒,脱水15 秒;2. 用一个按键实现洗衣程序的手动
3、选择:A、单洗涤;B、单漂洗;C、单脱水;D、漂洗和脱水;E、洗涤、漂洗和脱水全过程;3. 用显示器件显示洗衣机的工作状态(洗衣、漂洗和脱水),并倒计时显示每个状态的工作时间,全部过程结束后,应提示使用者;4. 用一个按键实现暂停洗衣和继续洗衣的控制,暂停后继续洗衣应回到暂停之前保留的状态;(3)提高要求:1. 三个过程的时间有多个选项供使用者选择。2. 可以预约洗衣时间。3. 自拟其它功能:二 系统设计:(1)设计思路:根据实验的要求,其中第一项明确要求了预设时间,第二项要求了不同的洗衣组合,第三项是对状态进行显示,而最后一项则是对控制进行了要求,开始和暂停的状态可以看出,这些部分相互作用,
4、共同组成了全自动洗衣的基本功能。开始、暂停键控制着整个控制部分和显示部分,而控制部分又将洗衣的状态不同以及倒计时时间的不同反映到了状态显示和时间显示部分。 故此可将整个设计过程中,分为按键模块、显示模块、分频模块、报警模块和控制模块组成。(1)按键模块由防抖模块和按键信号产生模块构成:防抖模块用来增加按键的灵活性和有效性;按键控制信号产生模块是通过按键来产生模式选择信号、各模式时间选择信号和开始/暂停信号,形成控制模块需要的各种控制信号。(2)显示模块由时间显示设置模块、数码管显示模块和选通信号模块以及指示灯构成:其中时间设置模块用来完成时间显示个位和十位信号的设计;数码管显示模块用用来完成模
5、式选择选项的显示数字、模式时间选择选项的显示数字和倒计时时间的显示数字的信号设计;选通信号用来实现六个七段数码管的同时显示的设计;而指示灯用来完成对各种状态的指示的设计。(3)分频模块由100分频模块、10分频模块和1000分频模块构成的,通过对实验室芯片的系统时钟进行分频为其他模块提供适当的时钟信号。(4)控制模块是整个系统的中心部分,是状态机设计部分。在该模块实现了洗衣机各种状态的设计。此部分的设计思路将在本单元的第二部分介绍。(5)报警模块是对于当洗衣机每种状态完成时的报警指示灯亮起起提示作用的设计。(2)总体框图:按键防抖模块模式选择洗涤时间选择漂洗时间选择脱水时间选择按键控制信号产生
6、模块10分频模块时钟1MHZ100分频模块1000分频模块100分频模块洗衣机控制模块时间显示信号报警灯提示信号状态灯指示信号状态灯报警模块指示灯时间显示设置模块数码管显示模块选通信号模块数码管显示(3)状态转移图:PRETIME=0预约时间状态开始PRESET=1洗衣状态MODE/=0等待状态START=1PAUSE=1START=1PAUSE=1正常倒计时PAUSE=0倒计时PAUSE=0PAUSE=1PAUSE=1001 010 100 011 101 110 111PRESTE=0 & MODE=0TIME=0报警信号三 分块设计程序及仿真分析1.分频模块 分频程序主要由3个程序来实现
7、,利用分频的思想,从1MHz经过分频模块,得到1Hz,100Hz,1000Hz的时钟信号,分别用于控制模块,防抖模块,和显示模块的选通信号模块。其设计框图如下所示:1MHZ100分频模块1000分频模块1000分频模块10分频模块其程序和仿真如下: (1)100分频(divclk100)程序: library ieee;use ieee.std_logic_1164.all;entity divclk100 isport( clk : in std_logic;-输入时钟信号1Mclkout : out std_logic);-分频后的时钟信号0.01Mend divclk100;archit
8、ecture behave of divclk100 issignal clk1 : std_logic; beginprocess(clk)variable t : integer range 0 to 49;beginif(clkevent and clk=1)thenif(t=24)thent := 0;clk1 = not clk1;-时钟信号翻转else t := t+1;end if;end if;clkout = clk1;-时钟信号不变end process;end;仿真:在仿真图中,clk为输入的时钟信号,clkout为分频后输出的信号,由图可知clkout的频率为clk频率
9、的100分之一。(2)1000分频模块(divclk1000)程序:library ieee;use ieee.std_logic_1164.all;entity divclk1000 isport( clk : in std_logic; -输入时钟信号clkout : out std_logic); -分频后的时钟信号end divclk1000;architecture behave of divclk1000 issignal clk1 : std_logic; beginprocess(clk)variable t : integer range 0 to 499;beginif(c
10、lkevent and clk=1)thenif(t=499)thent := 0;clk1 = not clk1; -时钟信号翻转else t := t+1;end if;end if;clkout = clk1; -时钟信号不变end process;end;仿真:在仿真图中,clk为输入的时钟信号,clkout为分频后输出的信号,由图可知clkout的频率为clk频率的千分之一。 (3)10分频模块(divclk10) 程序:library ieee;use ieee.std_logic_1164.all;entity divclk10 isport( clk : in std_logi
11、c; -输入时钟信号clkout : out std_logic); -分频后的时钟信号end divclk10;architecture behave of divclk10 issignal clk1 : std_logic; beginprocess(clk)variable t : integer range 0 to 4;beginif(clkevent and clk=1)thenif(t=4)thent := 0;clk1 = not clk1; -时钟信号翻转else t := t+1;end if;end if;clkout = clk1; -时钟信号不变end proces
12、s;end;仿真: 在仿真图中,clk为输入的时钟信号,clkout为分频后输出的信号,由图可知clkout的频率为clk频率的十分之一。2按键模块 在起初设计的时候原想用拨码开关来实现各种控制信号的控制,若全用拨码开关,实验板上显然不够,而且太多又不容易记忆,思考了一下,采用了每种控制信号采用一个按键通过循环计数的方法来时实现按键的控制。这一模块由2个程序构成,一个是防抖程序,一个是各种控制信号产生得到程序。该模块产生的控制信号将输入控制模块,完成控制输入。(1) 防抖程序(keyin)本程序是通过计数2个按键时钟信号来确定按键的时间。按照一般按键时间的长短,将时钟信号设置为100Hz,频率
13、太高或太低都会带来灵敏度的问题。程序:library ieee;use ieee.std_logic_1164.all;entity keyin isport(clk:in std_logic;keyin:in std_logic;keyout:out std_logicend keyin;architecture behave of keyin isbeginprocess(clk,keyin)variable t:integer range 0 to 1;-定义变量来计数时钟个数beginif(clkevent and clk=1)thenif(keyin=1)thenif(t=1)the
14、nkeyout=1;t:=0;elset:=t+1;end if;elsekeyout=0;end if;-计数两个按键时钟周期来确定按键的时间end if;end process;end;仿真: 仿真图中,clk为用来计数的时钟信号,keyin为按键,clkout为按键后产生的按键信号。如图在时钟信号有效的情况下,每两个按键时钟产生一个输出的按键信号。达到了程序设计预期的结果。(2) 按键控制信号产生程序(key)模式选择按键、开始/暂停按键、洗涤时间选择按键、漂洗时间选择按键、脱水时间选择按键均采用一个按键,利用循环计数的方法来产生各种控制信号。不仅有利于节约按键,而且易于记忆。由于五种控
15、制信号产生的设计本质相同,形式相似,故采用相似的程序代码,利用多进程在一个程序中实现。 程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity key isport modekey,startkey,pretimekey_xd,pretimekey_px,pretimekey_ts: in std_logic;modeout:out std_logic_vector(2 downto 0);pretimeout_xd,pretimeout_px,pretimeout_ts :out s
16、td_logic_vector(2 downto 0);s_p_out:out std_logicend key ;architecture behave of key isbegin p1: process(modekey)模式选择控制信号产生程序 variable cout1:integer range 0 to 4;-定义变量完成变量0到4的循环计数 begin if rising_edge(modekey)then if cout1modeoutmodeoutmodeoutmodeoutmodeoutmodeout=100; end case; end process ; p2: pr
17、ocess(pretimekey_xd) 洗涤时间选择控制信号产生程序 variable cout3:integer range 0 to 2; begin if rising_edge(pretimekey_xd)then if cout3pretimeout_xdpretimeout_xdpretimeout_xdpretimeout_xd=100; end case; end process ; p3: process(pretimekey_px) 漂洗时间选择控制信号产生程序 variable cout3:integer range 0 to 2; begin if rising_ed
18、ge(pretimekey_px)then if cout3pretimeout_pxpretimeout_pxpretimeout_pxpretimeout_px=100; end case; end process ; p4: process(pretimekey_ts) 脱水时间选择控制信号产生程序 variable cout3:integer range 0 to 2; begin if rising_edge(pretimekey_ts)then if cout3pretimeout_tspretimeout_tspretimeout_tspretimeout_ts=100; end
19、 case; end process ; p5: process(startkey) 开始/暂停选择控制信号产生程序 variable cout2:integer range 0 to 1; begin if rising_edge(startkey)then cout2:=cout2+1; end if; if(cout2=1)then s_p_out=1;-开始 else s_p_out010001011111100,010, 100010001100, 100010001100, 100010001100的规律变化,符合设计的要求。3.显示模块 (1)时间显示设置模块 此模块直接以控制模
20、块输出的时间相连,由于倒计时时间是两位数字,必须用两个数码管来显示,在本程序中用将十位和各位分别显示的方法来实现时间输出显示的设计。同时将每位上的十进制转换成二进制,以方便于其他程序共同调用相同的数码管显示程序来完成倒计时时间的现实程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity timeshowset isport clk: in std_logic;timesout:in integer range 0 to 30;shi,ge:out std_logic_vector(3
21、downto 0) end timeshowset ;architecture behave of timeshowset isbegin process(clk) variable g: integer range 0 to 9;-定义变量,用于标记计数的个位 variable s: integer range 0 to 3 ;-定义变量,用于标记计数的十位 begin if(clkevent and clk=1)then if timesout10 then 当计数=10 and timesout20 then-当10计数=20 and timesout30 then-当20计数gegeg
22、egegegegegegegeshishishishioutsegoutsegoutsegoutsegoutsegoutsegoutsegoutsegoutsegoutsegoutsegoutsegoutsegoutsegoutsegoutsegoutsegoutsegoutsegoutsegoutsegsid=111011; disoutsid=111101; disoutsid=111110; disoutsid=011111; disoutsid=101111; disoutsid=110111; disoutsid=111011; disout=modeout; end case; e
23、nd process;end behave;仿真略。4.报警模块程序(tell.Vhd)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity tell isport clk,tellin: in std_logic;tellout:out std_logic end tell;architecture behave of tell isbegin process(clk) begin if tellin=1 then输入的信号时1时报警灯亮 tellout=clk; else tellou
24、t=0; 输入的信号时0时报警灯不亮 end if; end process;end behave;5.控制模块 在洗衣机控制部分的设计中,洗衣机共有5个状态:s0:准备状态,s1:洗涤状态,s2:漂洗状态,s3:脱水状态,s4:报警状态;三种动作:洗涤,漂洗,脱水。所有动作的控制遵循着一个模式:计数,判断暂停,判断计数完毕,报警灯亮。所以设计起来很多是重复的。具体的设计过程如下:开始时,判断是否洗涤,如果不是再判断是否漂洗,如果再不是就再判断是否脱水;洗衣完毕,进一步判断是否漂洗,漂洗完毕再判断是否脱水;如果技术完毕且没有其他动作,则报警灯亮。整个过程中分别用一个按键来控制模式的选择,开始/
25、暂停,各种模式下时间的选择。其状态转移图如下所示: S_f & not m2 & not m1 & m0S2S3S1S0S4S_f & not m2 & m1 J_f & m1 J_f & m0 Not s_p_out J_f Not s_p_out J_f & not m1 Not s_p_out J_f & not m0s_p_outS_f & m2 其中,s_f开始标志 ,j_f技术结束标志 ,2洗涤 m1漂洗,m0脱水控制器流程图:等待命令开始?启动模式?洗衣否?Mode2=1Mode1=1NoMode0=1漂洗否?No脱水否?NoYesNo & 没有动作漂洗择时计数,灯亮脱水择时计数
26、,灯亮YesYesYes暂停NoNo计完暂停NoNoYes计完洗衣择时计数,灯亮计数完?暂停YesNoNo暂停计数暂停计数暂停计数YesYesYes开始开始开始NoNoNoYesYesYes停止,响铃按开始NoNo,&有动作YesYes程序(xyj.vhd):library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity xyj isport clk,s_p_out: in std_logic;-clk为1hz,s_p_out为开始/暂停信号 modeout :in std_logic_vector
27、(2 downto 0);-模式输出信号 times:out integer range 0 to 25;-倒计时时间信号 pretimeout_xd,pretimeout_px,pretimeout_ts:in std_logic_vector(2 downto 0);-各种模式时间选择输入信号 light :out std_logic_vector(2 downto 0);-指示灯显示信号 tell:out std_logic 报警信号end xyj ;architecture behave of xyj i type states is(s0,s1,s2,s3,s4);-5种状态 signal state :states;