《数字系统设计与硬件描述语言-基于VHDL的洗衣机控制器设计.doc》由会员分享,可在线阅读,更多相关《数字系统设计与硬件描述语言-基于VHDL的洗衣机控制器设计.doc(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、数字系统设计与硬件描述语言期末考试作业题目: 洗衣机控制器的设计 学院: 电子信息工程学院 专业: 物联网工程 学号: 3014204328 姓名: 刘涵凯 2016-12-10一、 选题设计描述1. 功能介绍洗衣机控制器,能够实现开始与暂停、注水,洗涤、排水、脱水和警报提醒的功能,并且可以随时更改洗衣模式。洗衣机提供两种模式:模式1:注水-洗涤-排水-注水-洗涤-排水-脱水;模式2:脱水。洗衣模式决定洗衣时间。默认模式为模式2。洗衣机界面如下图所示:运转方式如下图所示:2. 算法简介总程序描述:总程序通过调用5种模块,在洗衣机控制器输入变化时,立刻转换模式并产生对应输出。当开关关闭时,所有输
2、出为0;暂停时,除显示开关状态的输出外,所有输出为0。开关开启后,设置洗衣模式,之后按下“开始”即可开始工作。在洗衣机控制器输入变化时,立刻转换模式并产生对应输出。电子元器件模型如下图所示:switch为开关信号,modelselect为开关选择信号,clkin为系统时序脉冲信号,sorp为开始/暂停信号。waterstate为注水程序的工作状态,washrstate为洗涤程序的工作状态,drainstate为排水程序的工作状态,drystate为脱水程序的工作状态。alarmout为警报提醒的状态。switchstate为数码管显示的开关的状态(0/1),spstate为数码管显示的开始/暂
3、停的状态(0/1), state为数码管显示的洗衣机工作状态(04),currentmodel为数码管显示的当前模式(02),timedecade为数码管显示的剩余时间的十位,timeunit为数码管显示的剩余时间的个位。下面介绍各模块功能与算法:1)开关与模式选择模块a接收开关信息,b接收模式选择信息。c输出总电路的开关信息(开启洗衣机并且设置完毕电路后,即可准备工作,等待“开始”信号)。e为开关信息,将输入到数码管中显示。time1与time2分别代表洗衣时间的十位和个位,将输入到计数器与警报模块中。y为模式信息,将输入到码管中显示。2)开始/暂停模块a接收开关信息,b接收开始/暂停信息,
4、clk接收系统时序脉冲信号。startorpause输出受开始/暂停信息调控的系统时序脉冲信号。y为开始/暂停信息,将输入到码管中显示。3)计数器与警报模块clk接收受开始/暂停信息调控的系统时序脉冲信号,a接收开关信息,time1和time2分别接收洗衣时间的十位和个位。alarm输出警报信息;outtime1和outtime2分别为剩余时间的十位和个位,将输入到数码管中显示,同时将输入到控制模块中。在脉冲信号的控制下,剩余时间逐渐减少,当剩余时间为0时,停止减小,并开启警报。4)控制模块a接收开关信息,b接收开始/暂停信息,time1和time2分别接收剩余时间的十位和个位。water、w
5、ash、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_UNSIGNE
6、D.ALL ;ENTITY xyj IS PORT(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); -工作状态、工作模式、剩余
7、时间的输出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
8、: 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; start
9、orpause: 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; SIGNAL sig1,
10、sig2,sigBCD7_1,sigBCD7_2,sigBCD7_3,sigBCD7_4,sigBCD7_5,sigBCD7_6:STD_LOGIC_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=sigBCD7_5); U2: startpause PORT MAP(a=aout,b=sorp,clk=clkin,startorpause=bout,e=sigBCD7_
11、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=
12、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)开关与模式选择模
13、块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 ISBEGIN PROCESS(a,b) BEGIN IF(a
14、=1)THEN -开关开启时执行 CASE b IS WHEN 1 = y=0001;time1=0110;time2 y=0010;time1=0001;time2=0000; -模式2:10分钟 END CASE; c=1;e=0001; -开关开启且模式选择完毕,开始工作 ELSE y=0000;time1=0000;time2=0000; c=0;e startorpause=clk;e startorpause=0;e=0000; END CASE; ELSIF(a=0)THEN startorpause=0;e=0000; END IF; END PROCESS;END ARCHI
15、TECTURE 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;ARCHITECTUR
16、E 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) -此段的作用为当模式更改时,令变量重新赋值 BEG
17、IN IF(time1/=0110)THEN intime3=10;ELSIF(time1/=0001)THENintime3=11;ELSE intime3=01;END IF; intime11=time1;intime22=time2;END PROCESS; PROCESS(clk,intime3,intime4)VARIABLE intime1,intime2 : STD_LOGIC_VECTOR(3 DOWNTO 0); BEGINIF(clkEVENT AND clk=1)THENIF(a=1)THENIF(intime3/=intime4)THEN -第一个PROCESS运行时
18、,变量被重新赋值 intime4=intime3; intime1:=intime11; intime2:=intime22;END IF; IF(intime2/=0000)THEN intime2:=intime2-1; alarm=0; ELSIF(intime1/=0000)THEN intime2:=1001; intime1:=intime1-1; alarm=0; ELSE alarm=1; END IF;outtime1=intime1;outtime201010101)THEN act01000000)THENact00110101)THENact00110000)THENa
19、ct00010101)THENact00010000)THENact00000000)THENact=0100; -脱水ELSE act=0000; END IF; ELSE act=0000;END IF;ELSE act water=1;wash=0;drain=0;dry water=0;wash=1;drain=0;dry water=0;wash=0;drain=1;dry water=0;wash=0;drain=0;dry water=0;wash=0;drain=0;dry q q q q q q q q q q q=0000000; END CASE; ELSE q=1111
20、110; END IF; END PROCESS; END behav;三、 仿真结果及分析首先对每个模块进行仿真:1)开关与模式选择模块1、 仿真结果表明,只有a为1时,输出变化。但a为1的一瞬间便已有了模式,这不符合洗衣机的操作流程,所以在之后的模块中写入了控制其输出变化的程序。2、 仿真考虑多种情况,如:a变换时、a为0且b变化时等,输出皆符合所需。2)开始/暂停模块1、 仿真结果表明,只有a为1时,输出变化,产生受b控制的脉冲信号。2、 仿真考虑多种情况,如:a变换时、a为0且b变化时等,输出皆符合所需。3)计数器与警报模块模块运行完全符合所需,输出了正确的剩余时间与alarm。4)控
21、制模块1、对模块在开关、开始/暂停及剩余时间变化下控制的仿真。2、仿真结果表明,暂停时(b为0),洗衣进程停止,开始时,进程继续; 3、仿真模拟了“暂停-切换模式-开始”的进程,输出符合所需。5)译码器与数码管显示模块1、对模块在开关及输入控制下的输出仿真。2、仿真模拟了中途开关关闭与开启状态下数码管输出变化。6) 主程序1、对洗衣机在开关、开始/暂停及模式选择控制下的工作进程进行仿真。3、 剩余时间的个位数(timeunit)和工作模式(state)过于密集,所以展开。3、仿真结果表明,洗衣机在各输入控制下,可以很好地改变自己的工作状态。四、 心得体会决定做洗衣机控制器后,我以宿舍楼内的洗衣
22、机为模板编写了这套程序。为了便于纠错,我决定分别编写每个元器件,当各个元器件的程序都正确后,再将它们整合在一起。事实证明,每个元器件的编写途中都会出现各种各样的问题,这种方式可以最快速地发现错误并改正。整个程序最大的问题出现在计数器与警报模块中。当时,无论我怎样调试,输出的剩余时间都是0。我在这个错误的纠正上花费了极大的精力,最后,我加入了几个输出来将程序内部变化表示出来,于是我发现了问题所在:信号的初值只能为一个定值而不能为一个输入。但另一个问题接踵而来:我需要在输入转换时更改剩余时间为模式时间,但当输入不变时,怎样才能在process不停循环而变量只能在process内定义的情况下不重新给剩余时间赋值?在咨询舍友后,我使用了intime3和intime4并增加了一个process来判断输入是否改变,问题得到了完美解决。当各个元器件编写成功后,我将它们整合在一起,仿真出了初步结果。但随后我发现了诸多问题,比如器件不受开关调控,并且洗衣机没有开始/暂停。于是,我编写了开始/暂停模块,并更改各个模块使它们能够得到正确的控制。本次洗衣机控制器的编写,使我对VHDL语言的理解进一步加深,并且在实践操作上的能力大大提高。