基于Verilog HDL的FPGA程序智能洗衣机.docx
- 文档编号:26636042
- 上传时间:2023-06-21
- 格式:DOCX
- 页数:50
- 大小:261.47KB
基于Verilog HDL的FPGA程序智能洗衣机.docx
《基于Verilog HDL的FPGA程序智能洗衣机.docx》由会员分享,可在线阅读,更多相关《基于Verilog HDL的FPGA程序智能洗衣机.docx(50页珍藏版)》请在冰豆网上搜索。
基于VerilogHDL的FPGA程序智能洗衣机
华中科技大学
电子线路课程设计
题目:
智能洗衣机
院系:
控制科学与工程系
班级:
自动化100X班
姓名:
联系方式:
fanjunchao1991@
指导老师:
目录
一题目分析。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
1
二系统流程图.。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
2
三主要模块介绍.。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
5
四各按键功能.。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
6
五仿真波形.。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
7
六实验总结。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
8
七附录。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
9
一:
题目分析
本次课程设计要求以VerilogHDL硬件描述语言为基础,以DE2开发板为工具,编写智能洗衣机的模拟程序。
首先,我在熟悉题目要求的前提下,将题目要求划分为以下几个小的项目,每个项目尽量用单独的模块实现其功能:
1洗衣过程的转换:
控制洗衣过程在每个过程对应的状态机之间转换,用control.v模块实现。
2洗衣时间的显示:
通过直接调用上学期编写的24小时智能时钟程序的计时模块,并用总时间减去已用时间得到剩余时间,用led_show.v实现。
本程序的特色:
①led灯表示水位:
通过一定的算法,实现用led灯的亮灭表示水位。
Led依次点亮表示注水过程,相反,表示排水和甩干过程。
②1602LCD液晶屏:
用LCD显示所有操作步骤和过程,包括选择模式,当前洗衣模式和状态,洗衣完毕等。
这些过程都是用LCD液晶屏具体显示。
③按键使用和去抖:
因为要使用按键进行模式的选择,所以我用软件去抖的方式实现按键按动时的去抖。
④暂停键模拟断电保护:
设计了一个暂停键,模拟真实情况中的断电保护。
当暂停时模拟现实中的断电;暂停结束模拟现实中的重新上电,程序从断点继续运行。
二:
系统流程图
MODE1ORMODE2ORMODE3:
NO
YES
Y
N
MODE4
N
Y
MODE5
流程图说明:
第一个为总的控制系统的流程图,后面三个为总流程图中,每种模式的详细流程图。
三:
主要模块介绍
modulemy_start:
顶层模块,调用下层模块。
moduleHZ_1:
分频模块,通过10分频和5分频将50Mhz分频成为1hz。
modulecontrol:
控制模块,控制洗衣模式状态机的转换。
moduleled_show:
倒计时模块,通过减去已用时间,得到剩余时间。
moduleput_bottom:
软件去抖模块,通过软件去抖,检测按键按动情况。
modulelcd_show:
1602液晶屏显示模块,包括驱动和需要显示的字符。
Modulewater_station:
用led灯显示当前水位。
四:
各按键功能
SW_0:
电源键,‘0’时表示poweroff(未开电源),‘1’表示洗衣机已经开机,处于工作状态,优先级最高。
SW_1:
暂停键,‘0’时表示正常工作,‘1’时表示暂停工作,处于待机状态。
Key_2:
确定键,按下表示模式选择确定,进入洗衣工作状态。
Key_1:
模式选择键,洗衣机共有5种工作模式,用此键进行选择模式。
液晶屏:
显示洗衣机工作状态。
数码管:
显示洗衣机当前工作模式剩余时间和整个工作状态剩余时间。
Hex7,hex6:
表示当前状态剩余分钟。
Hex5,hex4:
表示剩余时间(秒)。
Hex1,hex0:
表示整个状态剩余时间。
Led:
表示洗衣机水位状态,水位越高,led灯亮的越多。
五:
仿真波形
说明:
bot_1为模式选择按键,bot_2为确认按键,当57us按动确认键后,进入所选择的的mode1。
wsh_sty为当前洗衣状态,0代表注水,1代表洗衣(为了缩短仿真时间,我将洗衣时间改成一分钟),2代表排水,3代表甩干,4代表漂洗。
可以看到,洗衣过程如下:
0-1-2-3---0-4-2-3---0-4-2-3---washover。
符合要求,下载到开发板上以后也验证成功,mode2和mode3是类似状态,不再累述。
说明:
这是mode4的仿真图,wsh_sty中0代表注水,2代表排水,3代表甩干,4代表漂洗。
可以看到,洗衣方式为0-4-2-3--0-4-2-3--washover,符合题目要求。
实验总结
在去年多功能时钟的基础上,今年的课程设计让我学会了很多的新知识,也少走了很多弯路。
①模块化设计的思想:
本次课程设计使用了很多去年设计多功能时钟的模块,编写可移植模块,对程序编写有莫大的好处。
②学习到很多小的注意事项:
以前编写程序,从来不管warning,但是本次课设,本着严格要求的态度,我把所有warning都详细baidu和修改了一遍,最终将两百多个warning减少到了15个。
通过修改warning,可以发现并改正很多不良习惯。
我的200多个警告里面大部分是因为无意识的疏忽造成的。
比如,time_flag<=time_flag+1;其中time_flag为11位寄存器型变量,编译时提示的警告为‘1’没有标明位数,被默认设置成为32位,所以改成11'b1即可消除警告,这种重复性错误占有很大比例。
再比如,case语句没有养成加defaulet的习惯,我认为虽然运行时似乎对程序没有影响,但是遇到干扰或者时序混乱等情况时可能会出现问题。
还有比如,写代码时,在模块名后面的输入输出变量声明时多写了一个逗号等。
这些都提醒自己在写代码时不能投机取巧,尽管不会产生错误,但却可能造成以后写Verilog时习惯性疏忽。
但是也有一些警告需要我上网查找才能知道是什么意思,比如quartus软件里可以自己设定时钟频率,比如为输入输出引脚分配电容等。
3体的构思和准备:
我在写代码之前,构思了洗衣机的操作流程和可能遇到的问题,解决方案等。
将准备工作做充足以后,写代码就会很快,遇到的错误也更少。
附录:
(完整代码)
modulemy_start(
inputkey_0,key_1,
inputcp_50,
inputbot_1,bot_2,
outputLCD_EN,
outputLCD_RS,
outputLCD_RW,
outputLCD_ON,
outputLCD_BLON,
output[7:
0]LCD_DATA,
output[6:
0]led_min0,led_min1,led_sec0,led_sec1,min_all1,min_all2,
output[0:
14]led_wt
);
reg[2:
0]mode;
initialmode=3'b000;
wire[2:
0]wsh_sty;
wire[2:
0]mode_slt;
wirecp_1,mode_change,bot_2t;
HZ_1h_1(cp_50,1,cp_1);
controlcon_1(key_1,mode,cp_1,cp_50,wsh_sty,mode_change,led_min0,led_min1,led_sec0,led_sec1,min_all1,min_all2,led_wt);
always@(posedgecp_50)
begin
if((key_0==1)&&(mode==3'b000))mode<=3'b110;
elseif(key_0==0)mode<=3'b000;
if(mode_change==1)mode<=3'b111;
if((mode==3'b110)&&(bot_2t==0))mode<=mode_slt;
end
put_bottomput_1(cp_50,bot_1,bot_2,mode,bot_2t,mode_slt);
lcd_showlcd(
.CLOCK_50(cp_50),
.RST_N
(1),
.mode(mode),
.mode_slt(mode_slt),
.wsh_sty(wsh_sty),
.LCD_DATA(LCD_DATA),
.LCD_EN(LCD_EN),
.LCD_RS(LCD_RS),
.LCD_RW(LCD_RW),
.LCD_ON(LCD_ON),
.LCD_BLON(LCD_BLON)
);
Endmodule
moduleput_bottom(cp_50,bot_1,bot_2,mode,bot_2t,mode_slt);//去抖时间20ms,检测时间20um,没有按是1
inputcp_50,bot_1,bot_2;
input[2:
0]mode;
outputbot_2t;
output[2:
0]mode_slt;
regbot_1f,bot_1t,bot_2f,bot_2t;
reg[2:
0]mode_slt;
reg[10:
0]flag_1,flag_2;
initial
begin
bot_1f<=1;
bot_2f<=1;
bot_1t<=1;
bot_2t<=1;
mode_slt<=3'b001;
end
wire[3:
0]q_0,q_1,q_2;
wireQ_0,Q_1,cp_u;
counter_10u1(1,cp_50,q_0[3:
0],Q_0);
counter_10u2(1,Q_0,q_1[3:
0],Q_1);
counter_10u3(1,Q_1,q_2[3:
0],cp_u);//20微秒
always@(posedgecp_u)
begin
if(bot_1f==bot_1)
flag_1<=flag_1+11'b1;
else
begin
flag_1<=0;
bot_1f<=bot_1;
end
if(flag_1>11'd2000)
begin
flag_1<=0;
bot_1t<=bot_1f;
end
if(bot_2f==bot_2)
flag_2<=flag_2+11'b1;
else
begin
flag_2<=0;
bot_2f<=bot_2;
end
if(flag_2>11'd2000)
begin
flag_2<=0;
bot_2t<=bot_2f;
end
end
always@(posedgebot_1t)
begin
if((mode==3'b110)&&(mode_slt<3'b101))
mode_slt<=mode_slt+3'b001;
elseif((mode==3'b110)&&(mode_slt>3'b100))
mode_slt<=3'b001;
end
endmodule
modulewater_station(key_1,led_sec0,cp_1,wsh_sty,mode,time_flag,led_wt);
input[2:
0]wsh_sty,mode;
input[10:
0]time_flag;
inputcp_1,key_1;
input[7:
0]led_sec0;
output[0:
14]led_wt;
reg[0:
14]led_wt;
always@(posedgecp_1)
begin
if((~(key_1==0))&&(mode!
=3'b000))
begin
if((wsh_sty==3'b001)||(wsh_sty==3'b100))
led_wt<=0;
else
led_wt<=led_wt;
end
else
case(mode)
3'b001,
3'b010,
3'b011,
3'b100:
begin
case(wsh_sty)
3'b000:
if(time_flag[1:
0]==2'b00)led_wt<=(led_wt<<1)+1'b1;
3'b001:
led_wt<=~led_wt;
3'b010:
begin
if(time_flag==0)led_wt<=15'h7fff;
if((led_sec0==8'b1001_1001)||(led_sec0==8'b1001_0000))led_wt<=(led_wt>>1);
end
3'b011:
if(time_flag[4:
0]==3'b00000)led_wt<=(led_wt>>1);
3'b100:
begin
if(time_flag==0)
begin
led_wt<=15'h7fff;
end
else
led_wt<=~led_wt;
end
default:
led_wt<=15'b0;
endcase
end
3'b101:
begin
if(time_flag==0)
led_wt<=15'h00ff;
elseif(time_flag[2:
0]==3'b000)led_wt<=(led_wt>>1);
end
default:
led_wt<=15'b0;
endcase
end
endmodule
modulecontrol(key_1,mode,cp_1,cp_50,wsh_sty[2:
0],mode_change,led_min0,led_min1,led_sec0,led_sec1,min_all1,min_all2,led_wt);
input[2:
0]mode;
inputcp_1,cp_50,key_1;
output[2:
0]wsh_sty;
outputmode_change;
output[7:
0]led_min0,led_min1,led_sec0,led_sec1,min_all1,min_all2;
output[14:
0]led_wt;
//wire[2:
0]mode;
reg[2:
0]wsh_sty;
reg[1:
0]dry_flag;
reg[10:
0]time_flag;
regmode_change,wsh_flag;
wireseccp;
initial
begin
wsh_sty<=3'b000;
wsh_flag<=1'b0;
dry_flag<=2'b00;
end
led_showled_1(key_1,time_flag,mode,wsh_sty,cp_50,cp_1,led_min0,led_min1,led_sec0,led_sec1,min_all1,min_all2,seccp);
water_station(key_1,led_sec0,cp_1,wsh_sty,mode,time_flag,led_wt);
always@(posedgeseccp)
begin
if((~(key_1==0))&&(mode!
=3'b000))
begin
wsh_sty<=wsh_sty;
wsh_flag<=wsh_flag;
dry_flag<=dry_flag;
time_flag<=time_flag;
mode_change<=mode_change;
end
else
case(mode)
3'b000:
begin
wsh_sty<=3'b000;
wsh_flag<=1'b0;
dry_flag<=2'b00;
time_flag=0;
end//断电状态将洗衣方式清零
3'b001,
3'b010,
3'b011:
begin
case(wsh_sty)
3'b000:
//注水
begin
if((time_flag>=11'd60)&&(wsh_flag==0))
begin
time_flag=0;
wsh_sty<=3'b001;//转到洗衣模式
end
elseif((time_flag>=11'd60)&&(wsh_flag==1))
begin
time_flag=0;
wsh_sty<=3'b100;//转到漂洗模式
end
else
time_flag<=time_flag+1'b1;
end
3'b001:
//洗衣
begin
wsh_flag<=1;
if((time_flag>=11'd1800)&&(mode==3'b001))
begin
time_flag=0;
wsh_sty<=3'b010;//转到排水模式
end
elseif((time_flag>=11'd1200)&&(mode==3'b010))
begin
time_flag=0;
wsh_sty<=3'b010;//转到排水模式
end
elseif((time_flag>=11'd600)&&(mode==3'b011))
begin
time_flag=0;
wsh_sty<=3'b010;//转到排水模式
end
else
time_flag<=time_flag+1'b1;
end
3'b010:
//排水
begin
if(time_flag>=11'd60)
begin
time_flag=0;
wsh_sty<=3'b011;//转到甩干模式
end
else
time_flag<=time_flag+1'b1;
end
3'b011:
//甩干
begin
if((time_flag>=11'd60)&&(dry_flag>=2'b10))
begin
time_flag=0;
dry_flag<=0;
wsh_sty<=3'b000;
wsh_flag<=1'b0;
mode_change<=1;//高电平时向外部表示已经洗完,请求改变模式
end
elseif((time_flag>=11'd60)&&(dry_flag<2'b10))
begin
time_flag=0;
wsh_sty<=3'b000;//转到注水模式
dry_flag<=dry_flag+1'b1;
end
else
time_flag<=time_flag+1'b1;
end
3'b100:
//漂洗
begin
if(time_flag>=11'd300)
begin
time_flag=0;
wsh_sty<=3'b010;//转到甩干模式
end
else
time_flag<=time_flag+1'b1;
end
default:
wsh_sty<=3'b000;
endcase
end
3'b100:
begin
case(wsh_sty)
3'b000:
//注水
begin
if(time_flag>=11'd60)
begin
time_flag=0;
wsh_sty<=3'b100;//转到漂洗模式
end
else
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于Verilog HDL的FPGA程序智能洗衣机 基于 Verilog HDL FPGA 程序 智能 洗衣机