EDA verylog 智能洗衣机.docx
《EDA verylog 智能洗衣机.docx》由会员分享,可在线阅读,更多相关《EDA verylog 智能洗衣机.docx(44页珍藏版)》请在冰豆网上搜索。
EDAverylog智能洗衣机
实验报告
项目名称智能洗衣机控制器的设计
课程名称电子技术课程设计
课程设计日期2012/4/24
班级40916
学号4091611
姓名王云枫
目录
一、已知条件3
二、性能指标要求3
三、输入输出设计3
四、模块对应器件的设计4
五、ASM图设计4
六、完整程序代码7
七、管脚分配30
八、时序仿真31
九、实验总结43
一、已知条件
用Verilog设计一个智能洗衣机控制器。
二、性能指标要求
①设计一个智能洗衣机(全自动洗衣机)控制器,能够实现洗衣,漂洗和脱水的功能。
②要求能够使用按键模拟对洗衣机的控制,能够设置工作模式,为了便于观察,将洗衣机的工作模式和所剩的工作时间用数码管显示出来,能够将洗衣机当前所处的状态用发光管或者数码管显示出来。
【模式1】:
洗特别脏的衣服(洗衣30秒钟)
【模式2】:
洗脏的衣服(洗衣20秒钟)
【模式3】:
洗一般的衣服(洗衣10秒钟)
【模式4】:
漂洗(每次漂洗5秒钟)
【模式5】:
脱水(每次脱水3秒钟)
【洗衣全过程】:
洗衣+脱水+漂洗+脱水+漂洗+脱水,注水完成使用外部传感器S=1表示。
【漂洗模式】:
漂洗+脱水+漂洗+脱水,注水完成使用外部传感器S=1表示。
【脱水模式】:
脱水。
【注】:
操作完毕使用蜂鸣器鸣叫两秒提示。
③画出洗衣机控制器的状态机,写出状态编码方案。
④用Verilog语言对设计进行描述,设计一个测试方案,通过Muxplus对设计进行仿真验证。
并能够下载到实验板上调试成功。
⑤写出设计性实验报告,并打印各层次的源文件和仿真波形,然后作简要说明。
并谈谈此次实验的收获、感想及建议
三、输入输出设计
输入:
1Hz时钟
七个按键:
复位
启动
模式选择
注水完成
洗衣全过程
漂洗
脱水
输出:
状态数码管,显示0~5
模式选择数码管,显示0~5
秒钟数码管,十位数码管、个位数码管,可显示0~30
蜂鸣器
四、模块对应器件的设计
模式选择:
一个5进制加计数器,用数码管显示0~5。
用一个按键做触发时钟
模式1:
30进制减计数器,用1Hz时钟
模式2:
20进制减计数器,用1Hz时钟
模式3:
10进制减计数器,用1Hz时钟
模式4:
5进制减计数器,用1Hz时钟
模式5:
3进制减计数器,用1Hz时钟
三个组合选择:
用三个按键
洗衣全过程:
49进制减计数器,用1Hz时钟(30+3+5+3+5+3=49)
漂洗模式:
39进制减计数器,用1Hz时钟(20+3+5+3+5+3=39)
脱水模式:
29进制减计数器,用1Hz时钟(10+3+5+3+5+3=29)
注水完成:
一个按键控制(S)
蜂鸣器:
2进制减计数器。
1Hz时钟
启动:
一个按键控制
复位:
一个按键控制
五、ASM图设计
a)整机ASM图
b)控制器ASM图
符号说明:
CR:
复位状态
S1~S5:
模式1~模式5状态
Mode:
模式选择
S:
外部传感器,表示注水完成
FullPro:
全过程洗衣
RinseMode:
漂洗模式
Beep:
蜂鸣状态
End:
终止状态
原理说明:
用户可以选择单选模式和组合模式:
在单选模式下,用户选择5种模式中的一种,模式终止之后即进入蜂鸣报警(Beep)状态,不再进行其他模式。
其中,模式1~4要保证注水完成(S=1)才能进行。
在组合模式下:
1、用户如果选择的是模式1~模式3(Mode=1~3),如果注水完成(S=1),则进行“洗衣(S1~S3)+脱水(S5)+漂洗(S4)+脱水(S5)+漂洗(S4)+脱水(S5)”,洗衣过程的时间长短由用户选择的模式1~模式3决定。
2、用户如果选择了模式4(Mode=4),如果注水完成(S=1),则进行“漂洗(S4)+脱水(S5)+漂洗(S4)+脱水(S5)”
3、用户如果选择了模式5(Mode=4),则进行“脱水(S5)”
组合模式结束后,进入蜂鸣报警状态(Beep),系统终止。
六、完整程序代码
//============================washer.v=============================//
modulewasher(State,Mode,Second,Beep,CP,nCR,En,ModeCh,FullPro,Rinse,Dehy,_500hz,S);
inputCP,nCR,En,ModeCh,FullPro,Rinse,Dehy,_500hz,S;
output[7:
0]Second;
output[3:
0]State,Mode;
outputBeep;
reg[7:
0]Second;
reg[3:
0]State,Mode;
regBeep;
regModeEnd;
wireMode_En;
wireveryEn,dirtyEn,normEn,rinseEn,dehyEn,fModeEn,rModeEn,dModeEn;
wireStop;
supply1Vdd;
reg[3:
0]State1,State2,State3,State4,State5,State6,State7,State8;
reg[7:
0]Second1,Second2,Second3,Second4,Second5,Second6,Second7,Second8;
regcountEnd,countEnd1,countEnd2,countEnd3,countEnd4,countEnd5,countEnd6,countEnd7,countEnd8;
/************模式选择*********/
assignMode_En=Vdd&&(~En);
count5ascU1(Mode,ModeEnd,nCR,Mode_En,ModeCh);
/************单选模式*********/
assignveryEn=Vdd&&En&&(~Stop)&&(~FullPro)&&(~Rinse)&&(~Dehy)&&(Mode==4'b0001)&&S;
assigndirtyEn=Vdd&&En&&(~Stop)&&(~FullPro)&&(~Rinse)&&(~Dehy)&&(Mode==4'b0010)&&S;
assignnormEn=Vdd&&En&&(~Stop)&&(~FullPro)&&(~Rinse)&&(~Dehy)&&(Mode==4'b0011)&&S;
assignrinseEn=Vdd&&En&&(~Stop)&&(~FullPro)&&(~Rinse)&&(~Dehy)&&(Mode==4'b0100)&&S;
assigndehyEn=Vdd&&En&&(~Stop)&&(~FullPro)&&(~Rinse)&&(~Dehy)&&(Mode==4'b0101);
verydirtyU2(State1,Second1,countEnd1,CP,nCR,veryEn);//模式1
dirtyU3(State2,Second2,countEnd2,CP,nCR,dirtyEn);//模式2
normalU4(State3,Second3,countEnd3,CP,nCR,normEn);//模式3
rinseU5(State4,Second4,countEnd4,CP,nCR,rinseEn);//模式4
dehydrationU6(State5,Second5,countEnd5,CP,nCR,dehyEn);//模式5
/************组合模式*********/
assignfModeEn=Vdd&&En&&(~Stop)&&(FullPro)&&(~Rinse)&&(~Dehy)&&(Mode>=4'b0001&&Mode<=4'b0011);
assignrModeEn=Vdd&&En&&(~Stop)&&(~FullPro)&&(Rinse)&&(~Dehy)&&(Mode==4'b0100);
assigndModeEn=Vdd&&En&&(~Stop)&&(~FullPro)&&(~Rinse)&&(Dehy)&&(Mode>=4'b0101);
fullU7(State6,Second6,countEnd6,CP,nCR,fModeEn,Mode,S);//全过程
RinseModeU8(State7,Second7,countEnd7,CP,nCR,rModeEn,S);//漂洗模式
dehydrationU9(State8,Second8,countEnd8,CP,nCR,dModeEn);//脱水模式
/************选择切换模块*********/
always@(veryEnordirtyEnornormEnorrinseEnordehyEnorfModeEnorrModeEnordModeEnornCRorcountEnd)
begin
if(veryEn)
beginSecond<=Second1;State<=State1;countEnd<=countEnd1;end
if(dirtyEn)
beginSecond<=Second2;State<=State2;countEnd<=countEnd2;end
if(normEn)
beginSecond<=Second3;State<=State3;countEnd<=countEnd3;end
if(rinseEn)
beginSecond<=Second4;State<=State4;countEnd<=countEnd4;end
if(dehyEn)
beginSecond<=Second5;State<=State5;countEnd<=countEnd5;end
if(fModeEn)
beginSecond<=Second6;State<=State6;countEnd<=countEnd6;end
if(rModeEn)
beginSecond<=Second7;State<=State7;countEnd<=countEnd7;end
if(dModeEn)
beginSecond<=Second8;State<=State8;countEnd<=countEnd8;end
if(~nCR)
beginSecond<=8'h00;State<=4'b0000;countEnd<=1'b0;end
if(countEnd==1'b1)
beginSecond<=8'h00;State<=4'b0000;end
end
/************蜂鸣器模块*********/
BeeperU10(Beep,CP,nCR,countEnd,_500hz);
/************终止模块*********/
assignStop=countEnd;
endmodule
//=======================verydirty.v=============================//
moduleverydirty(State,Second,countEnd,CP,nCR,En);
inputCP,nCR,En;
output[3:
0]State;
output[7:
0]Second;
outputcountEnd;
reg[3:
0]State;
reg[7:
0]Second;
regcountEnd;
count30U1(Second[7:
4],Second[3:
0],countEnd,nCR,En,CP);
always@(posedgeCP)
if(En)
begin
State<=4'b0001;
end
endmodule
//========================dirty.v=============================//
moduledirty(State,Second,countEnd,CP,nCR,En);
inputCP,nCR,En;
output[3:
0]State;
output[7:
0]Second;
outputcountEnd;
reg[3:
0]State;
reg[7:
0]Second;
regcountEnd;
count20U1(Second[7:
4],Second[3:
0],countEnd,nCR,En,CP);
always@(posedgeCP)
if(En)
begin
State<=4'b0010;
end
endmodule
//========================normal.v=============================//
modulenormal(State,Second,countEnd,CP,nCR,En);
inputCP,nCR,En;
output[3:
0]State;
output[7:
0]Second;
outputcountEnd;
reg[3:
0]State;
reg[7:
0]Second;
regcountEnd;
count10U1(Second[3:
0],countEnd,nCR,En,CP);
always@(posedgeCP)
if(En)
begin
State<=4'b0011;
Second[7:
4]<=4'b0000;
end
endmodule
//========================rinse.v=============================//
modulerinse(State,Second,countEnd,CP,nCR,En);
inputCP,nCR,En;
output[3:
0]State;
output[7:
0]Second;
outputcountEnd;
reg[3:
0]State;
reg[7:
0]Second;
regcountEnd;
count5U1(Second[3:
0],countEnd,nCR,En,CP);
always@(En)
if(En)
begin
State<=4'b0100;
Second[7:
4]<=4'b0000;
end
endmodule
//======================dehydration.v=============================//
moduledehydration(State,Second,countEnd,CP,nCR,En);
inputCP,nCR,En;
output[3:
0]State;
output[7:
0]Second;
outputcountEnd;
reg[3:
0]State;
reg[7:
0]Second;
regcountEnd;
count3U1(Second[3:
0],countEnd,nCR,En,CP);
always@(En)
begin
Second[7:
4]<=4'b0000;
if((~En)||(countEnd==1'b1))
begin
State<=4'b0000;
end
elseif(Second>8'b00000000)
begin
State<=4'b0101;
end
end
endmodule
//========================full.v=============================//
modulefull(State,Second,countEnd,CP,nCR,En,Mode,S);
inputCP,nCR,En,S;
input[3:
0]Mode;
output[3:
0]State;
output[7:
0]Second;
outputcountEnd;
reg[3:
0]State;
reg[7:
0]Second,Second1,Second2,Second3;
regcountEnd,countEnd1,countEnd2,countEnd3;
regflag;
wirecomEn1;
wirecomEn2;
wirecomEn3;
wireVdirty_En,dirty_En,norm_En;
supply1Vdd;
assignVdirty_En=Vdd&&(Mode==4'b0001);
assigndirty_En=Vdd&&(Mode==4'b0010);
assignnorm_En=Vdd&&(Mode==4'b0011);
count49U1(Second1[7:
4],Second1[3:
0],countEnd1,nCR,comEn1,CP);
count39U2(Second2[7:
4],Second2[3:
0],countEnd2,nCR,comEn2,CP);
count29U3(Second3[7:
4],Second3[3:
0],countEnd3,nCR,comEn3,CP);
always@(Vdirty_Enordirty_Enornorm_En)
begin
if(Vdirty_En)
beginSecond<=Second1;countEnd<=countEnd1;end
if(dirty_En)
beginSecond<=Second2;countEnd<=countEnd2;end
if(norm_En)
beginSecond<=Second3;countEnd<=countEnd3;end
end
always@(Second)
begin
if(countEnd==1'b1)
begin
State<=4'b0000;
end
elseif(Second>8'b00011000&&comEn1)
State<=4'b0001;
elseif(Second>8'b00011000&&comEn2)
State<=4'b0010;
elseif(Second>8'b00011000&&comEn3)
State<=4'b0011;
elseif((Second<=8'b00011000&&Second>8'b00010101)||
(Second<=8'b00010000&&Second>8'b00000111)||
(Second<=8'b00000010&&Second>=8'b00000000))
State<=4'b0101;
else
State<=4'b0100;
end
always@(posedgeCPorposedgeSornegedgenCR)
begin
if(~nCR)
flag<=1'b0;
elseif(S)
flag<=1'b1;
elseif((Second==8'b00010110)||(Second==8'b00001000))
flag<=1'b0;
else
flag<=flag;
end
assigncomEn1=Vdirty_En&&flag&&En;
assigncomEn2=dirty_En&&flag&&En;
assigncomEn3=norm_En&&flag&&En;
endmodule
//========================RinseMode.v=============================//
moduleRinseMode(State,Second,countEnd,CP,nCR,En,S);
inputCP,nCR,En,S;
output[3:
0]State;
output[7:
0]Second;
outputcountEnd;
reg[3:
0]State;
reg[7:
0]Second;
regcountEnd;
regflag;
wirecomEn;
count16U5(Second[7:
4],Second[3:
0],countEnd,nCR,comEn,CP);
always@(Second)
begin
if(countEnd==1'b1)
begin
State<=4'b0000;
end
elseif((Second<=8'b00010110&&Second>=8'b00010001)||(Second<8'b00001000&&Second>=8'b00000011))
begin
State<=4'b0100;
end
else
begin
State<=4'b0101;
end
end
always@(posedgeCPorposedgeSornegedgenCR)
begin
if(~nCR)
flag<=1'b0;
elseif(S)
flag<=1'b1;
elseif((Second==8'b00010110)||(Second==8'b00001000))
flag<=1'b0;
end
assigncomEn=En&&flag;
endmodule
//========================Beeper.v=============================//
moduleBeeper(alarm,CP,nCR,BeepEn,_500hz);
input_500hz,CP,nCR,BeepEn;
outputalarm;
regEndS;
reg[3:
0]Q;
supply1Vdd;
count2U1(Q,EndS,nCR,BeepEn,CP);
assignalarm=BeepEn&&_500hz&&(~EndS);
endmodule
//========================count49.v=============================//
modulecount49(CntH,CntL,EndS,nCR,EN,CP);
inputCP,nCR,EN;
output[3:
0]CntH,CntL;
outputEndS;
regEndS;
reg[3:
0]CntH,CntL;
always@(posedgeCPornegedgenCR)
begin
if(~nCR){CntH,C