全自动洗衣机的设计Verilog程序Word版_第1页
全自动洗衣机的设计Verilog程序Word版_第2页
全自动洗衣机的设计Verilog程序Word版_第3页
全自动洗衣机的设计Verilog程序Word版_第4页
全自动洗衣机的设计Verilog程序Word版_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、传播优秀word版文档 ,希望对您有帮助,可双击去除!实验报告学 院:大数据与信息工程学院专 业:电子与通信工程学 号:2015021718学生姓名:杨 鹏 举指导教师:李 良 荣 2016 年 5 月 24传播优秀word版文档 ,希望对您有帮助,可双击去除!目录一、实验题目3二、实验目的3三、实验要求3四、洗衣机工作原理与功能说明3状态图如下4程序rtl视图如下4五、详细代码如下5模块一实现洗衣机状态转换和各状态输出控制5模块二实现复位信号的异步复位同步释放11模块三实现当前状态的数码管显示12模块四实现按键检测13模块五实现顶层的调用15传播优秀word版文档 ,希望对您有帮助,可双击去

2、除!实验题目自动洗衣机设计一、 实验目的1、熟练掌握quartus ii 工程文件的建立过程。2、掌握verilog的基本语法、语句、模块的使用。3、了解模块的建立与使用。4、了解fpga的开发基本流程。二、 实验要求1、初始状态,准备启动。2、开始进水;为防止进水过程出现故障,故不用定时器控制,而是手动给一个信号模拟水位检测传感器,表示进水完成。3、开始洗涤:正反洗涤4次开始排水。4、排水后立即脱水。5、洗涤之后漂洗2次,每次漂洗过后都排水甩干。6、整个过程全部用数码管来显示状态机状态,并用两个led灯表示电机的正转与反转状态。三、 洗衣机工作原理与功能说明自动洗衣机的工作原理:洗衣机有7个

3、工作状态分别为空闲(idle)、加水(water)、洗衣(wash)、排水(drain)、甩干(dry)、漂洗(rinse)、结束音乐提示(music)。一次完整的洗涤,进水3次、洗涤1次、漂洗两次、排水3次、甩干3次。一次完整的状态转换为:空闲(idle)、加水(water)、洗衣(wash)、排水(drain)、甩干(dry)、加水(water)、漂洗(rinse)、排水(drain)、甩干(dry)、加水传播优秀word版文档 ,希望对您有帮助,可双击去除!(water)、漂洗(rinse)、排水(drain)、甩干(dry)、结束音乐提示(music)。程序功能说明:程序有4个输入st

4、art启动信号、water_test水满检测信号,水满了就置一、drain_test排水检测,水排完了就置一、emergency紧急停止信号,任何情况下输入都进入idle状态,即停止工作。一开上电过后系统处于空闲状态,当输入信号start后进入加水状态,水满过后进入浸泡状态,浸泡完毕进入洗衣状态,洗衣完毕进入排水状态,第一次排水完毕进入甩干状态,第一次甩干完成进入加水状态,第二次加水完成后进入第一次漂洗状态,第一次漂洗完毕进入第二次排水状态,排水完毕进入第二次甩干状态,第二次甩干完毕进入第三次加水状态,再进入第二次漂洗状态,第三次排水状态,第三次甩干状态,进入结束音乐提醒状态,回到空闲状态。洗

5、衣服和漂洗为洗衣电机的低速档位,在排水过程中将电机档位变为高档位。当甩干完毕变到其他状态时,就把电机档位变到低档位。洗涤和漂洗时,电机正转和反转之间有3秒钟的延时(即让电机自动减速,不至于电机突然反转时负荷太大烧毁电机)。状态图如下传播优秀word版文档 ,希望对您有帮助,可双击去除!程序rtl视图如下4个输入由外部按键输入,经过模块key按键消抖确定按键是否被按下。按键输入到模块washer作为一些状态转换的条件。washer的状态输出到数码管显示模块segmain显示系统当前处于什么状态。系统有4个输出clockwise正转信号0表示转,1表示不转、anticlockwise反转信号0表示

6、转,1表示不转、finish结束信号0表示结束,1表示未结束、cstate表示当前状态。经调试实现了想要的功能。传播优秀word版文档 ,希望对您有帮助,可双击去除!五、详细代码如下模块一实现洗衣机状态转换和各状态输出控制/-/用1段式状态机,分成3段来写/-module washer(clk,rst_n,start,water_test,/水满信号drain_test,/排水检测emergency,/紧急情况处理clockwise,/正转信号anticlockwise,/反转信号finish,/结束信号level,/档位显示 0为高档位 1为低档位cstate/用于显示处于哪个状态);par

7、ameter 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;/音乐结束信号input clk,rst_n;/时钟 复位input start;/启动信号input water_test;/水满信号input drain_test;/排水检测input emer

8、gency;/紧急停止信号output reg clockwise;/正转信号0表示转,1表示不转output reg anticlockwise;/反转信号0表示转,1表示不转传播优秀word版文档 ,希望对您有帮助,可双击去除!output reg finish;/结束信号0表示结束,1表示未结束output 2:0 cstate;/表示现在的状态output reg level;/显示电机档位reg2:0 cstate_r;assign cstate = cstate_r;reg1:0 water_time;/洗涤一次 漂洗两次reg1:0 drain_time;/排水三次reg1:0

9、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)begincase(water_time)2'b00: cstate_r <= st

10、eep;/水满了就进入浸泡状态2'b01: cstate_r <= rinse; 2'b10: 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 <= id

11、le;/遇到紧急情况就停止 else if(wash_test) cstate_r <= drain;/洗完就进入排水状态传播优秀word版文档 ,希望对您有帮助,可双击去除! 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) beginc

12、ase(dry_time) 2'b01: cstate_r <= inwater; 2'b10: cstate_r <= inwater; 2'b11: 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)

13、cstate_r <= idle; else if(music_test) cstate_r <= idle; else cstate_r <= music;default: cstate_r <= idle;endcaseendreg28:0 counter;reg3:0 num;/reg in_water;always(posedge clk or negedge rst_n)beginif(rst_n)beginsteep_test <= 1'b0;wash_test <= 1'b0;dry_test <= 1'b0;ri

14、nse_test <= 1'b0;music_test <= 1'b0;water_time <=2'd0;传播优秀word版文档 ,希望对您有帮助,可双击去除!drain_time <= 2'd0;dry_time <= 2'd0;counter <= 29'd0;num <= 4'd0;music_test <= 1'b0;clockwise <= 1'b1;anticlockwise <= 1'b1;finish <= 1'b1;end

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

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

17、b1;endendsteep: begin /2clockwise <= 1'b1;anticlockwise <= 1'b1;if(counter = 29'd250000000) begincounter <= 29'd0;steep_test <= 1'b1;/浸泡10秒钟浸泡完成endelse counter <= counter + 1'b1;endwash: begin/3传播优秀word版文档 ,希望对您有帮助,可双击去除!steep_test <= 1'b0;/将浸泡结束标志位复位cas

18、e(num)4'd0: beginclockwise <= 1'b0;/正转5秒anticlockwise <= 1'b1;end4'd1: beginclockwise <= 1'b1;/停转3秒anticlockwise <= 1'b1;end4'd2: beginclockwise <= 1'b1;/反转5秒anticlockwise <= 1'b0;end4'd3: beginclockwise <= 1'b1;/停转3秒anticlockwise <

19、= 1'b1;end4'd4: beginclockwise <= 1'b0;/正转5秒anticlockwise <= 1'b1;end4'd5: beginclockwise <= 1'b1;/停转3秒anticlockwise <= 1'b1;end4'd6: beginclockwise <= 1'b1;/反转5秒anticlockwise <= 1'b0;end4'd7: beginnum <= 4'd0;wash_test <= 1'

20、;b1;/下一个状态置零clockwise <= 1'b1;anticlockwise <= 1'b1;enddefault: begin clockwise <= 1'b1;anticlockwise <= 1'b1;endendcaseif(num = 1 | num = 3 | num = 5)beginif(counter = 29'd150000000)/延时3秒传播优秀word版文档 ,希望对您有帮助,可双击去除!begincounter <= 29'd0;num <= num + 1'b1

21、;endelse counter <= counter + 1'b1;endelseif(counter = 29'd250000000) begincounter <= 29'd0;num <= num + 1'b1;endelse counter <= counter + 1'b1;enddrain:begin/4drain_test不用置零clockwise <= 1'b1;anticlockwise <= 1'b1;wash_test <= 1'b0;/洗涤完成信号复位rinse_

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

23、;d250000000) begincounter <= 29'd0;clockwise <= 1'b1;/停止正转anticlockwise <= 1'b1;dry_test <= 1'b1;/甩干完成 未清零所以一次跳两个状态if(dry_time = 2'b11)begindry_time <= 2'b00;endelse dry_time <= dry_time + 1'b1;endelse counter <= counter + 1'b1;endrinse: begin /6c

24、ase(num)4'd0:begin传播优秀word版文档 ,希望对您有帮助,可双击去除!clockwise <= 1'b0;/正转5秒anticlockwise <= 1'b1;end4'd1:beginclockwise <= 1'b1;/停止转动3秒anticlockwise <= 1'b1;end4'd2:beginclockwise <= 1'b1;/反转5秒anticlockwise <= 1'b0;end4'd3:beginrinse_test <= 1

25、9;b1;num <= 3'd0;clockwise <= 1'b1;/停止转动anticlockwise <= 1'b1;enddefault:;endcaseif(num = 1)beginif(counter = 29'd150000000)/延时3秒begincounter <= 29'd0;num <= num + 1'b1;endelse counter <= counter +1;endelseif(counter = 29'd250000000)begin/延时5秒counter <

26、;= 29'd0;num <= num + 1'b1;endelse counter <= counter + 1'b1;endmusic: begin /7clockwise <= 1'b1;anticlockwise <= 1'b1;level <= 1'b1;/将档位调到低档位dry_test <= 1'b0;/将甩干完成信号复位finish <= 1'b0;/结束将结束信号置1if(counter = 29'd50000000) begincounter <= 29&

27、#39;d0;music_test <= 1'b1;传播优秀word版文档 ,希望对您有帮助,可双击去除!end else counter <= counter + 1'b1;enddefault: ;endcaseendendendmodule模块三实现当前状态的数码管显示module segmain(clk,rst_n,datain,seg_data,seg_com);input clk;input rst_n;input2:0datain;output7:0seg_data;output seg_com;reg7:0seg_data;reg2:0bcd_led

28、;reg18:0count;assign seg_com = 1'b0;always(posedge clk)beginif(rst_n)begincount <= 19'd0;endelsecount <= count + 1'b1;endalways(posedge clk)beginif(count18)beginbcd_led <= datain;传播优秀word版文档 ,希望对您有帮助,可双击去除!endendalways(bcd_led)begincase(bcd_led)4'h0:seg_data = 8'hc0;/0共阳

29、低有效4'h1:seg_data = 8'hf9;/14'h2:seg_data = 8'ha4;/24'h3:seg_data = 8'hb0;/34'h4:seg_data = 8'h99;/44'h5:seg_data = 8'h92;/54'h6:seg_data = 8'h82;/64'h7:seg_data = 8'hf8;/7/4'h8:seg_data = 8'h80;/8/4'h9:seg_data = 8'h90;/9/4'

30、ha:seg_data = 8'h88;/a/4'hb:seg_data = 8'h83;/b/4'hc:seg_data = 8'hc6;/c/4'hd:seg_data = 8'ha1;/d/4'he:seg_data = 8'h86;/e/4'hf:seg_data = 8'h8e;/fdefault:seg_data = 8'hc0;/0endcaseendendmodule模块四实现按键检测module key(clk,rst_n,sw,start,water_test,drain_tes

31、t,emergency);input 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; 传播优秀word版文档 ,希望对您有帮助,可双击去除!always (posedge clk or negedge rst_n) if (!rst_n) key_rst <= 3

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

33、_rst);/-reg19:0 cnt;/计数寄存器always (posedge clk or negedge rst_n) if (!rst_n) cnt <= 20'd0;/异步复位else if(key_an) cnt <=20'd0;/检测到有键被按下(可能是按键抖动直到检测不到) else cnt <= cnt + 1'b1;/就将计数器清零 reg3:0 low_sw;always (posedge clk or negedge rst_n) if (!rst_n) low_sw <= 4'b1111;else if (cn

34、t = 20'hfffff) /满20ms,将按键值锁存到寄存器low_sw中 cnt = 20'hfffff low_sw <= sw; /-reg 3:0 low_sw_r; /每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中always ( posedge clk or negedge rst_n ) if (!rst_n) low_sw_r <= 4'b1111; else low_sw_r <= low_sw;wire3:0 led_ctrl = low_sw_r3:0 & ( low_sw3:0);always (posedge clk or negedge rst_n)传播优秀word版文档 ,希望对您有帮助,可双击去除! if (!rst_n) beginstart <= 1'b0;/启动信号water_test <= 1'b0;/水满信号drain_test <= 1'b0;/排水检测emergency <= 1'b0;/紧急信号 end else begin if ( led_ctrl0 ) start <= 1'b1; else start &l

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论