




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、华中科技大学电子线路课程设计题 目:智能洗衣机院 系:控制科学与工程系班 级:自动化100X班姓 名:联系方式:指导老师:目录一 题目分析。1二 系统流程图.。2三 主要模块介绍.。5四 各按键功能.。6五 仿真波形.。7六 实验总结。8七 附录。9一:题目分析本次课程设计要求以Verilog HDL硬件描述语言为基础,以DE2开发板为工具,编写智能洗衣机的模拟程序。首先,我在熟悉题目要求的前提下,将题目要求划分为以下几个小的项目,每个项目尽量用单独的模块实现其功能: 洗衣过程的转换:控制洗衣过程在每个过程对应的状态机之间 转换,用control.v模块实现。 洗衣时间的显示:通过直接调用上学
2、期编写的24小时智能时钟程序的计时模块,并用总时间减去已用时间得到剩余时间,用led_show.v实现。本程序的特色:led灯表示水位:通过一定的算法,实现用led灯的亮灭表示水位。Led依次点亮表示注水过程,相反,表示排水和甩干过程。1602 LCD液晶屏:用LCD显示所有操作步骤和过程,包括选择模式,当前洗衣模式和状态,洗衣完毕等。这些过程都是用LCD液晶屏具体显示。按键使用和去抖:因为要使用按键进行模式的选择,所以我用软件去抖的方式实现按键按动时的去抖。暂停键模拟断电保护:设计了一个暂停键,模拟真实情况中的断电保护。当暂停时模拟现实中的断电;暂停结束模拟现实中的重新上电,程序从断点继续运
3、行。二:系统流程图MODE 1 OR MODE 2 OR MODE 3:Wash over洗衣完毕?NOYESDry(甩干)Drain(排水)Wash(洗衣)Potch(漂洗)是否已经洗过衣服?Inject(注水) YNMODE 4NWash over洗衣完毕?Dry(甩干)Drain(排水)Potch(漂洗)Inject(注水)YMODE 5Dry(甩干)Wash over流程图说明:第一个为总的控制系统的流程图,后面三个为总流程图中,每种模式的详细流程图。三:主要模块介绍module my_start: 顶层模块,调用下层模块。module HZ_1:分频模块,通过10分频和5分频将50M
4、hz分频成为1hz。module control:控制模块,控制洗衣模式状态机的转换。module led_show:倒计时模块,通过减去已用时间,得到剩余时间。module put_bottom:软件去抖模块,通过软件去抖,检测按键按动情况。module lcd_show:1602液晶屏显示模块,包括驱动和需要显示的字符。Module water_station:用led灯显示当前水位。四:各按键功能SW_0 :电源键,0时表示power off(未开电源),1表示洗衣机已经开机,处于工作状态,优先级最高。SW_1 :暂停键,0时表示正常工作,1时表示暂停工作,处于待机状态。Key_2 :确
5、定键,按下表示模式选择确定,进入洗衣工作状态。Key_1 :模式选择键,洗衣机共有5种工作模式,用此键进行选择模式。液晶屏 :显示洗衣机工作状态。数码管 :显示洗衣机当前工作模式剩余时间和整个工作状态剩余时间。Hex7,hex6:表示当前状态剩余分钟。Hex5,hex4:表示剩余时间(秒)。Hex1,hex0:表示整个状态剩余时间。Led: 表示洗衣机水位状态,水位越高,led灯亮的越多。五:仿真波形说明:bot_1为模式选择按键,bot_2为确认按键,当57us按动确认键后,进入所选择的的mode 1。wsh_sty为当前洗衣状态,0代表注水,1代表洗衣(为了缩短仿真时间,我将洗衣时间改成一
6、分钟),2代表排水,3代表甩干,4代表漂洗。可以看到,洗衣过程如下:0-1-2-3-0-4-2-3-0-4-2-3-wash over。符合要求,下载到开发板上以后也验证成功,mode 2和mode 3是类似状态,不再累述。说明:这是mode 4的仿真图,wsh_sty中0代表注水,2代表排水,3代表甩干,4代表漂洗。可以看到,洗衣方式为0-4-2-3-0-4-2-3-wash over,符合题目要求。实验总结在去年多功能时钟的基础上,今年的课程设计让我学会了很多的新知识,也少走了很多弯路。模块化设计的思想:本次课程设计使用了很多去年设计多功能时钟的模块,编写可移植模块,对程序编写有莫大的好处
7、。学习到很多小的注意事项:以前编写程序,从来不管warning,但是本次课设,本着严格要求的态度,我把所有warning都详细baidu和修改了一遍,最终将两百多个warning减少到了15个。通过修改warning,可以发现并改正很多不良习惯。我的200多个警告里面大部分是因为无意识的疏忽造成的。比如,time_flag <= time_flag + 1;其中time_flag为11位寄存器型变量,编译时提示的警告为1没有标明位数,被默认设置成为32位,所以改成 11'b1即可消除警告,这种重复性错误占有很大比例。再比如,case语句没有养成加defaulet的习惯,我认为虽然
8、运行时似乎对程序没有影响,但是遇到干扰或者时序混乱等情况时可能会出现问题。还有比如,写代码时,在模块名后面的输入输出变量声明时多写了一个逗号等。这些都提醒自己在写代码时不能投机取巧,尽管不会产生错误,但却可能造成以后写Verilog时习惯性疏忽。但是也有一些警告需要我上网查找才能知道是什么意思,比如quartus软件里可以自己设定时钟频率,比如为输入输出引脚分配电容等。 体的构思和准备:我在写代码之前,构思了洗衣机的操作流程和可能遇到的问题,解决方案等。将准备工作做充足以后,写代码就会很快,遇到的错误也更少。附录:(完整代码)module my_start(input key_0,key_1,
9、input cp_50,input bot_1,bot_2,output LCD_EN,output LCD_RS,output LCD_RW,output LCD_ON,output LCD_BLON,output7:0 LCD_DATA,output 6:0 led_min0,led_min1,led_sec0, led_sec1,min_all1,min_all2,output0:14 led_wt);reg 2:0mode;initialmode=3'b000;wire 2:0 wsh_sty;wire 2:0 mode_slt;wire cp_1,mode_change,bo
10、t_2t;HZ_1 h_1(cp_50,1,cp_1);control con_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(posedge cp_50)beginif(key_0=1)&&(mode=3'b000)mode<=3'b110;else if(key_0=0)mode<=3'b000;if(mode_change=1)mode<=3'
11、;b111;if(mode=3'b110)&&(bot_2t=0)mode<=mode_slt;endput_bottom put_1(cp_50,bot_1,bot_2,mode,bot_2t,mode_slt);lcd_show lcd(.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),.LC
12、D_BLON(LCD_BLON);Endmodulemodule put_bottom(cp_50,bot_1,bot_2,mode,bot_2t,mode_slt);/去抖时间20ms,检测时间20um,没有按是1input cp_50,bot_1,bot_2;input2:0mode;output bot_2t;output2:0mode_slt;reg bot_1f,bot_1t,bot_2f,bot_2t;reg 2:0mode_slt;reg 10:0flag_1,flag_2;initialbeginbot_1f<=1;bot_2f<=1;bot_1t<=1;bo
13、t_2t<=1;mode_slt<=3'b001;endwire 3:0q_0,q_1,q_2;wire Q_0,Q_1,cp_u;counter_10 u1 (1,cp_50,q_03:0,Q_0);counter_10 u2 (1,Q_0,q_13:0,Q_1);counter_10 u3 (1,Q_1,q_23:0,cp_u);/20微秒always (posedge cp_u)beginif(bot_1f=bot_1)flag_1<= flag_1+11'b1;elsebeginflag_1<=0;bot_1f <=bot_1;endif(
14、flag_1>11'd2000)beginflag_1<=0;bot_1t<=bot_1f;endif(bot_2f=bot_2)flag_2<= flag_2+11'b1;elsebeginflag_2<=0;bot_2f <=bot_2;endif(flag_2>11'd2000)beginflag_2<=0;bot_2t<=bot_2f;endendalways( posedge bot_1t )beginif(mode=3'b110)&&(mode_slt<3'b101)
15、mode_slt <= mode_slt + 3'b001;else if(mode=3'b110)&&(mode_slt>3'b100)mode_slt <= 3'b001;endendmodulemodulewater_station(key_1,led_sec0,cp_1,wsh_sty,mode,time_flag,led_wt);input 2:0wsh_sty,mode;input 10:0 time_flag;input cp_1,key_1;input7:0 led_sec0;output0:14 led_wt;
16、reg 0:14 led_wt;always (posedge cp_1)beginif(key_1=0)&&(mode!=3'b000)beginif(wsh_sty=3'b001)|(wsh_sty=3'b100)led_wt <= 0;elseled_wt <= led_wt;endelsecase(mode)3'b001,3'b010,3'b011,3'b100:begincase(wsh_sty)3'b000:if(time_flag1:0=2'b00)led_wt <= (le
17、d_wt << 1) + 1'b1;3'b001:led_wt <= led_wt;3'b010:beginif(time_flag=0) led_wt <= 15'h7fff ;if(led_sec0=8'b1001_1001)|(led_sec0=8'b1001_0000)led_wt <= (led_wt >> 1);end3'b011:if(time_flag4:0=3'b00000)led_wt <= (led_wt >> 1);3'b100:begin
18、if(time_flag=0) beginled_wt <= 15'h7fff ;endelseled_wt <= led_wt;enddefault:led_wt <= 15'b0;endcaseend3'b101:beginif(time_flag=0)led_wt <= 15'h00ff;else if(time_flag2:0=3'b000)led_wt <= (led_wt >> 1);enddefault:led_wt <= 15'b0;endcaseendendmodulemodule
19、 control (key_1,mode,cp_1,cp_50,wsh_sty2:0 ,mode_change,led_min0,led_min1 ,led_sec0, led_sec1,min_all1,min_all2,led_wt);input 2:0mode;input cp_1,cp_50,key_1;output 2:0 wsh_sty;output mode_change;output 7:0 led_min0,led_min1,led_sec0, led_sec1,min_all1,min_all2;output14:0 led_wt;/wire 2:0mode;reg2:0
20、wsh_sty;reg1:0dry_flag;reg10:0time_flag;regmode_change,wsh_flag;wire seccp;initialbeginwsh_sty<=3'b000;wsh_flag<=1'b0;dry_flag<=2'b00;endled_show led_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,le
21、d_sec0,cp_1,wsh_sty,mode,time_flag,led_wt);always ( posedge seccp)beginif(key_1=0)&&(mode!=3'b000)beginwsh_sty <= wsh_sty;wsh_flag <= wsh_flag;dry_flag <= dry_flag;time_flag <= time_flag;mode_change <= mode_change;endelsecase(mode)3'b000:beginwsh_sty<=3'b000;wsh
22、_flag<=1'b0;dry_flag<=2'b00;time_flag=0;end/断电状态将洗衣方式清零3'b001,3'b010,3'b011:begincase(wsh_sty)3'b000:/注水beginif(time_flag>=11'd60)&&(wsh_flag=0)begintime_flag=0;wsh_sty<=3'b001;/转到洗衣模式endelse if(time_flag>=11'd60)&&(wsh_flag=1)begint
23、ime_flag=0;wsh_sty<=3'b100;/转到漂洗模式endelsetime_flag <= time_flag + 1'b1 ;end3'b001:/洗衣beginwsh_flag <= 1;if(time_flag>=11'd1800)&&(mode=3'b001)begintime_flag=0;wsh_sty<=3'b010;/转到排水模式endelse if(time_flag>=11'd1200)&&(mode=3'b010)begint
24、ime_flag=0;wsh_sty<=3'b010;/转到排水模式endelse if(time_flag>=11'd600)&&(mode=3'b011)begintime_flag=0;wsh_sty<=3'b010;/转到排水模式endelsetime_flag <= time_flag +1'b1 ;end3'b010:/排水beginif(time_flag>=11'd60)begintime_flag=0;wsh_sty<=3'b011;/转到甩干模式endelse
25、time_flag <= time_flag + 1'b1 ;end3'b011:/甩干beginif(time_flag>=11'd60)&&(dry_flag>=2'b10)begintime_flag =0;dry_flag <= 0;wsh_sty <= 3'b000;wsh_flag<=1'b0;mode_change<=1;/高电平时向外部表示已经洗完,请求改变模式endelse if(time_flag>=11'd60)&&(dry_flag&l
26、t;2'b10)begintime_flag = 0;wsh_sty <= 3'b000;/转到注水模式dry_flag <= dry_flag + 1'b1;endelsetime_flag <= time_flag + 1'b1 ;end3'b100:/漂洗beginif(time_flag>=11'd300)begintime_flag=0;wsh_sty<=3'b010;/转到甩干模式endelsetime_flag <= time_flag +1'b1 ;enddefault:wsh_
27、sty <=3'b000;endcaseend3'b100:begincase(wsh_sty)3'b000:/注水beginif(time_flag>=11'd60)begintime_flag=0;wsh_sty<=3'b100;/转到漂洗模式endelsetime_flag <= time_flag + 1'b1;end3'b010:/排水beginif(time_flag>=11'd60)begintime_flag=0;wsh_sty<=3'b011;/转到甩干模式endels
28、etime_flag <= time_flag + 1'b1 ;end3'b011:/甩干beginif(time_flag>=11'd60)&&(dry_flag>=2'b01)begintime_flag =0;dry_flag <= 0;wsh_sty <= 3'b000;wsh_flag<=1'b0;mode_change<=1;/高电平时向外部表示已经洗完,请求改变模式endelse if(time_flag>=11'd60)&&(dry_flag&
29、lt;2'b01)begintime_flag = 0;wsh_sty <= 3'b000;/转到注水模式dry_flag <= dry_flag + 1'b1;endelsetime_flag <= time_flag + 1'b1 ;end3'b100:/漂洗beginif(time_flag>=11'd300)begintime_flag=0;wsh_sty<=3'b010;/转到排水模式endelsetime_flag <= time_flag + 1'b1 ;enddefault:ws
30、h_sty <=3'b000;endcaseend3'b101:beginwsh_sty <= 3'b011;/甩干if(time_flag>=7'd60)begintime_flag=0;wsh_sty <= 3'b000;wsh_flag<=1'b0;mode_change<=1;/高电平时向外部表示已经洗完,请求改变模式endelsetime_flag <= time_flag + 1'b1;end3'b110:beginwsh_sty<=3'b000;time_fla
31、g=0;wsh_flag<=1'b0;dry_flag<=2'b00;end3'b111:beginwsh_sty<=3'b000;time_flag=0;wsh_flag<=1'b0;dry_flag<=2'b00;mode_change<=0;endendcaseendendmodulemodule counter_6(ncr, en,cp,q);inputcp, ncr,en;output3:0 q;reg3:0 q;always (posedge cp or negedge ncr)beginif(!n
32、cr)q <= 4'b0000;else if(en)q <= q;else if(q = 4'b0101)q <= 4'b0000;else q <= q + 1'b1;endendmodulemodule counter_10 (nclr,clk,Q,out_0); input clk, nclr; output 3:0Q; output out_0; reg 3:0Q; reg out_0;always (posedge clk or negedge nclr) begin if (!nclr) begin Q <= 4
33、9;b000; out_0=0 ; end else if (Q=9) beginQ <= 4'b000; out_0=1;end else beginQ <= Q+1'b1; out_0=0 ; end endendmodulemodule led_show ( key_1,time_flag , mode, wsh_sty,cp_50,cp_1,led_min0,led_min1,led_sec0, led_sec1,min_all1,min_all2,seccp);input 10:0time_flag;input 2:0mode;input 2:0wsh_s
34、ty;input cp_50,cp_1,key_1;output 7:0 led_min0,led_min1,led_sec0, led_sec1,min_all1,min_all2;output seccp;wire 7:0 led_min0,led_min1,led_sec0, led_sec1,min_all1,min_all2,min_use,sec_use,min_all;wire mincp,seccp ;wire 10:0time_flag;wire 2:0mode;wire 2:0wsh_sty;reg 7:0 min_now,sec_now,sec_now_old,min_n
35、ow_old,min_sy,min_sy_old;reg en_time,en_time_all;/initial mincp<=1;counter_60 u1(en_time, seccp,sec_use);counter_60 u2(en_time, mincp,min_use);counter_60 u3(en_time_all,mincp,min_all);assignmincp = key_1 ? (mincp) :(sec_use = 8'b00000000);assignseccp = key_1 ? (seccp):(cp_1);always(posedge cp
36、_50)beginif(time_flag10:0=11'b0)en_time<=0;elseen_time<=1;case(mode)3'b000,3'b110,3'b111:en_time_all <= 0;default:en_time_all <= 1;endcasesec_now_old <= 8'b01011010- sec_use;if(sec_now_old3:0=4'b1010)beginsec_now3:0 <= 0;sec_now7:4 <= sec_now_old7:4+4'
37、;b0001;endelsesec_now <= sec_now_old;case(wsh_sty)3'b001:begincase(mode)3'b001:min_now_old <= 8'b00101001 - min_use;3'b010:min_now_old <= 8'b00011001 - min_use;3'b011:min_now_old <= 8'b00001001 - min_use;default:min_now_old <=0;endcaseend3'b100:min_now_
38、old <= 8'b00000100 - min_use;default:min_now_old <= 0;endcaseif(min_now_old3:0=4'b1010)beginmin_now3:0 <= 0;min_now7:4 <= min_now_old7:4+4'b0001;endelse min_now <= min_now_old ;case(mode)3'b001:beginmin_sy_old <= 8'b01001001 - min_all ;if(min_sy_old3:0=4'b00
39、00) min_sy <=min_sy_old - 8'd7;elsemin_sy <= min_sy_old - 8'b00000001;end3'b010:beginmin_sy_old <= 8'b00111001 - min_all ;if(min_sy_old3:0=4'b0000) min_sy <=min_sy_old - 8'd7;elsemin_sy <= min_sy_old - 8'b00000001;end3'b011:beginmin_sy_old <= 8'b
40、00101001 - min_all ;if(min_sy_old3:0=4'b0000) min_sy <=min_sy_old - 8'd7;elsemin_sy <= min_sy_old - 8'b00000001;end3'b100:beginmin_sy_old <= 8'b00011001 - min_all;if(min_sy_old3:0<4'b0100)min_sy <= min_sy_old - 8'd10;else min_sy <= min_sy_old - 8'b00
41、000100;enddefault:min_sy <= 0;endcaseendled led_1(cp_50,sec_now,led_sec0, led_sec1);led led_2(cp_50,min_now,led_min0, led_min1);led led_3(cp_50,min_sy,min_all1, min_all2);endmodulemodule led(cp_50,BCD,led0, led1);input 7:0 BCD;input cp_50;output 7:0 led0, led1;reg7:0 led0, led1;always ( posedge c
42、p_50)begincasez (BCD3:0)4'd0 : led0 = 8'b1100_0000;4'd1 : led0 = 8'b1111_1001;4'd2 : led0 = 8'b1010_0100;4'd3 : led0 = 8'b1011_0000;4'd4 : led0 = 8'b1001_1001;4'd5 : led0 = 8'b1001_0010;4'd6 : led0 = 8'b1000_0010;4'd7 : led0 = 8'b1111_1
43、000;4'd8 : led0 = 8'b1000_0000;4'd9 : led0 = 8'b1001_0000;default: led0 = 8'b1111_1111;endcasecasez (BCD7:4)4'd0 : led1 = 8'b1100_0000;4'd1 : led1 = 8'b1111_1001;4'd2 : led1 = 8'b1010_0100;4'd3 : led1 = 8'b1011_0000;4'd4 : led1 = 8'b1001_10
44、01;4'd5 : led1 = 8'b1001_0010;4'd6 : led1 = 8'b1000_0010;4'd7 : led1 = 8'b1111_1000;4'd8 : led1 = 8'b1000_0000;4'd9 : led1 = 8'b1001_0000;default: led0 = 8'b1111_1111;endcaseendendmodule/*lcd显示部分*用lcd显示当前的mode */module lcd_show(input CLOCK_50,input RST_N,i
45、nput 2:0mode,/ newoutput7:0 LCD_DATA,input2:0 wsh_sty,input 2:0mode_slt,output LCD_EN,output LCD_RS,output LCD_RW,output LCD_ON,output LCD_BLON);wire7:0 LCD_D_1;wire LCD_RS_1;wire LCD_RW_1;wire LCD_EN_1;wire DLY_RST;assign LCD_DATA=LCD_D_1;assign LCD_RS=LCD_RS_1;assign LCD_RW=LCD_RW_1;assign LCD_EN=
46、LCD_EN_1;assign LCD_ON=1'b1;assign LCD_BLON=1'b1;Reset_Delay r0(.iCLK(CLOCK_50), .oRESET(DLY_RST),.RST_N(RST_N);LCD1602_TEST u1( .iCLK(CLOCK_50), .iRST_N(DLY_RST), .mode(mode),.mode_slt(mode_slt),.wsh_sty(wsh_sty), .LCD_DATA(LCD_D_1), .LCD_RW(LCD_RW_1), .LCD_EN(LCD_EN_1), .LCD_RS(LCD_RS_1) );endmodule/RST_N初始延迟代码: module Rese
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2020-2025年一级建造师之一建市政公用工程实务每日一练试卷A卷含答案
- 小班歌唱教学课件下载
- 《茉莉花》初中教学课件
- Brand KPIs for milk:Berchtesgadener Land in Germany-英文培训课件2025
- 小学生篮球规则教学课件
- 口腔基础知识分享课件
- 2025年新初二英语人教新版尖子生专题复习《书面表达》
- 2025年教育行业数字化转型:数字化教材开发与深度应用策略分析报告
- 2025年文化遗产数字化保护中的数字文化遗产展示技术探讨
- 乡镇接待饭店管理办法
- 钢筋混凝土圆管涵施工
- 青岛离婚协议书
- 眼睑裂伤查房
- 土石方工程股份分红协议
- 《农药学基础》课件
- 小学语文群文阅读教学研究结题报告
- 货车转让不过户合同协议书
- 化工自动化仪表 选择题805-1556
- GB/T 4604-2006滚动轴承径向游隙
- GB/T 12008.2-2010塑料聚醚多元醇第2部分:规格
- 既有住宅适老化改造项目可行性研究报告书
评论
0/150
提交评论