智能洗衣机控制器设计 Verilog编程.docx
- 文档编号:6764253
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:19
- 大小:141.42KB
智能洗衣机控制器设计 Verilog编程.docx
《智能洗衣机控制器设计 Verilog编程.docx》由会员分享,可在线阅读,更多相关《智能洗衣机控制器设计 Verilog编程.docx(19页珍藏版)》请在冰豆网上搜索。
智能洗衣机控制器设计Verilog编程
智能洗衣机控制器设计报告
鑫鑫出品
2010-3-18
一.设计背景……………………………………………………………2
二.功能简介
基本功能…………………………………………………………2
扩展功能…………………………………………………………3
三.模块设计及端口设置
主模块main………………………………………………………3
工作模式设定模块mode…………………………………………4
进水量设定模块Water_t…………………………………………4
无供水信号产生模块waterless…………………………………5
危险信号产生模块Unsafe………………………………………5
洗衣过程控制模块wash…………………………………………6
报警模块alart……………………………………………………7
LED灯状态模块LEDs………………………………………………7
模块级连线图………………………………………………………8
四.电路工作原理………………………………………………………9
以s的值为主要状态标志的基本工作流程图…………………10
五.Verilog源程序及注释……………………………………………11
六.小结…………………………………………………………………18
一.设计背景。
如今,带有微型控制芯片的家用电器迅速普及。
通过用户简单的设定,这些智能家电能自动完成家务,并向用户及时提供反馈信息。
这极大地方便了人们的生活。
智能洗衣机是智能家电的代表。
用户只需按几个键,智能洗衣机就能自动完成注水、洗衣、排水、甩干等一系列工作,并在发生事故时给予用户报警并作出正确反应,极大减轻用户的洗衣负担,同时保障用户安全。
基于以上功能要求,本人进行了智能洗衣机控制器的设计,并作出此设计报告。
二.功能简介。
基本功能:
a.可选5种洗衣模式,列举如下
1>强力洗衣模式:
工作程序为,注水->洗衣->排水->甩干
->注水->漂洗->排水->甩干
->注水->漂洗->排水->甩干。
其中洗衣为30分钟;
2>普通洗衣模式:
工作程序为,注水->洗衣->排水->甩干
->注水->漂洗->排水->甩干
->注水->漂洗->排水->甩干。
其中洗衣为20分钟;
3>强力洗衣模式:
工作程序为,注水->洗衣->排水->甩干
->注水->漂洗->排水->甩干
->注水->漂洗->排水->甩干。
其中洗衣为10分钟;
4>漂洗模式:
工作程序为,注水->漂洗->排水->甩干
->注水->漂洗->排水->甩干。
5>甩干模式:
工作程序为,甩干。
以上五种模式中,进水时间为1-3分钟,漂洗为5分钟,
排水2分钟,甩干3分钟。
b.显示洗衣完成所需时间。
c.用不同LED灯显示洗衣机当前的工作状态(注水、洗衣、排水、甩干)。
d.完成洗衣任务时蜂鸣3声提示。
扩展功能:
a.进水量可调。
根据衣物的多少,进水时间有1分钟、2分钟、3分钟三个档位,并用一个数码管显示所设时间。
b.进水时无水报警。
蜂鸣器发出2秒的报警声,并中止洗衣工作。
供水正常后恢复工作。
c.甩干时洗衣机盖被打开则报警。
2秒报警声,同时中止甩干操作。
重新盖上盖子后恢复工作。
d.有按键音。
e.设有暂停/继续键。
可随时按下暂停洗衣机的工作。
再次按下则继续工作。
f.用两个LED灯标志给电机的控制信号。
在洗衣或漂洗时交替闪亮,象征电机顺时针/逆时针转动的转换。
g.用数码管显示当前工作状态(注水、洗衣、排水、甩干)所剩时间。
三.模块设计及端口设置。
为完成预定功能,设置1个主模块,7个子模块;使用2个时钟信号端口,6个按键,6个数码管和7个LED。
主模块main:
调用其他模块,共同完成预定功能。
输入端口:
CP_1k,CP:
分别为1kHz和1Hz方波,分别用于产生蜂鸣信号和系统状态转换及计时的时钟信号;
Start,Pause:
开始键和暂停/继续键;
Set,Speed:
功能设定,分别用来设定工作模式和进水量;
Open,No_water:
警报信号,用来模拟打开洗衣机盖和供水中断
事件的发生。
输出端口:
m[3:
0],v[3:
0]:
数码管显示信号,分别指示工作模式和进水量;
Timer[7:
0],Timer_a[7:
0]:
数码管显示信号,分别表示当前过程
剩余时间和完成所有工作剩余时间。
LED_s,LED_wi,LED_wo,LED_w,LED_d和LED_l,LED_r:
LED驱动信号,分别指示正在工作、进水、出水、洗衣、
甩干和电机的顺时针、逆时针旋转状态。
a:
蜂鸣信号。
用于报警、提示有键按下和洗衣完成。
工作模式设定模块mode:
设定工作模式。
输入端口:
Set:
设定工作模式模式的按键;
输出端口:
m[3:
0]:
所设定的模式,BCD码,可取1到5的整数;
进水量设定模块Water_t:
设定进水量。
输入端口:
Speed:
设定进水量,按键;
输出端口:
V[3:
0]:
所设定的进水时间,BCD码,可取取1到3的整数;
无供水信号产生模块waterless:
产生无水报警信号。
输入端口:
No_water:
供水中断/恢复信号,按键;
输出端口:
water_out:
供水情况指示量,值为1表示无供水,0表示
供水正常;
危险信号产生模块Unsafe:
产生危险报警信号。
输入端口:
Open:
洗衣机盖开/合信号,按键;
输出端口:
danger:
洗衣机盖状态指示量,值为1表示打开,0表示关闭;
洗衣过程控制模块wash:
控制洗衣过程的转换。
输入端口:
CP:
1Hz时钟信号,来自时钟信号发生器;
Start:
开始工作命令信号,按键;
m:
工作模式,来自模块mode;
v:
进水时间,来自模块Water_t;
water_out:
供水情况,来自模块waterless;
danger:
危险状态,来自模块Unsafe;
tp:
暂停/继续的命令信号;
输出端口:
p:
运行/暂停工作状态量,1表示正在运行,0表示暂停;
finish:
工作结束状态量,由0变为1表示工作结束;
timer[7:
0]:
当前工作过程剩余时间,向上传给main中的Timer;
timer_a[7:
0]:
完成全部工作剩余时间,传给main中的Timer_a;
s[2:
0]:
工作状态指示量,从0到5分别指示进水、洗衣、出水、
甩干和完成信号有效;
c[2:
0]:
取1到4,表示当前工作是第几轮;
报警模块alart:
产生报警蜂鸣信号。
输入端口:
CP_1k:
1kHz方波信号,用于产生蜂鸣信号,来自信号发生器;
CP:
1Hz方波信号,用于产生间断的蜂鸣信号,来自信号发生器;
Start,Set,Pause,Speed:
按键音有效信号。
另外Pause还用于突
发情况时人为控制暂停/继续的控制键;
No_water,water_out,Open,danger:
控制报警音开始/结束的信号,来自模块waterless和Unsafe;
finish:
完成工作后提示音有效信号,来自模块wash;
输入端口:
a:
报警音驱动信号
tp:
暂停/继续信号。
tp=1时暂停,tp=0时继续。
LED灯状态模块LEDs:
控制LED的亮灭。
输入端口:
s,c:
洗衣机的工作状态指示量,用作那个灯亮的判断条件,来自模块wash;
p:
运行/暂停状态标志量,用于暂停时的闪亮效果,来自模块alart;
CP:
1Hz方波信号,造成闪亮效果,来自信号发生器。
输出端口:
LED指示灯驱动信号。
LED_wi:
进水;LED_wo:
出水;LED_w:
洗衣;LED_d:
甩干;LED_s:
正在运行;LED_l:
电机顺时针转;LED_r:
逆时针转。
用Leonardo综合出的模块级连线图如下:
以上子模块端口具体用途在电工作原理中涉及。
四.电路工作原理。
下面按电路的使用过程对电路工作原理进行描述。
1.按下Set键,在Set上升沿作用下,mode模块被调用,执行的操作是工作模式m增加1。
其状态变化如下:
m=1
m=2
m=3
m=4
m=5
设定好工作模式后,按Speed键设定进水时间,water_t模块被调用,执行的操作是进水时间v增加1。
其变化原理与m类似,只是变化范围是1-3分钟。
2.设定完毕,按Start键,洗衣过程开始,这时是wash模块被调用,wash模块中,由状态变量c记录洗衣的轮数(以进水到甩干为一轮),状态变量s代表当前的工作方式,即s=0为进水,s=1为洗衣,s=2为排水,s=3为甩干,s=4时进行完成提示音信号的延时,其状态转变流程如下:
s=0
s=1
s=2=3
s=3
s=4=5
其中,ok=1是上一任务完成的标志,模式1,2,3中,c初值为4。
轮回3次后c=1,s由3变为4,finish置1有效,完成提示音响(由modulealart实现),同时延时计时器启动,计时完毕后,finish=0,提示音停。
s=4状态的工作完成后,ok=0,s保持,直到下次启动(Start)再初始化。
以s的值为主要状态标志的基本工作流程图:
3.报警功能,主要由alart模块实现。
按No_water键,供水中断信号water_out=1有效。
如果这时正在进水,则置c_e=1使报警音延时计时器开始计时,同时c_t=1使报警信号有效,开始发出报警音。
延时器计时完毕,c_e、c_t复位,报警音关闭,报警结束。
但进水工作仍处于中断状态。
只有再此按下No_water键,表示供水恢复,则继续进水。
甩干过程中由Open键触发的洗衣机盖被打开的报警原理同上。
工作结束后的提示音由输入的finish信号控制。
finish会有3个CP有效,和CP相与后,产生三声提示音。
暂停功能也有alart模块参与,按Pause键后,tp变化,会导致暂停有效信号取反,实现暂停/继续的功能。
4.LED等指示状态
共用到7个LED来代表系统的工作状态。
其驱动信号有效与否由系统目前的工作状态来判断。
其具体代表的状态和实现方法已在端口介绍和源程序注释中说明,不另赘述。
五.Verilog源程序及注释。
1.主模块main:
modulemain(CP_1k,CP,Start,Pause,Set,Speed,Open,No_water,Timer,Timer_a,m,v,
LED_wi,LED_wo,LED_w,LED_d,LED_s,LED_l,LED_r,a);
inputCP_1k,CP,Start,Pause,Set,Speed,Open,No_water;//输入端口声明,其中CP_1k、CP为时钟信号,其他为按键;
/**********************输出端口声明*************************/
outputLED_wi,LED_wo,LED_w,LED_d,LED_s,LED_l,LED_r,a;//LED及蜂鸣信号
output[3:
0]m;//工作模式
output[3:
0]v;//进水时间
output[7:
0]Timer,Timer_a;//剩余时间
wire[3:
0]m;
wire[2:
0]s,c;
wirewater_out,danger,finish,p,a,tp;
modeU1(Set,m[3:
0]);//调用模式选择模块
Water_tU2(Speed,v[3:
0]);//调用进水时间设定模块
washU3(CP,Start,m[3:
0],v[3:
0],water_out,danger,tp,p,finish,Timer[7:
0],
Timer_a[7:
0],s[2:
0],c[2:
0]);//调用洗衣过程控制模块
waterlessU4(No_water,water_out);//调用供水情况感应模块
UnsafeU5(Open,danger);//调用洗衣机盖状态模块
alartU6(CP_1k,CP,Start,Set,Pause,Speed,No_water,water_out,Open,danger,
finish,s[2:
0],a,tp);//调用报警信号产生模块
LEDsU7(s[2:
0],p,c[2:
0],CP,LED_wi,LED_wo,LED_w,LED_d,LED_s,LED_l,LED_r);
//调用LED驱动模块
Endmodule
2.模式选择模块mode:
modulemode(Set,m);
inputSet;//设定键Set为输入
output[3:
0]m;//模式选择结果m为输出
reg[3:
0]m;
/***********Set上升沿触发下,m由1到5循环变化*********/
always@(posedgeSet)begin
if(m[3:
0]>=4'b0101||m==0)m[3:
0]=4'b0001;
elsem[3:
0]=m[3:
0]+4'b0001;
end
endmodule
3.进水时间设定模块water_t:
moduleWater_t(Speed,v);
inputSpeed;//设定键Speed为输入
output[3:
0]v;//进水时间v为输出
reg[3:
0]v;
/***********Speed上升沿触发下,v由1到3循环变化*********/
always@(posedgeSpeed)begin
if(v[3:
0]>=4'b0011||v==0)v[3:
0]=4'b0001;
elsev=v+4'b0001;
end
endmodule
4.洗衣过程控制模块wash:
modulewash(CP,Start,m,v,water_out,danger,tp,p,finish,timer,timer_a,s,c);
inputCP,Start,tp,water_out,danger;//输入时钟信号及控制键
input[3:
0]m,v;//输入设定的工作模式和进水时间
output[7:
0]timer,timer_a;//输出剩余时间
output[2:
0]s,c;//输出工作进程标志量
outputfinish,p;//输出完成信号及暂停有效信号
reg[2:
0]s,c;
reg[7:
0]timer,timer_a;
regok,d;
regfinish,p;
always@(posedgeCPorposedgeStartorposedgetp)begin
/*********按下Start键,根据所选模式给各变量赋初值*********/
if(Start==1)begin
case(m)
4'b0001:
begins[2:
0]=3'b000;timer=v;c=3'b100;
timer_a=v+v+v+8'b01100111;
if(timer_a[3:
0]>4'b1001)begintimer_a[7:
0]=timer_a[7:
0]+8'b00000110;end
end
4'b0010:
begins[2:
0]=3'b000;timer=v;c=3'b100;
timer_a=v+v+v+8'b01010111;
if(timer_a[3:
0]>4'b1001)begintimer_a[7:
0]=timer_a[7:
0]+8'b00000110;end
end
4'b0011:
begins[2:
0]=3'b000;timer=v;c=3'b100;
timer_a=v+v+v+8'b01000111;
if(timer_a[3:
0]>4'b1001)begintimer_a[7:
0]=timer_a[7:
0]+8'b00000110;end
end
4'b0100:
begins[2:
0]=3'b000;timer=v;c=3'b011;
timer_a=v+v+8'b00100111;
if(timer_a[3:
0]>4'b1001)begintimer_a[7:
0]=timer_a[7:
0]+8'b00000110;end
end
4'b0101:
beginc=3'b010;s[2:
0]=3'b011;timer=8'b00000011;
timer_a=8'b00000100;
end
defaultc=0;
endcase
ok=0;
finish=0;
d=0;
p=1;//使暂停标志量无效
end
elseif(tp==1)p=0;//收到暂停信号,暂停标志量有效
elseif(CP==1)begin//时钟信号CP触发下,洗衣机按既定程序工作
/******一个任务完成(OK=1),s加1,进入下个任务的执行状态*******/
if(ok==1)begin
if(s[2:
0]==3'b011&&c[2:
0]>3'b001)begin
s[2:
0]=3'b000;
timer=v;
ok=0;
end
elseif(c==1)begin
s[2:
0]=3'b100;
finish=1;//c=1,则以洗过足够多轮,finish信号有效,经过s=4时的延时将在两CP周期后复位
ok=0;
timer=0;
end
elseif(c==0)begin
s[2:
0]=s[2:
0];
ok=0;
finish=0;
timer=0;
end
elsebegins=s+3'b001;ok=0;end
end
/*****本次任务未完成(OK=0),计数器继续计数,任务继续执行******/
elseif(ok==0)begin
if(tp==0)p=1;//收到继续信号,暂停标志量无效
/****运行时(无警报、暂停),总剩余时间计时器减计数****/
if(p==1&&c>1&&water_out==0&&danger==0)begin
if(timer_a[7:
0]==8'b00000000)timer_a[7:
0]=0;
if(timer_a[3:
0]==0)begintimer_a[3:
0]=4'b1001;timer_a[7:
4]=timer_a[7:
4]-4'b001;end
elsetimer_a[3:
0]=timer_a[3:
0]-4'b0001;
end
/*******s=0时,供水正常、未暂停则按设定时间进水*******/
if(s[2:
0]==2'b000&&p==1&&water_out==0)begin
if(timer[3:
0]==0)begin
ok=1;//计数器计到0,本任务完成,ok置1,下个CP时令s加1,进入下一任务
if(c[2:
0]==3'b100)begin
if(m==4'b0001&&c[2:
0]==3'b100)timer[7:
0]=8'b00110000;
elseif(m==4'b0010)timer[7:
0]=8'b00100000;
elseif(m==4'b0011)timer[7:
0]=8'b00010000;
end
elseif(c[2:
0]==3'b011||c[2:
0]==3'b010)timer[7:
0]=8'b00000101;
end
elsebegintimer[3:
0]=timer[3:
0]-4'b0001;ok=0;end
end
/*******s=1时,未暂停则按设定时间洗衣******/
elseif(s[2:
0]==2'b001&&p==1)begin
if(timer[7:
0]==0)begin
ok=1;//计数器计到0,本任务完成,ok置1下个CP时令s加1,进入下一任务
timer[1:
0]=2'b10;
end
elseif(timer[3:
0]==0)begin
timer[3:
0]=4'b1001;
timer[7:
4]=timer[7:
4]-4'b0001;
ok=0;
end
elsebegintimer[3:
0]=timer[3:
0]-4'b0001;ok=0;end
end
/*******s=2时,未暂停则按设定时间排水*******/
elseif(s[2:
0]==2'b010&&p==1)begin
if(timer[1:
0]==0)begin
ok=1;//计数器计到0,本任务完成,ok置1,下个CP时令s加1,进入下一任务
timer[1:
0]=2'b11;
end
elsebegintimer[1:
0]=timer[1:
0]-2'b01;ok=0;end
end
/*******s=3时,洗衣机盖关闭、未暂停则按设定时间甩干******/
elseif(s[2:
0]==3'b011&&c[2:
0]>3'b001&&danger==0&&p==1)begin
if(timer[1:
0]==0)begin
ok=1;//计数器计到0,本任务完成,ok置1,下个CP时令s加1,进入下一任务
c=c-3'b001;//甩干完成,则是本轮完成,工作轮数标志位c减1
end
elsebegintimer[1:
0]=timer[1:
0]-2'b01;ok=0;end
end
/****s=4时,计时1秒,完成后在下个时钟周期finish复位*****/
elseif(s[2:
0]==3'b100&&c[2:
0]>2'b000)begin
if(d==1)begin
ok=1;d=0;c=c-3'b001;//延时完成,ok置1,下个CP时复位finish,关掉完成提示音
end
elsebegind=1;ok=0;end
end
elsebegintimer=timer;p=p;timer_a=timer_a;end//暂停时,计时器保持
end
end
end
endmodule
5.供水情况感应模块Waterless:
modulewaterless(No_water,water_out);
inputNo_water;//设定键No_water为输入
outputwater_out;//设定供水状态标志量water_out为输入
regwater_out;
always@(posedgeNo_water)begin//按键No_water,供水标志量变化
if(water_out==0)water_out=1;//由有水变无水
elsewater_out=0;//由无水变有水
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 智能洗衣机控制器设计 Verilog编程 智能 洗衣机 控制器 设计 Verilog 编程