基于VHDL的洗衣机控制器设计说明Word格式.docx
《基于VHDL的洗衣机控制器设计说明Word格式.docx》由会员分享,可在线阅读,更多相关《基于VHDL的洗衣机控制器设计说明Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
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;
ENTITYxyjIS
PORT(switch,modelselect,clkin,sorp:
INSTD_LOGIC;
--电源开关、模式选择、时钟、开始/暂停按键状态的输入
waterstate,washstate,drainstate,drystate,alarmout:
OUTSTD_LOGIC;
--注水程序、洗涤程序、排水程序、脱水程序、警报状态的输出
switchstate,spstate,state,currentmodel,timedecade,timeunit:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
--工作状态、工作模式、剩余时间的输出
ENDENTITYxyj;
ARCHITECTUREbehaveOFxyjIS
COMPONENTmodel--调用开关与模式选择模块
PORT(a,b:
c:
e,time1,time2,y:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDCOMPONENTmodel;
COMPONENTcount--调用计数器与警报模块
PORT(clk,a:
time1,time2:
INSTD_LOGIC_VECTOR(3DOWNTO0);
alarm:
outtime1,outtime2:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDCOMPONENTcount;
COMPONENTBCD7--调用译码器与数码管显示模块
PORT(b:
a:
q:
OUTSTD_LOGIC_VECTOR(0TO6));
ENDCOMPONENTBCD7;
COMPONENTstartpause--调用开始/暂停模块
PORT(a,b,clk:
startorpause:
e:
ENDCOMPONENTstartpause;
COMPONENTcontrol--调用控制模块
water,wash,drain,dry:
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;
BEGIN
U1:
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=>
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=>
sig2,alarm=>
alarmout,outtime1=>
sigBCD7_2,outtime2=>
sigBCD7_3);
U5:
BCD7PORTMAP(b=>
aout,a=>
sigBCD7_1,q=>
currentmodel);
U6:
sigBCD7_2,q=>
timedecade);
U7:
sigBCD7_3,q=>
timeunit);
U8:
sigBCD7_4,q=>
state);
U9:
sigBCD7_5,q=>
switchstate);
U10:
sigBCD7_6,q=>
spstate);
ENDARCHITECTUREbehave;
2)开关与模式选择模块
ENTITYmodelIS--开关与模式选择模块
--定义开关和模式选择按键的输入
--洗衣机工作开关的输出
--定义所需时间/min,time1为十位,time2为各位
ENDENTITYmodel;
ARCHITECTUREbehaveOFmodelIS
PROCESS(a,b)
BEGIN
IF(a='
1'
)THEN--开关开启时执行
CASEbIS
WHEN'
=>
y<
="
0001"
;
time1<
0110"
time2<
0000"
--模式1:
60分钟
0'
0010"
--模式2:
10分钟
ENDCASE;
c<
='
e<
--开关开启且模式选择完毕,开始工作
ELSEy<
c<
--开关关闭时不工作
ENDIF;
ENDPROCESS;
3)开始/暂停模块
ENTITYstartpauseIS--开始/暂停模块
ENDENTITYstartpause;
ARCHITECTUREbehaveOFstartpauseIS
)THEN
startorpause<
=clk;
ELSIF(a='
startorpause<
ENDIF;
4)计数器与警报模块
ENTITYcountIS--计数器与警报模块
ENDENTITYcount;
ARCHITECTUREbehaveOFcountIS
SIGNALintime11:
STD_LOGIC_VECTOR(3DOWNTO0):
SIGNALintime22:
SIGNALintime3:
STD_LOGIC_VECTOR(1DOWNTO0):
01"
--intime3与intime4联系,实现变量的合理赋值
SIGNALintime4:
00"
PROCESS(time1)--此段的作用为当模式更改时,令变量重新赋值
IF(time1/="
intime3<
10"
ELSIF(time1/="
intime3<
11"
ELSEintime3<
ENDIF;
intime11<
=time1;
intime22<
=time2;
ENDPROCESS;
PROCESS(clk,intime3,intime4)
VARIABLEintime1,intime2:
STD_LOGIC_VECTOR(3DOWNTO0);
IF(clk'
EVENTANDclk='
IF(a='
IF(intime3/=intime4)THEN--第一个PROCESS运行时,变量被重新赋值
intime4<
=intime3;
intime1:
=intime11;
intime2:
=intime22;
IF(intime2/="
)THEN
=intime2-'
alarm<
ELSIF(intime1/="
1001"
=intime1-'
ELSEalarm<
outtime1<
=intime1;
outtime2<
=intime2;
5)控制模块
ENTITYcontrolIS--控制模块
ENDENTITYcontrol;
ARCHITECTUREbehaveOFcontrolIS
PROCESS(time1,time2)
IF(a='
IF(b='
IF(time1&
time2>
"
01010101"
act<
--注水
ELSIF(time1&
01000000"
act<
--洗涤
00110101"
0011"
--排水
00110000"
00010101"
00010000"
00000000"
0100"
--脱水
ELSEact<
ELSEact<
CASEactIS
WHEN"
water<
wash<
drain<
dry<
WHEN"
WHENOTHERS=>
ENDPROCESS;
ENDARCHITECTUREbehave;
6)译码器与数码管显示模块
LIBRARYIEEE;
ENTITYBCD7IS--译码器与数码管显示模块
PORT(b:
a:
--数据输入
--7段输出
ENDBCD7;
ARCHITECTUREbehavOFBCD7IS
PROCESS(a)
BEGIN
IF(b='
CASEa(3DOWNTO0)IS--BCD7段译码表
q<
1111110"
0110000"
1101101"
1111001"
0110011"
0101"
1011011"
1011111"
0111"
1110000"
1000"
1111111"
1111011"
WHENOTHERS=>
0000000"
ENDCASE;
ELSEq<
ENDbehav;
三、仿真结果及分析
首先对每个模块进行仿真:
1、仿真结果表明,只有a为1时,输出变化。
但a为1的一瞬间便已有了模式,这不符合洗衣机的操作流程,所以在之后的模块中写入了控制其输出变化的程序。
2、仿真考虑多种情况,如:
a变换时、a为0且b变化时等,输出皆符合所需。
1、仿真结果表明,只有a为1时,输出变化,产生受b控制的脉冲信号。
模块运行完全符合所需,输出了正确的剩余时间与alarm。
1、对模块在开关、开始/暂停及剩余时间变化下控制的仿真。
2、仿真结果表明,暂停时(b为0),洗衣进程停止,开始时,进程继续;
3、仿真模拟了“暂停-切换模式-开始”的进程,输出符合所需。
1、对模块在开关及输入控制下的输出仿真。
2、仿真模拟了中途开关关闭与开启状态下数码管输出变化。
6)主程序
1、对洗衣机在开关、开始/暂停及模式选择控制下的工作进程进行仿真。
3、剩余时间的个位数(timeunit)和工作模式(state)过于密集,所以展开。
3、仿真结果表明,洗衣机在各输入控制下,可以很好地改变自己的工作状态。
四、心得体会
决定做洗衣机控制器后,我以宿舍楼内的洗衣机为模板编写了这套程序。
为了便于纠错,我决定分别编写每个元器件,当各个元器件的程序都正确后,再将它们整合在一起。
事实证明,每个元器件的编写途中都会出现各种各样的问题,这种方式可以最快速地发现错误并改正。
整个程序最大的问题出现在计数器与警报模块中。
当时,无论我怎样调试,输出的剩余时间都是0。
我在这个错误的纠正上花费了极大的精力,最后,我加入了几个输出来将程序内部变化表示出来,于是我发现了问题所在:
信号的初值只能为一个定值而不能为一个输入。
但另一个问题接踵而来:
我需要在输入转换时更改剩余时间为模式时间,但当输入不变时,怎样才能在process不停循环而变量只能在process内定义的情况下不重新给剩余时间赋值?
在咨询舍友后,我使用了intime3和intime4并增加了一个process来判断输入是否改变,问题得到了完美解决。
当各个元器件编写成功后,我将它们整合在一起,仿真出了初步结果。
但随后我发现了诸多问题,比如器件不受开关调控,并且洗衣机没有开始/暂停。
于是,我编写了开始/暂停模块,并更改各个模块使它们能够得到正确的控制。
本次洗衣机控制器的编写,使我对VHDL语言的理解进一步加深,并且在实践操作上的能力大大提高。