全自动洗衣机的设计-Verilog程序.doc

上传人:美****子 文档编号:57991134 上传时间:2022-11-06 格式:DOC 页数:26 大小:75KB
返回 下载 相关 举报
全自动洗衣机的设计-Verilog程序.doc_第1页
第1页 / 共26页
全自动洗衣机的设计-Verilog程序.doc_第2页
第2页 / 共26页
点击查看更多>>
资源描述

《全自动洗衣机的设计-Verilog程序.doc》由会员分享,可在线阅读,更多相关《全自动洗衣机的设计-Verilog程序.doc(26页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、实验报告学 院:大数据及信息工程学院专 业:电子及通信工程学 号:2021 021718学生姓名:杨 鹏 举指导教师:李 良 荣 2021 年 5 月 24目录一、实验题目3二、实验目的3三、实验要求3四、洗衣机工作原理及功能说明3状态图如下4程序RTL视图如下4五、详细代码如下5模块一实现洗衣机状态转换和各状态输出控制5模块二实现复位信号的异步复位同步释放11模块三实现当前状态的数码管显示12模块四实现按键检测13模块五实现顶层的调用15一、 实验题目自动洗衣机设计二、 实验目的1、熟练掌握Quartus II 工程文件的建立过程。2、掌握Verilog的根本语法、语句、模块的使用。3、了解

2、模块的建立及使用。4、了解FPGA的开发根本流程。三、 实验要求1、初始状态,准备启动。2、开场进水;为防止进水过程出现故障,故不用定时器控制,而是手动给一个信号模拟水位检测传感器,表示进水完成。3、开场洗涤:正反洗涤4次开场排水。4、排水后立即脱水。5、洗涤之后漂洗2次,每次漂洗过后都排水甩干。6、整个过程全部用数码管来显示状态机状态,并用两个led灯表示电机的正转及反转状态。四、 洗衣机工作原理及功能说明自动洗衣机的工作原理:洗衣机有7个工作状态分别为空闲idle、加水water、洗衣wash、排水drain、甩干dry、漂洗rinse、完毕音乐提示music。一次完整的洗涤,进水3次、洗

3、涤1次、漂洗两次、排水3次、甩干3次。一次完整的状态转换为:空闲idle、加水water、洗衣wash、排水drain、甩干dry、加水water、漂洗rinse、排水drain、甩干dry、加水water、漂洗rinse、排水drain、甩干dry、完毕音乐提示music。程序功能说明:程序有4个输入start启动信号、water_test水满检测信号,水满了就置一、drain_test排水检测,水排完了就置一、emergency紧急停顿信号,任何情况下输入都进入idle状态,即停顿工作。一开上电过后系统处于空闲状态,当输入信号start后进入加水状态,水满过后进入浸泡状态,浸泡完毕进入洗衣

4、状态,洗衣完毕进入排水状态,第一次排水完毕进入甩干状态,第一次甩干完成进入加水状态,第二次加水完成后进入第一次漂洗状态,第一次漂洗完毕进入第二次排水状态,排水完毕进入第二次甩干状态,第二次甩干完毕进入第三次加水状态,再进入第二次漂洗状态,第三次排水状态,第三次甩干状态,进入完毕音乐提醒状态,回到空闲状态。洗衣服与漂洗为洗衣电机的低速档位,在排水过程中将电机档位变为高档位。当甩干完毕变到其他状态时,就把电机档位变到低档位。洗涤与漂洗时,电机正转与反转之间有3秒钟的延时即让电机自动减速,不至于电机突然反转时负荷太大烧毁电机。状态图如下程序RTL视图如下4个输入由外部按键输入,经过模块key按键消抖

5、确定按键是否被按下。按键输入到模块washer作为一些状态转换的条件。washer的状态输出到数码管显示模块segmain显示系统当前处于什么状态。系统有4个输出clockwise正转信号0表示转,1表示不转、anticlockwise反转信号0表示转,1表示不转、finish完毕信号0表示完毕,1表示未完毕、cstate表示当前状态。经调试实现了想要的功能。五、详细代码如下模块一实现洗衣机状态转换与各状态输出控制/用1段式状态机,分成3段来写module washer(clk,rst_n,start,water_test,/水满信号drain_test,/排水检测emergency,/紧急情

6、况处理clockwise,/正转信号anticlockwise,/反转信号finish,/完毕信号level,/档位显示 0为高档位 1为低档位cstate/用于显示处于哪个状态parameter idle = 0, inwater = 1,steep = 2,/浸泡 wash = 3,/洗涤drain = 4,/排水 dry = 5,rinse = 6,/漂洗music = 7;reg steep_test;/浸泡完毕信号reg wash_test;/洗涤完毕信号reg dry_test;/甩干完毕信号reg rinse_test;/漂洗完毕信号reg music_test;/音乐完毕信号i

7、nput clk,rst_n;/时钟 复位input start;/启动信号input water_test;/水满信号input drain_test;/排水检测input emergency;/紧急停顿信号output reg clockwise;/正转信号0表示转,1表示不转output reg anticlockwise;/反转信号0表示转,1表示不转output reg finish;/完毕信号0表示完毕,1表示未完毕output 2:0 cstate;/表示现在的状态output reg level;/显示电机档位reg2:0 cstate_r;assign cstate = cs

8、tate_r;reg1:0 water_time;/洗涤一次 漂洗两次reg1:0 drain_time;/排水三次reg1:0 dry_time;/甩干三次always(posedge clk)if(rst_n)begincstate_r = idle;endelsebegincase(cstate_r)idle:if(start) begin /0cstate_r = inwater;/一开场就进入进水状态endelsecstate_r = idle;/1inwater:if(emergency) cstate_r = idle;/遇到紧急情况就停顿 else if(water_test)

9、begincase(water_time)2b00: cstate_r = steep;/水满了就进入浸泡状态2b01: cstate_r = rinse; 2b10: cstate_r = rinse;default: ;endcaseendelse cstate_r = inwater; /2 steep:if(emergency) cstate_r = idle;/遇到紧急情况就停顿 else if(steep_test) cstate_r = wash;/浸泡完毕就进入洗涤状态else cstate_r = steep;/3 wash:if(emergency) cstate_r =

10、idle;/遇到紧急情况就停顿 else if(wash_test) cstate_r = drain;/洗完就进入排水状态 else cstate_r = wash; /4 drain:if(emergency) cstate_r = idle;else if(drain_test) begin cstate_r = dry;endelse cstate_r = drain;/5dry:if(emergency) cstate_r = idle; else if(dry_test) begincase(dry_time) 2b01: cstate_r = inwater; 2b10: cst

11、ate_r = inwater; 2b11: cstate_r = music; default: ;endcase end else cstate_r = dry; /6 rinse:if(emergency) cstate_r = idle; else if(rinse_test) cstate_r = drain; else cstate_r = rinse; /7 music:if(emergency) cstate_r = idle; else if(music_test) cstate_r = idle; else cstate_r = music;default: cstate_

12、r = idle;endcaseendreg28:0 counter;reg3:0 num;/reg in_water;always(posedge clk or negedge rst_n)beginif(rst_n)beginsteep_test = 1b0;wash_test = 1b0;dry_test = 1b0;rinse_test = 1b0;music_test = 1b0;water_time =2d0;drain_time = 2d0;dry_time = 2d0;counter = 29d0;num = 4d0;music_test = 1b0;clockwise = 1

13、b1;anticlockwise = 1b1;finish = 1b1;endelse begincase(cstate_r)idle: begin/0music_test = 1b0;/音乐完毕信号复位clockwise = 1b1;anticlockwise = 1b1;/电机旋转方向信号finish = 1b1;/完毕信号wash_test = 1b0;/洗涤完成信号复位rinse_test = 1b0;dry_test = 1b0;/将甩干标志清零steep_test = 1b0;/将浸泡完毕标志位复位music_test = 1b0;endinwater: begin/1water_

14、test不用置零clockwise = 1b1;anticlockwise = 1b1;level = 1b1;/档位跳到低位档dry_test = 1b0;/将甩干标志清零if(water_test)begin/进水完成信号为外部输入信号if(water_time = 2b11)beginwater_time = 2b00;endelse water_time = water_time + 1b1;endendsteep: begin /2clockwise = 1b1;anticlockwise = 1b1;if(counter = 29d250000000) begincounter =

15、 29d0;steep_test = 1b1;/浸泡10秒钟浸泡完成endelse counter = counter + 1b1;endwash: begin/3steep_test = 1b0;/将浸泡完毕标志位复位case(num)4d0: beginclockwise = 1b0;/正转5秒anticlockwise = 1b1;end4d1: beginclockwise = 1b1;/停转3秒anticlockwise = 1b1;end4d2: beginclockwise = 1b1;/反转5秒anticlockwise = 1b0;end4d3: beginclockwise

16、 = 1b1;/停转3秒anticlockwise = 1b1;end4d4: beginclockwise = 1b0;/正转5秒anticlockwise = 1b1;end4d5: beginclockwise = 1b1;/停转3秒anticlockwise = 1b1;end4d6: beginclockwise = 1b1;/反转5秒anticlockwise = 1b0;end4d7: beginnum = 4d0;wash_test = 1b1;/下一个状态置零clockwise = 1b1;anticlockwise = 1b1;enddefault: begin clock

17、wise = 1b1;anticlockwise = 1b1;endendcaseif(num = 1 | num = 3 | num = 5)beginif(counter = 29d150000000)/延时3秒begincounter = 29d0;num = num + 1b1;endelse counter = counter + 1b1;endelseif(counter = 29d250000000) begincounter = 29d0;num = num + 1b1;endelse counter = counter + 1b1;enddrain:begin/4drain_

18、test不用置零clockwise = 1b1;anticlockwise = 1b1;wash_test = 1b0;/洗涤完成信号复位rinse_test = 1b0;/漂洗完成信号复位level = 1b0;/调节档位到高档位if(drain_test)begin/排水信号为外部输入信号if(drain_time = 2b11)begin/排水3次drain_time = 2b00;endelse drain_time = drain_time + 1b1;endenddry: begin/5clockwise = 1b0;/甩干正转信号置1anticlockwise = 1b1;if(

19、counter = 29d250000000) begincounter = 29d0;clockwise = 1b1;/停顿正转anticlockwise = 1b1;dry_test = 1b1;/甩干完成 未清零所以一次跳两个状态if(dry_time = 2b11)begindry_time = 2b00;endelse dry_time = dry_time + 1b1;endelse counter = counter + 1b1;endrinse: begin /6case(num)4d0:beginclockwise = 1b0;/正转5秒anticlockwise = 1b1

20、;end4d1:beginclockwise = 1b1;/停顿转动3秒anticlockwise = 1b1;end4d2:beginclockwise = 1b1;/反转5秒anticlockwise = 1b0;end4d3:beginrinse_test = 1b1;num = 3d0;clockwise = 1b1;/停顿转动anticlockwise = 1b1;enddefault:;endcaseif(num = 1)beginif(counter = 29d150000000)/延时3秒begincounter = 29d0;num = num + 1b1;endelse c

21、ounter = counter +1;endelseif(counter = 29d250000000)begin/延时5秒counter = 29d0;num = num + 1b1;endelse counter = counter + 1b1;endmusic: begin /7clockwise = 1b1;anticlockwise = 1b1;level = 1b1;/将档位调到低档位dry_test = 1b0;/将甩干完成信号复位finish = 1b0;/完毕将完毕信号置1if(counter = 29d50000000) begincounter = 29d0;music

22、_test = 1b1;end else counter = counter + 1b1;enddefault: ;endcaseendendendmodule模块三实现当前状态的数码管显示module segmain(clk,rst_n,datain,seg_data,seg_cominput clk;input rst_n;input2:0datain;output7:0seg_data;output seg_com;reg7:0seg_data;reg2:0bcd_led;reg18:0count;assign seg_com = 1b0;always(posedge clk)begin

23、if(rst_n)begincount = 19d0;endelsecount = count + 1b1;endalways(posedge clk)beginif(count18)beginbcd_led = datain;endendalways(bcd_led)begincase(bcd_led)4h0:seg_data = 8hc0;/0共阳低有效4h1:seg_data = 8hf9;/14h2:seg_data = 8ha4;/24h3:seg_data = 8hb0;/34h4:seg_data = 8h99;/44h5:seg_data = 8h92;/54h6:seg_da

24、ta = 8h82;/64h7:seg_data = 8hf8;/7/4h8:seg_data = 8h80;/8/4h9:seg_data = 8h90;/9/4ha:seg_data = 8h88;/A/4hb:seg_data = 8h83;/B/4hc:seg_data = 8hc6;/C/4hd:seg_data = 8ha1;/D/4he:seg_data = 8h86;/E/4hf:seg_data = 8h8e;/Fdefault:seg_data = 8hc0;/0endcaseendendmodule模块四实现按键检测module keyclk,rst_n,sw,start

25、,water_test,drain_test,emergencyinput clk;/主时钟信号,50MHzinput rst_n;/复位信号,低有效input3:0 sw; /三个独立按键,低表示按下output reg start;/启动信号output reg water_test;/水满信号output reg drain_test;/排水检测output reg emergency;/紧急停顿信号 reg3:0 key_rst; always (posedge clk or negedge rst_n) if (!rst_n) key_rst = 3b111; else key_rs

26、t = sw;/将按键状态存入存放器中reg3:0 key_rst_r; /每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中always ( posedge clk or negedge rst_n ) if (!rst_n) key_rst_r = 4b1111; else key_rst_r = key_rst;/存放器中存入按键上个时钟周期的按键状态/当存放器key_rst由1变为0时,led_an的值变为高,维持一个时钟周期 wire3:0 key_an = key_rst_r & (key_rst);reg19:0 cnt;/计数存放器always (posedge c

27、lk or negedge rst_n) if (!rst_n) cnt = 20d0;/异步复位else if(key_an) cnt =20d0;/检测到有键被按下可能是按键抖动直到检测不到 else cnt = cnt + 1b1;/就将计数器清零reg3:0 low_sw;always (posedge clk or negedge rst_n) if (!rst_n) low_sw = 4b1111;else if (cnt = 20hfffff) /满20ms,将按键值锁存到存放器low_sw中 cnt = 20hfffff low_sw = sw;reg 3:0 low_sw_r

28、; /每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中always ( posedge clk or negedge rst_n ) if (!rst_n) low_sw_r = 4b1111; else low_sw_r = low_sw;wire3:0 led_ctrl = low_sw_r3:0 & ( low_sw3:0);always (posedge clk or negedge rst_n) if (!rst_n) beginstart = 1b0;/启动信号water_test = 1b0;/水满信号drain_test = 1b0;/排水检测emergency

29、= 1b0;/紧急信号 end else begin if ( led_ctrl0 ) start = 1b1; else start = 1b0; if ( led_ctrl1 ) water_test = 1b1; else water_test = 1b0; if ( led_ctrl2 ) drain_test = 1b1; else drain_test = 1b0; if ( led_ctrl3 ) emergency = 1b1; else emergency = 1b0; endendmodule模块五实现顶层的调用module washer_top(input clk,rst

30、_n,start,water_test,/水满信号drain_test,/排水检测emergency,/紧急情况处理 output clockwise,/正转信号anticlockwise,/反转信号finish,/完毕信号level, output7:0seg_data, outputseg_comwire sys_rst_n;wire start1;wire water_test1;wire drain_test1;wire emergency1;wire2:0 cstate;washer washer(.clk(clk),.rst_n(sys_rst_n),.start(start1),

31、.water_test(water_test1),/水满信号.drain_test(drain_test1),/排水检测.emergency(emergency1),/紧急情况处理.clockwise(clockwise),/正转信号.anticlockwise(anticlockwise),/反转信号.finish(finish),/完毕信号.cstate(cstate)synchronism_design syschronism(.clk(clk),.rst_n(rst_n),.sys_rst_n(sys_rst_n)segmainsegmain(.clk(clk),.rst_n(sys_rst_n),.datain(cstate),.seg_data(seg_data),.seg_com(seg_com)keykey.clk(clk),.rst_n(sys_rst_n),.sw(emergency,start,water_test,drain_test),.start(start1),.water_test(water_test1),.drain_test(drain_test1),.emergency(emergency1)endmodule第 26 页

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 文案大全

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁