智能洗衣机.docx
《智能洗衣机.docx》由会员分享,可在线阅读,更多相关《智能洗衣机.docx(18页珍藏版)》请在冰豆网上搜索。
智能洗衣机
电子技术基础课程设计
——智能洗衣机控制器
院系:
控制科学与工程系
专业:
自动化
班级:
0807班
姓名:
李公兵
学号:
u2000813726
指导教师:
龚军
一、课程设计名称
智能洗衣机控制器
二、设计内容与要求
1、设计一个智能洗衣机控制器,能够实现洗衣,漂洗和脱水的功能。
2、要求能够使用按键模拟对洗衣机的控制,能够设置工作模式,为了便于观察,将洗衣机设定的工作模式(1~5)和整个过程所剩的工作时间用数码管显示出来(时间分辨率为1分钟),能够将洗衣机当前所处的状态(注水,洗衣,排水,甩干)用发光管或者数码管显示出来。
【模式1】:
洗衣模式--强力洗(洗衣30分钟)
【模式2】:
洗衣模式--普通洗(洗衣20分钟)
【模式3】:
洗衣模式--轻柔洗(洗衣10分钟)
【模式4】:
漂洗模式
【模式5】:
甩干模式
注:
在以上5个模式中,每次注水1分钟,漂洗5分钟,排水1分钟,甩干1分钟,模式1~3的洗衣时间如上所示,具体的洗衣步骤如下:
【模式1~3】:
注水->洗衣->排水->甩干->注水->漂洗->排水->甩干
->注水->漂洗->排水->甩干。
【模式4】:
注水->漂洗->排水->甩干->注水->漂洗->排水->甩干。
【模式5】:
甩干。
【要求】:
实现逻辑控制过程,可以选择性的加入注水口无水报警等人性化的状态提示,操作完毕使用蜂鸣器鸣叫两秒提示。
3、画出洗衣机控制器的状态机,写出状态编码方案。
4、用Verilog语言对设计进行描述,设计一个测试方案,并能够下载到实验板上调试成功。
5、写出设计性实验报告,并打印各层次的源文件和仿真波形,然后作简要说明。
并谈谈此次实验的收获、感想及建议
3、分析设计
1、五个模式:
模式1、模式2、模式3、模式4、模式5
四个状态:
注水、洗衣(漂洗)、排水、甩干
2、端口描述:
输入端口:
Cp:
输入50Mhz的频率信号
Cr:
清零信号
Model1—5:
模式选择
输出端口:
Export:
显示模式
Light:
洗衣完成显示灯
3、状态流程图
4、模块设计
1、分频模块
因为出入的是频率为50Mhz的方波,要变成频率为1hz的方波,必须对其进行分频。
代码如下:
modulefenpin(in,out);
inputin;
outputout;
reg[24:
0]cnt;
regout;
always@(posedgein)
begin
if(cnt>='d249999)
begin
out<=~out;
cnt<=0;
end
else
cnt<=cnt+1;
end
Endmodule
波形仿真如下:
(由于50M是一个很大的数字,故仿真时看不到输出波形的跳变)
2、译码模块
时间需要用数码管显示出来,故必须对由七段显示器组成的数码管进行译码。
代码如下:
moduleyima(out,in);
input[3:
0]in;
output[6:
0]out;
reg[6:
0]out;
always@(in)
begin
case(in)
4'h0:
out=7'b1000000;
4'h1:
out=7'b1111001;
4'h2:
out=7'b0100100;
4'h3:
out=7'b0110000;
4'h4:
out=7'b0011001;
4'h5:
out=7'b0010010;
4'h6:
out=7'b0000010;
4'h7:
out=7'b1111000;
4'h8:
out=7'b0000000;
4'h9:
out=7'b0011000;
endcase
end
Endmodule
仿真波形如下(假设输入为十进制5)
说明:
输入为0101(即十进制数5),输出的为十进制数18(二进制0010010,即第二位和第五位为1),显示在数码管上的恰好是十进制数5。
3、计数模块(60进制减计数器)
程序片段:
begin
if(Second[3:
0]!
=0)
Second[3:
0]<=Second[3:
0]-4'd1;
elseif(Second[3:
0]==0&Second[7:
4]!
=0)
begin
Second[3:
0]<=4'd9;
Second[7:
4]<=Second[7:
4]-4'd1;
end
elseif(Second[7:
4]==0&Second[3:
0]==0&Minute[3:
0]!
=0)
begin
Second[3:
0]<=4'd9;
Second[7:
4]<=4'd5;
Minute[3:
0]<=Minute[3:
0]-4'd1;
end
elseif(Second[7:
4]==0&Second[3:
0]==0&Minute[3:
0]==0&Minute[7:
4]!
=0)
begin
Second[3:
0]<=4'd9;
Second[7:
4]<=4'd5;
Minute[3:
0]<=4'd9;
Minute[7:
4]<=Minute[7:
4]-4'd1;
end
End
5、各个模式的仿真
1、模式1的仿真
2、模式2的仿真
3、模式3的仿真
4、模式4的仿真
5、模式5的仿真
六、总结和感想
本次课程设计我做的是智能洗衣机控制系统,一共花了四个礼拜的时间。
刚开始选定题目之后,自己还是无从下手。
跟以前做c语言课程设计一样,一开始总是很迷茫。
后来在网上查到,要做这样的一个课程设计,必须先弄清楚要做的是什么,需要实现哪些功能,然后通过所需要的功能,画出设计流程图,这个是很重要的。
在这种思想的指导下,我先对智能洗衣机控制系统做了详细的分析,把这个设计主要分为五个模式,四个状态。
这样分析之后,工作就变得很明确起来。
首先,必须先完成分频模块和译码模块,这两个模块没有什么难度,很快就完成了。
虽然一共有五个模式,四个状态,但是我知道,只要完成了其中的一个模式和一个状态,其他的就可以很快的做出来。
由于以前对verilog语言不是很熟悉,因此遇到了一些困难。
比如,我不清楚case语句里面还能不能继续镶嵌case语句,但是通过编写了一个简单程序实验之后,我发现这是可以的。
我知道,verilog语言是这次课程设计的基础,没有坚实的verilog语言基础是不能完成这次课程设计的,为此,我还重新去吧verilog语言看了一遍,以强化自己的基础。
尽管这是一次个人独立的课程设计,但是我认为同学之间的交流和讨论还是很重要的。
通过交流和讨论,我们可以各取所长,以弥补自己的不足,这样可以减少很多弯路。
但是我也知道绝知此事要躬行,我们不能完全参考同学的,我们必须有自己的想法,遇到那种不确定的问题,最好自己去亲自试验一次,这个才能得到自己想要的东西,而且还会从中获取意想不到的乐趣。
从刚拿到题目时候的无从下手,到现在做完之后感觉其实这次课程设计还是蛮简单的。
我觉得这就是一种能力的增加,一种知识的积累。
课程设计结束了,我们都有了自己的课设产品。
但是我想说的是通过这样的课程设计,我们所获得的不仅仅是结果,而是这样一个过程,一个学习、进步、分享、享受、积累的过程。
对于我们来说,在这次课程设计中学习到得东西才是最重要的。
无论是知识还是方法,都让我们受益匪浅。
附:
程序详细代码
modulefenpin(in,out);
inputin;
outputout;
reg[24:
0]cnt;
regout;
always@(posedgein)
begin
if(cnt>='d249999)
begin
out<=~out;
cnt<=0;
end
else
cnt<=cnt+1;
end
Endmodule
moduleyima(out,inG);
input[3:
0]in;
output[6:
0]out;
reg[6:
0]out;
always@(in)
begin
case(in)
4'h1:
out=7'b1111001;
4'h2:
out=7'b0100100;
4'h3:
out=7'b0110000;
4'h4:
out=7'b0011001;
4'h5:
out=7'b0010010;
4'h6:
out=7'b0000010;
4'h7:
out=7'b1111000;
4'h8:
out=7'b0000000;
4'h9:
out=7'b0011000;
4'h0:
out=7'b1000000;
endcase
end
Endmodule
moduleWash(cp,rct,moshi,out,over,hm,lm,hs,ls);
inputcp,rct;
input[4:
0]moshi;
output[4:
0]out;
outputover;
output[6:
0]hm,lm,hs,ls;
reg[4:
0]out;
regover;
reg[7:
0]sec,min;
regxop;
reg[4:
0]zhuangtai;
reg[3:
0]bu;
wireFinish;
parameter
zhuangtai1=4'b0001,zhuangtai2=4'b0010,
zhuangtai3=4'b0011,zhuangtai4=4'b0100,Cloze=4'b0110;
assignFinish=((sec[3:
0]==0)&(sec[7:
4]==0)&(min[3:
0]==0)&(min[7:
4]==0));
always@(posedgecps)
begin
if(~rct)
begin
zhuangtai<=zhuangtai1;
xop<=1'b0;
sec[3:
0]<=0;sec[7:
4]<=0;min[3:
0]<=0;min[7:
4]<=0;
bu<=0;
end
if(zhuangtai==Cloze)
over<=4'b0001;
else
over<=4'b0000;
begin
if(sec[3:
0]!
=0)
sec[3:
0]<=sec[3:
0]-4'd1;
elseif(sec[3:
0]==0&sec[7:
4]!
=0)
begin
sec[3:
0]<=4'd9;
sec[7:
4]<=sec[7:
4]-4'd1;
end
elseif(sec[7:
4]==0&sec[3:
0]==0&min[3:
0]!
=0)
begin
sec[3:
0]<=4'd9;
sec[7:
4]<=4'd5;
min[3:
0]<=min[3:
0]-4'd1;
end
elseif(sec[7:
4]==0&sec[3:
0]==0&min[3:
0]==0&min[7:
4]!
=0)
begin
sec[3:
0]<=4'd9;
sec[7:
4]<=4'd5;
min[3:
0]<=4'd9;
min[7:
4]<=min[7:
4]-4'd1;
end
end
if((Finish==1)&(rct==1))
case(moshi)
5'b00001:
case(zhuangtai)
zhuangtai1:
begin
if(bu>=4'b1100)zhuangtai<=Cloze;
else
begin
min[7:
4]<=0;min[3:
0]<=0;sec[7:
4]<=5;sec[3:
0]<=9;
zhuangtai<=zhuangtai2;
bu<=bu+2'b1;
end
end
zhuangtai2:
begin
if(xop==0)
beginmin[7:
4]<=2;min[3:
0]<=9;sec[7:
4]<=5;sec[3:
0]<=9;
zhuangtai<=zhuangtai3;
xop<=1'b1;
bu<=bu+2'b1;
end
else
beginmin[7:
4]<=0;min[3:
0]<=4;sec[7:
4]<=5;sec[3:
0]<=9;
zhuangtai<=zhuangtai3;
bu<=bu+2'b1;
end
end
zhuangtai3:
beginmin[7:
4]<=0;min[3:
0]<=0;sec[7:
4]<=5;sec[3:
0]<=9;
zhuangtai<=zhuangtai4;
bu<=bu+2'b1;
end
zhuangtai4:
beginmin[7:
4]<=0;min[3:
0]<=0;sec[7:
4]<=5;sec[3:
0]<=9;
zhuangtai<=zhuangtai1;
bu<=bu+2'b1;
end
default:
zhuangtai<=Cloze;
endcase
5'b00010:
case(zhuangtai)
zhuangtai1:
begin
if(bu>=4'b1100)zhuangtai<=Cloze;
else
begin
min[7:
4]<=0;min[3:
0]<=0;sec[7:
4]<=5;sec[3:
0]<=9;
zhuangtai<=zhuangtai2;
bu<=bu+2'b1;
end
end
zhuangtai2:
begin
if(xop==0)
beginmin[7:
4]<=1;min[3:
0]<=9;sec[7:
4]<=5;sec[3:
0]<=9;
zhuangtai<=zhuangtai3;
xop<=1'b1;
bu<=bu+2'b1;
end
else
beginmin[7:
4]<=0;min[3:
0]<=4;sec[7:
4]<=5;sec[3:
0]<=9;
zhuangtai<=zhuangtai3;
bu<=bu+2'b1;
end
end
zhuangtai3:
beginmin[7:
4]<=0;min[3:
0]<=0;sec[7:
4]<=5;sec[3:
0]<=9;
zhuangtai<=zhuangtai4;
bu<=bu+2'b1;
end
zhuangtai4:
beginmin[7:
4]<=0;min[3:
0]<=0;sec[7:
4]<=5;sec[3:
0]<=9;
zhuangtai<=zhuangtai1;
bu<=bu+2'b1;
end
default:
zhuangtai<=Cloze;
endcase
5'b00100:
case(zhuangtai)
zhuangtai1:
begin
if(bu>=4'b1100)zhuangtai<=Cloze;
else
begin
min[7:
4]<=0;min[3:
0]<=0;sec[7:
4]<=5;sec[3:
0]<=9;
zhuangtai<=zhuangtai2;
bu<=bu+2'b1;
end
end
zhuangtai2:
begin
if(xop==0)
beginmin[7:
4]<=0;min[3:
0]<=9;sec[7:
4]<=5;sec[3:
0]<=9;
zhuangtai<=zhuangtai3;
xop<=1'b1;
bu<=bu+2'b1;
end
else
beginmin[7:
4]<=0;min[3:
0]<=4;sec[7:
4]<=5;sec[3:
0]<=9;
zhuangtai<=zhuangtai3;
bu<=bu+2'b1;
end
end
zhuangtai3:
beginmin[7:
4]<=0;min[3:
0]<=0;sec[7:
4]<=5;sec[3:
0]<=9;
zhuangtai<=zhuangtai4;
bu<=bu+2'b1;
end
zhuangtai4:
beginmin[7:
4]<=0;min[3:
0]<=0;sec[7:
4]<=5;sec[3:
0]<=9;
zhuangtai<=zhuangtai1;
bu<=bu+2'b1;
end
default:
zhuangtai<=Cloze;
endcase
5'b01000:
case(zhuangtai)
zhuangtai1:
begin
if(bu>=4'b0111)zhuangtai<=Cloze;
else
begin
min[7:
4]<=0;min[3:
0]<=0;sec[7:
4]<=5;sec[3:
0]<=9;
zhuangtai<=zhuangtai2;
bu<=bu+2'b1;
end
end
zhuangtai2:
beginmin[7:
4]<=0;min[3:
0]<=4;sec[7:
4]<=5;sec[3:
0]<=9;
zhuangtai<=zhuangtai3;
bu<=bu+2'b1;
end
zhuangtai3:
beginmin[7:
4]<=0;min[3:
0]<=0;sec[7:
4]<=5;sec[3:
0]<=9;
zhuangtai<=zhuangtai4;
bu<=bu+2'b1;
end
zhuangtai4:
beginmin[7:
4]<=0;min[3:
0]<=0;sec[7:
4]<=5;sec[3:
0]<=9;
zhuangtai<=zhuangtai1;
bu<=bu+2'b1;
end
default:
zhuangtai<=Cloze;
endcase
5'b10000:
case(zhuangtai)
zhuangtai1:
beginmin[7:
4]<=0;min[3:
0]<=0;sec[7:
4]<=5;sec[3:
0]<=9;
zhuangtai<=Cloze;
end
default:
zhuangtai<=Cloze;
endcase
default:
zhuangtai<=Cloze;
endcase
end
always@(zhuangtai)
begin
case(zhuangtai)
zhuangtai1:
out<=5'b01000;
zhuangtai2:
out<=5'b00001;
zhuangtai3:
out<=5'b00010;
zhuangtai4:
out<=5'b00100;
Cloze:
out<=5'b10000;
default:
out<=5'b0000;
endcase
end
yima(lm,min[3:
0]);
yima(hm,min[7:
4]);
yima(ls,sec[3:
0]);
yima(hs,sec[7:
4]);
fenpin(cp,cps);
endmodule