数字系统设计与硬件描述语言基于VHDL的洗衣机控制器设计Word格式.docx

上传人:b****7 文档编号:22775134 上传时间:2023-02-05 格式:DOCX 页数:19 大小:281.70KB
下载 相关 举报
数字系统设计与硬件描述语言基于VHDL的洗衣机控制器设计Word格式.docx_第1页
第1页 / 共19页
数字系统设计与硬件描述语言基于VHDL的洗衣机控制器设计Word格式.docx_第2页
第2页 / 共19页
数字系统设计与硬件描述语言基于VHDL的洗衣机控制器设计Word格式.docx_第3页
第3页 / 共19页
数字系统设计与硬件描述语言基于VHDL的洗衣机控制器设计Word格式.docx_第4页
第4页 / 共19页
数字系统设计与硬件描述语言基于VHDL的洗衣机控制器设计Word格式.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

数字系统设计与硬件描述语言基于VHDL的洗衣机控制器设计Word格式.docx

《数字系统设计与硬件描述语言基于VHDL的洗衣机控制器设计Word格式.docx》由会员分享,可在线阅读,更多相关《数字系统设计与硬件描述语言基于VHDL的洗衣机控制器设计Word格式.docx(19页珍藏版)》请在冰豆网上搜索。

数字系统设计与硬件描述语言基于VHDL的洗衣机控制器设计Word格式.docx

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语言的理解进一步加深,并且在实践操作上的能力大大提高。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1