数字系统设计与硬件描述语言期末考试作业题目:洗衣机控制器的设计学院:电子信息工程学院专业:物联网工程学号: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)主程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYxyjISPORT(switch,modelselect,clkin,sorp:INSTD_LOGIC;--电源开关、模式选择、时钟、开始/暂停按键状态的输入waterstate,washstate,drainstate,drystate,alarmout:OUTSTD_LOGIC;--注水程序、洗涤程序、排水程序、脱水程序、警报状态的输出switchstate,spstate,state,currentmodel,timedecade,timeunit:OUTSTD_LOGIC_VECTOR(6DOWNTO0));--工作状态、工作模式、剩余时间的输出ENDENTITYxyj;ARCHITECTUREbehaveOFxyjISCOMPONENTmodel--调用开关与模式选择模块PORT(a,b:INSTD_LOGIC;c:OUTSTD_LOGIC;e,time1,time2,y:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDCOMPONENTmodel;COMPONENTcount--调用计数器与警报模块PORT(clk,a:INSTD_LOGIC;time1,time2:INSTD_LOGIC_VECTOR(3DOWNTO0);alarm:OUTSTD_LOGIC;outtime1,outtime2:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDCOMPONENTcount;COMPONENTBCD7--调用译码器与数码管显示模块PORT(b:INSTD_LOGIC;a:INSTD_LOGIC_VECTOR(3DOWNTO0);q:OUTSTD_LOGIC_VECTOR(0TO6));ENDCOMPONENTBCD7;COMPONENTstartpause--调用开始/暂停模块PORT(a,b,clk:INSTD_LOGIC;startorpause:OUTSTD_LOGIC;e:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDCOMPONENTstartpause;COMPONENTcontrol--调用控制模块PORT(a,b:INSTD_LOGIC;time1,time2:INSTD_LOGIC_VECTOR(3DOWNTO0);water,wash,drain,dry:OUTSTD_LOGIC;act:BUFFERSTD_LOGIC_VECTOR(3DOWNTO0));ENDCOMPONENTcontrol;SIGNALsig1,sig2,sigBCD7_1,sigBCD7_2,sigBCD7_3,sigBCD7_4,sigBCD7_5,sigBCD7_6:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALaout,bout:STD_LOGIC;BEGINU1:modelPORTMAP(a=switch,b=modelselect,c=aout,y=sigBCD7_1,time1=sig1,time2=sig2,e=sigBCD7_5);U2:startpausePORTMAP(a=aout,b=sorp,clk=clkin,startorpause=bout,e=sigBCD7_6);U3:controlPORTMAP(a=aout,b=sorp,time1=sigBCD7_2,time2=sigBCD7_3,water=waterstate,wash=washstate,drain=drainstate,dry=drystate,act=sigBCD7_4);U4:countPORTMAP(a=aout,clk=bout,time1=sig1,time2=sig2,alarm=alarmout,outtime1=sigBCD7_2,outtime2=sigBCD7_3);U5:BCD7PORTMAP(b=aout,a=sigBCD7_1,q=currentmodel);U6:BCD7PORTMAP(b=aout,a=sigBCD7_2,q=timedecade);U7:BCD7PORTMAP(b=aout,a=sigBCD7_3,q=timeunit);U8:BCD7PORTMAP(b=aout,a=sigBCD7_4,q=state);U9:BCD7PORTMAP(b=aout,a=sigBCD7_5,q=switchstate);U10:BCD7PORTMAP(b=aout,a=sigBCD7_6,q=spstate);ENDARCHITECTUREbehave;2)开关与模式选择模块LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmodelIS--开关与模式选择模块PORT(a,b:INSTD_LOGIC;--定义开关和模式选择按键的输入c:OUTSTD_LOGIC;--洗衣机工作开关的输出e,time1,time2,y:OUTSTD_LOGIC_VECTOR(3DOWNTO0));--定义所需时间/min,time1为十位,time2为各位ENDENTITYmodel;ARCHITECTUREbehaveOFmodelISBEGINPROCESS(a,b)BEGINIF(a='1')THEN--开关开启时执行CASEbISWHEN'1'=y=0001;time1=0110;time2=0000;--模式1:60分钟WHEN'0'=y=0010;time1=0001;time2=0000;--模式2:10分钟ENDCASE;c='1';e=0001;--开关开启且模式选择完毕,开始工作ELSEy=0000;time1=0000;time2=0000;c='0';e=0000;--开关关闭时不工作ENDIF;ENDPROCESS;ENDARCHITECTUREbehave;3)开始/暂停模块LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYstartpauseIS--开始/暂停模块PORT(a,b,clk:INSTD_LOGIC;startorpause:OUTSTD_LOGIC;e:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDENTITYstartpause;ARCHITECTUREbehaveOFstartpauseISBEGINPROCESS(a,b)BEGINIF(a='1')THENCASEbISWHEN'1'=startorpause=clk;e=0001;WHEN'0'=startorpause='0';e=0000;ENDCASE;ELSIF(a='0')THENstartorpause='0';e=0000;ENDIF;ENDPROCESS;ENDARCHITECTUREbehave;4)计数器与警报模块LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYcountIS--计数器与警报模块PORT(clk,a:INSTD_LOGIC;time1,time2:INSTD_LOGIC_VECTOR(3DOWNTO0);alarm:OUTSTD_LOGIC;outtime1,outtime2:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDENTITYcount;ARCHITECTUREbehaveOFcountISSIGNALintime11:STD_LOGIC_VECTOR(3DOWNTO0):=0000;SIGNALintime22:STD_LOGIC_VECTOR(3DOWNTO0):=0000;SIGNALintime3:STD_LOGIC_VECTOR(1DOWNTO0):=01;--intime3与intime4联系,实现变量的合理赋值SIGNALintime4:STD_LOGIC_VECTOR(1DOWNTO0):=00;BEGINPROCESS(time1)--此段的作用为当模式更改时,令变量重新赋值BEGINIF(time1/=0110)THENintime3=10;ELSIF(tim