智能洗衣机控制器设计 Verilog编程知识讲解Word格式文档下载.docx
《智能洗衣机控制器设计 Verilog编程知识讲解Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《智能洗衣机控制器设计 Verilog编程知识讲解Word格式文档下载.docx(22页珍藏版)》请在冰点文库上搜索。
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:
设定工作模式模式的按键;
输出端口:
所设定的模式,BCD码,可取1到5的整数;
进水量设定模块Water_t:
设定进水量。
Speed:
设定进水量,按键;
V[3:
所设定的进水时间,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:
当前工作过程剩余时间,向上传给main中的Timer;
timer_a[7:
完成全部工作剩余时间,传给main中的Timer_a;
s[2:
工作状态指示量,从0到5分别指示进水、洗衣、出水、
甩干和完成信号有效;
c[2:
取1到4,表示当前工作是第几轮;
报警模块alart:
产生报警蜂鸣信号。
CP_1k:
1kHz方波信号,用于产生蜂鸣信号,来自信号发生器;
CP:
1Hz方波信号,用于产生间断的蜂鸣信号,来自信号发生器;
Start,Set,Pause,Speed:
按键音有效信号。
另外Pause还用于突
发情况时人为控制暂停/继续的控制键;
No_water,water_out,Open,danger:
控制报警音开始/结束的信号,来自模块waterless和Unsafe;
完成工作后提示音有效信号,来自模块wash;
a:
报警音驱动信号
tp:
暂停/继续信号。
tp=1时暂停,tp=0时继续。
LED灯状态模块LEDs:
控制LED的亮灭。
s,c:
洗衣机的工作状态指示量,用作那个灯亮的判断条件,来自模块wash;
p:
运行/暂停状态标志量,用于暂停时的闪亮效果,来自模块alart;
1Hz方波信号,造成闪亮效果,来自信号发生器。
LED指示灯驱动信号。
LED_wi:
进水;
LED_wo:
出水;
LED_w:
洗衣;
LED_d:
甩干;
LED_s:
正在运行;
LED_l:
电机顺时针转;
LED_r:
逆时针转。
用Leonardo综合出的模块级连线图如下:
以上子模块端口具体用途在电工作原理中涉及。
四.电路工作原理。
下面按电路的使用过程对电路工作原理进行描述。
1.按下Set键,在Set上升沿作用下,mode模块被调用,执行的操作是工作模式m增加1。
其状态变化如下:
设定好工作模式后,按Speed键设定进水时间,water_t模块被调用,执行的操作是进水时间v增加1。
其变化原理与m类似,只是变化范围是1-3分钟。
2.设定完毕,按Start键,洗衣过程开始,这时是wash模块被调用,wash模块中,由状态变量c记录洗衣的轮数(以进水到甩干为一轮),状态变量s代表当前的工作方式,即s=0为进水,s=1为洗衣,s=2为排水,s=3为甩干,s=4时进行完成提示音信号的延时,其状态转变流程如下:
其中,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;
//工作模式
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:
//调用进水时间设定模块
washU3(CP,Start,m[3:
0],water_out,danger,tp,p,finish,Timer[7:
0],
Timer_a[7:
0],s[2:
0],c[2:
//调用洗衣过程控制模块
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为输入
//模式选择结果m为输出
reg[3:
/***********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'
end
endmodule
3.进水时间设定模块water_t:
moduleWater_t(Speed,v);
inputSpeed;
//设定键Speed为输入
//进水时间v为输出
0]v;
/***********Speed上升沿触发下,v由1到3循环变化*********/
always@(posedgeSpeed)begin
if(v[3:
b0011||v==0)v[3:
elsev=v+4'
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;
//输入设定的工作模式和进水时间
0]timer,timer_a;
//输出剩余时间
output[2:
//输出工作进程标志量
outputfinish,p;
//输出完成信号及暂停有效信号
reg[2:
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:
4'
b1001)begintimer_a[7:
0]=timer_a[7:
0]+8'
b00000110;
end
b0010:
b01010111;
b0011:
b01000111;
b0100:
b011;
timer_a=v+v+8'
b00100111;
b0101:
beginc=3'
b010;
timer=8'
b00000011;
timer_a=8'
b00000100;
defaultc=0;
endcase
ok=0;
finish=0;
d=0;
p=1;
//使暂停标志量无效
elseif(tp==1)p=0;
//收到暂停信号,暂停标志量有效
elseif(CP==1)begin//时钟信号CP触发下,洗衣机按既定程序工作
/******一个任务完成(OK=1),s加1,进入下个任务的执行状态*******/
if(ok==1)begin
if(s[2:
0]==3'
b011&
&
3'
b001)begin
s[2:
timer=v;
elseif(c==1)begin
finish=1;
//c=1,则以洗过足够多轮,finish信号有效,经过s=4时的延时将在两CP周期后复位
timer=0;
elseif(c==0)begin
0]=s[2:
0];
elsebegins=s+3'
b001;
ok=0;
/*****本次任务未完成(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;
0]==0)begintimer_a[3:
b1001;
4]=timer_a[7:
4]-4'
elsetimer_a[3:
0]=timer_a[3:
0]-4'
/*******s=0时,供水正常、未暂停则按设定时间进水*******/
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:
b100)begin
if(m==4'
b0001&
b100)timer[7:
0]=8'
b00110000;
elseif(m==4'
b0010)timer[7:
b00100000;
b0011)timer[7:
b00010000;
elseif(c[2:
b011||c[2:
b010)timer[7:
b00000101;
elsebegintimer[3:
0]=timer[3:
end
/*******s=1时,未暂停则按设定时间洗衣******/
elseif(s[2:
b001&
p==1)begin
if(timer[7:
//计数器计到0,本任务完成,ok置1下个CP时令s加1,进入下一任务
timer[1:
0]=2'
b10;
elseif(timer[3:
timer[3:
timer[7:
4]=timer[7:
/*******s=2时,未暂停则按设定时间排水*******/
b010&
p==1)begin
if(timer[1:
//计数器计到0,本任务完成,ok置1,下个CP时令s加1,进入下一任务
b11;
elsebegintimer[1:
0]=timer[1:
0]-2'
b01;
/*******s=3时,洗衣机盖关闭、未暂停则按设定时间甩干******/
danger==0&
c=c-3'
//甩干完成,则是本轮完成,工作轮数标志位c减1
/****s=4时,计时1秒,完成后在下个时钟周期finish复位*****/
b100&
2'
b000)begin
if(d==1)begin
d=0;
c=c-3'
//延时完成,ok置1,下个CP时复位finish,关掉完成提示音
elsebegind=1;
elsebegintimer=timer;
p=p;
timer_a=timer_a;
end//暂停时,计时器保持
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;
//由无水变有水
6.洗衣机盖开