EDA洗衣机控制器资料(共17页).doc
精选优质文档-倾情为你奉上东 北 石 油 大 学课 程 设 计课 程 EDA技术课程设计 题 目 洗衣机控制器 院 系 专业班级 学生姓名 谭 伟 学生学号 指导教师 2017年 3 月3日专心-专注-专业东北石油大学课程设计任务书课程 EDA技术课程设计题目 洗衣机控制器专业 姓名 谭 伟 学号主要内容、基本要求、主要参考资料等主要内容:设计一个洗衣机控制器,要求洗衣机有正转、反转、暂停三种状态。设定洗衣机的工作时间,要洗衣机在工作时间内完成:定时启动®正转20秒®暂停10秒®反转20秒®暂停10秒®定时未到回到“正转20秒®暂停10秒®”,定时到则停止,同时发出提示音。基本要求:1、设计一个电子定时器,控制洗衣机作如下运转:定时启动®正转20秒®暂停10秒®反转20秒®暂停10秒®定时未到回到“正转20秒®暂停10秒®”,定时到则停止;2、若定时到,则停机发出音响信号;3、用两个数码管显示洗涤的预置时间(分钟数),按倒计时方式对洗涤过程作计时显示,直到时间到停机;洗涤过程由“开始”信号开始;4、三只LED灯表示“正转”、“反转”、“暂停”三个状态。主要参考资料:1夏宇闻.Verilog数字系统设计(第2版)M. 北京:北京航空航天大学出版社,2008.2潘松.EDA技术实用教程-Verilog HDL版(第五版)M. 北京:科学出版社,2010.3阎石.数字电子技术基础(第五版) M. 北京:高教出版社,2006.完成期限 2017.3.3 指导教师 专业负责人 2017年2月27日一、设计思想1.基本原理(1)本课程设计编程采用模块化的硬件描述语言Verilog HDL进行设计。(2)洗衣机控制器的设计主要是时序控制和定时器的设计。(3)使用分频模块输出1Hz方波,给定时器设定秒数每1s自加1的信号。当开始信号发出后,秒数开始自加,至59时置0,并给分钟进位,由于倒计时显示分钟数,将分钟数减一再显示,过程由定时时间模块完成。将分钟数显示由数码管显示模块实现。同时定时器的值输入到时序控制模块由此可以控制洗衣机的正转、反转、暂停工作方式及工作状态灯。2.设计框图本课程设计框图由四个部分组成:开始信号、预置时间、数码管显示、洗衣机工作及时间脉冲。框图如图1下:数码管显示 洗衣机工作预置时间开始信号 时间脉冲 图1洗衣机的设计框图二、设计步骤和调试过程1.模块设计及相应模块代码(1)分频模块本课程设计选用器件系列Family :Cyclone IV E 芯片选择Avaliable devices:EP4CE115F29C7(信号频率固定为50MHz)分频模块的作用是将50MHz分频为1Hz,即周期为1s,用于计数。模块代码如下:module fp(clk_in,clk_out);/clk_in为芯片输出频率,clk_out为1Hzinput clk_in;output reg clk_out;reg 31:0 q;initial q=0;always(posedge clk_in)if(q=) begin clk_out<=1;q<=q+1; endelse if(q=) begin clk_out<=0;q<=0; endelse q<=q+1;endmodule(2)定时时间自减部分写在顶层文件中,部分代码如下,详见(6)顶层文件源代码。assign clks0=clks&&start; /检测分频信号clks和开始信号startalways(posedge clks0 ) if(s=59) begin s<=0;clkm<=1;end else if(m=0)&&(s=0) s<=0;/停机 else begin s<=s+1;. clkm<=0; endassign clkm0=clkm|!sm; /进位信号clkm和输入分钟数smalways(posedge clkm0 ) begin m<=m-1; end/定时分钟数自减用分频模块中的clks信号和开始信号,对计数部分进行控制。当检测到开始信号为1和时钟信号高电平时,秒数开始累加。当秒数等于59时,将秒数置0,并且将进位信号置1,用于控制分钟部分。同时分钟数检测到进位信号为1且预置分钟数不为0,将现有分钟数自减1。预置分钟数由用户给定,以上则完成定时时间自减模块。(3)时序控制部分写在顶层文件中,部分代码如下,详见(6)顶层文件源代码。always(posedge clks0)/检测时钟上升沿 if(start)/检测开始信号 begin if( (8'h00)<(s+2) &&(s+2) <=8'h14) ) begin D1=1;D2=0;D3=0;end/0-20s正转 else if( (s+2)<=8'h1e) begin D3=1;D2=0;D1=0;end/20-30s暂停 else if( (s+2)<=8'h32) begin D2=1;D1=0;D3=0;end/30-50s反转 else beginD3=1;D2=0;D1=0;end/50-59s暂停 end else beginD3=0;D2=0;D1=0;end/停机状态当检测到时钟信号为高电平时,即时间又过1s,判断秒数所属区间确定洗衣机工作方式和工作状态灯。如果秒数小于20,即洗衣机正转,同时正转状态灯亮;如果秒数大于20并且小于30,即洗衣机暂停,同时暂停状态灯亮; 如果秒数大于30小于50,即洗衣机反转,同时反转状态灯亮;如果秒数大于50,即洗衣机暂停,同时暂停状态灯亮。(4)数码管显示模块module m10led(m,s,m1,m0,s0,s1); /将分秒的个位十位分离成两组十六进制数input7:0 m,s;wire 6:0 a0,a1,b0,b1;output7:0 s0,s1,m1,m0;wire7:0 seg0,seg1;assign a0=s%10,a1=s/10;assign seg07:4,seg03:0=a13:0,a03:0;led m00(.SW(seg0),.HEX1(s1),.HEX0(s0);/秒数显示assign b0=m%10,b1=m/10;assign seg17:4,seg13:0=b13:0,b03:0;led m01(.SW(seg1),.HEX1(m1),.HEX0(m0);/显示实时分钟数endmodulemodule led(SW,HEX1,HEX0); /将两组十六进制数转码为数码管显示的数值input 7:0SW;output reg6:0HEX1,HEX0;parameter seg0= 7'b,seg1 = 7'b,seg2 = 7'b,seg3 = 7'b,seg4 = 7'b,seg5 = 7'b,seg6 = 7'b,seg7 = 7'b,seg8 = 7'b,seg9 = 7'b,sega = 7'b,segb = 7'b,segc = 7'b,segd = 7'b,sege = 7'b,segf = 7'b;always (*)case(SW3:0) 4'h0: HEX06:0 = seg0;4'h1: HEX06:0 = seg1;4'h2: HEX06:0 = seg2;4'h3: HEX06:0 = seg3;4'h4: HEX06:0 = seg4;4'h5: HEX06:0 = seg5;4'h6: HEX06:0 = seg6;4'h7: HEX06:0 = seg7;4'h8: HEX06:0 = seg8;4'h9: HEX06:0 = seg9;4'ha: HEX06:0 = sega;4'hb: HEX06:0 = segb;4'hc: HEX06:0 = segc;4'hd: HEX06:0 = segd;4'he: HEX06:0 = sege;default:HEX06:0 = seg0;endcasealways (*)case(SW7:4)4'h0: HEX16:0 = seg0;4'h1: HEX16:0 = seg1;4'h2: HEX16:0 = seg2;4'h3: HEX16:0 = seg3;4'h4: HEX16:0 = seg4;4'h5: HEX16:0 = seg5;4'h6: HEX16:0 = seg6;4'h7: HEX16:0 = seg7;4'h8: HEX16:0 = seg8;4'h9: HEX16:0 = seg9;4'ha: HEX16:0 = sega;4'hb: HEX16:0 = segb;4'hc: HEX16:0 = segc;4'hd: HEX16:0 = segd;default:HEX16:0 = seg0;endcaseendmodule数码管显示模块包括将八进制的秒数和分钟数的个位十位分离成两组十六进制数,并将两组十六进制数转码为数码管显示的数值。模块m10led的作用是分和秒的个位十位分离成两组十六进制数。模块led将两组十六进制数转码为数码管显示的数值。可被调用,简化编码。(5)定时停机音响信号部分写在顶层文件中,部分代码如下,详见(6)顶层文件源代码。always(s,m) if(m=0&&s=0) begin bo=1;end else bo=0;当检测秒数和分钟数都为0时,即倒计时结束,发出停机音响信号。(6)顶层文件module Washer(bo,s0,s1,m1,m0,clk,start,sm,D1,D2,D3,m,s); input clk,sm,start;output6:0 s0,s1,m1,m0;output reg bo;output reg D1,D2,D3;output m,s;wire clks0,clkm0;reg clkm;reg7:0 m,s;initial begin m=5;s=0;D1=0;D2=0;D3=0;end assign clks0=clk&&start; always(posedge clks0 ) if(s=59) begin s<=0;clkm<=1;end else if(m=0)&&(s=0) s<=0; else begin s<=s+1; clkm<=0; endassign clkm0=clkm|!sm; always(posedge clkm0 ) begin m<=m-1; endalways(posedge clks0) begin if(start) begin if( (8'h00)<(s+2) &&(s+2) <=8'h14) ) begin D1=1;D2=0;D3=0;end else if( (s+2)<=8'h1e) begin D3=1;D2=0;D1=0;end else if( (s+2)<=8'h32) begin D2=1;D1=0;D3=0;end else beginD3=1;D2=0;D1=0;end end else beginD3=0;D2=0;D1=0;end endalways(s,m) if(m=0&&s=0) begin bo=1;end else bo=0; m10led m20(.m(m),.s(s),.m1(m1),.m0(m0),.s0(s0),.s1(s1);endmodule顶层文件实现洗衣机控制器的所有功能。2.仿真及仿真结果分析(1)分频模块测试文件代码:module fp_vlg_tst();reg clk_in; wire clk_out; fp i1 (.clk_in(clk_in),.clk_out(clk_out);initial begin clk_in=0; end always begin #10000 clk_in=clk_in; end endmodule仿真结果截图如下:图2分频模块仿真图 结果分析:将50MHz分频成1Hz,上图可见,实验结果良好。(2)定时时间自减模块测试文件代码:timescale 1 us/ 1 nsmodule settime_vlg_tst();reg clk;reg 7:0sm;reg start; wire 7:0 m;wire 7:0 s; settime i1 (.clk(clk),.m(m),.s(s),.sm(sm),.start(start);initial begin clk=0; sm=8'h5; start=1; end always begin # clk=clk; end endmodule仿真结果截图如下:图3定时时间自减模块仿真图结果分析:预置时间为5min,当秒数进行累加到59时,上图中倒数第二行从8h05变成8h04。即完成自减。倒数第一行为秒数计数显示;第二行为分钟数计数显示;第二行为时钟信号,即1Hz,用于计数。第三行为预置时间显示,为8h05;第四行为开始信号,当开始信号为1时,秒数计数开始。(3)时序控制模块测试文件代码:timescale 1 ns/ 1 psmodule control_vlg_tst();reg eachvec;reg7:0 sec;reg start; wire D1;wire D2;wire D3; control i1 (.D1(D1),.D2(D2),.D3(D3),.sec(sec),.start(start);initial begin sec=8'h0; start=1;end always begin #200 sec<=sec+8'h1; end endmodule仿真结果截图如下:图4时序控制0-20s仿真图结果分析:利用秒数大小判断机器工作所属状态。当秒数在0到20s区间,即洗衣机工作在正转状态,以上截图即为洗衣机正转状态。第二行为秒数计数显示;第三行为开始信号,处于高电平状态;第四行为正转状态D1;第五行为反转状态D2;最后一行为暂停状态D3。上图中,D1处于高电平,D2和D3处于低电平,此时洗衣机处于正转状态。图5时序控制20-30s仿真图结果分析:利用秒数大小判断机器工作所属状态。当秒数在20到30s区间,即洗衣机工作在暂停状态,以上截图即为洗衣机暂停状态。第二行为秒数计数显示;第三行为开始信号,处于高电平状态;第四行为正转状态D1;第五行为反转状态D2;最后一行为暂停状态D3。上图中,D3处于高电平,D1和D2处于低电平,此时洗衣机处于暂停状态。图6时序控制30-50s仿真图结果分析:利用秒数大小判断机器工作所属状态。当秒数在30到50s区间,即洗衣机工作在反转状态,以上截图即为洗衣机反转状态。第二行为秒数计数显示;第三行为开始信号,处于高电平状态;第四行为正转状态D1;第五行为反转状态D2;最后一行为暂停状态D3。上图中,D2处于高电平,D1和D3处于低电平,此时洗衣机处于反转状态。(5)定时停机音响信号模块测试文件代码:timescale 1 ns/ 1 psmodule sound_vlg_tst();reg eachvec;reg m;reg s; wire bo; sound i1 (.bo(bo),.m(m),.s(s);initial begin m=1;s=1; end always begin #200 m=1; #200 m=0;#200 m=0;#200 m=1;end always begin #200 s=0;#200 s=1;#200 s=0;#200 s=1; end endmodule仿真结果截图如下:图7定时停机声音信号仿真图结果分析:当检测到秒数和分钟数都为0时,停机声音信号触发。观察上图,第二行为分钟数是否为0信号;第三行为秒数是否为0信号;最后一行为定时停机信号。当分钟数不为0,并且秒数不为0时,定时停机声音信号不触发;当分钟数不为0,并且秒数为0时,定时停机声音信号不触发;当分钟数不为0,并且秒数为1时,定时停机声音信号不触发;当分钟数为0,并且秒数为0时,定时停机声音信号触发。3.实验调试结果以下调试为整体顶层文件调试。测试文件代码:timescale 1 us/ 1 nsmodule Washer_vlg_tst();reg eachvec;reg clk;reg 7:0sm;reg start; wire D1;wire D2;wire D3;wire bo;wire 7:0 m;wire 6:0 m0;wire 6:0 m1;wire 7:0 s;wire 6:0 s0;wire 6:0 s1;Washer i1 (.D1(D1),.D2(D2),.D3(D3),.bo(bo),.clk(clk),.m(m),.m0(m0),.m1(m1),.s(s),.s0(s0),.s1(s1),.sm(sm),.start(start) );initial begin clk=0;sm=8'h5;start=1; end always begin #50000 clk=clk; end endmodule仿真结果截图如下:图8整体仿真初始状态图图8结果分析:上图为整体仿真初始状态图。第二行为时钟信号,即1Hz;第三行为预置时间显示,仿真预置时间为8h05;第四行为开始信号;第五行为洗衣机正转状态灯D1;第六行为洗衣机反转状态灯D2;第七行为洗衣机暂停状态灯D3;第八行为洗衣机停机声音信号BO;第九行为洗衣机分钟数显示;第十行和十一行为洗衣机剩余分钟数数码管显示;第十二行为秒数计数显示;第十三行和十四行为洗衣机剩余秒数数码管显示,可不计。预置时间与剩余分钟数显示相同,都为8h05;秒数开始在自累加;数码管显示数据时时变化。由于秒数小于20,即洗衣机正转状态灯D1为高电平,洗衣机运行在正转状态。图9整体仿真20s处图图9结果分析:上图为整体仿真20s处图。第二行为时钟信号,即1Hz;第三行为预置时间显示,仿真预置时间为8h05;第四行为开始信号;第五行为洗衣机正转状态灯D1;第六行为洗衣机反转状态灯D2;第七行为洗衣机暂停状态灯D3;第八行为洗衣机停机声音信号BO;第九行为洗衣机分钟数显示;第十行和十一行为洗衣机剩余分钟数数码管显示;第十二行为秒数计数显示;第十三行和十四行为洗衣机剩余秒数数码管显示,可不计。 当秒数自累加为20时,洗衣机暂停状态灯D3由低电平变为高电平,洗衣机正转状态灯D1由高电平变为低电平 ,即洗衣机由正转状态转为暂停状态。图10整体仿真30s处图图10结果分析:上图为整体仿真30s处图。第二行为时钟信号,即1Hz;第三行为预置时间显示,仿真预置时间为8h05;第四行为开始信号;第五行为洗衣机正转状态灯D1;第六行为洗衣机反转状态灯D2;第七行为洗衣机暂停状态灯D3;第八行为洗衣机停机声音信号BO;第九行为洗衣机分钟数显示;第十行和十一行为洗衣机剩余分钟数数码管显示;第十二行为秒数计数显示;第十三行和十四行为洗衣机剩余秒数数码管显示,可不计。 当秒数自累加为30时,洗衣机暂停状态灯D3由高电平变低电平,洗衣机反转状态灯D2由低电平变为高电平 ,即洗衣机由暂停状态转为反转状态。图11整体仿真59s处图图11结果分析:上图为整体仿真59s处图。第二行为时钟信号,即1Hz;第三行为预置时间显示,仿真预置时间为8h05;第四行为开始信号;第五行为洗衣机正转状态灯D1;第六行为洗衣机反转状态灯D2;第七行为洗衣机暂停状态灯D3;第八行为洗衣机停机声音信号BO;第九行为洗衣机分钟数显示;第十行和十一行为洗衣机剩余分钟数数码管显示;第十二行为秒数计数显示;第十三行和十四行为洗衣机剩余秒数数码管显示,可不计。 当秒数自累加为8h00时,剩余分钟数由8h05变为8h04;完成预置分钟数自减。图12整体仿真停机状态图图12结果分析:上图为整体仿真停机处图。第二行为时钟信号,即1Hz;第三行为预置时间显示,仿真预置时间为8h05;第四行为开始信号;第五行为洗衣机正转状态灯D1;第六行为洗衣机反转状态灯D2;第七行为洗衣机暂停状态灯D3;第八行为洗衣机停机声音信号BO;第九行为洗衣机分钟数显示;第十行和十一行为洗衣机剩余分钟数数码管显示;第十二行为秒数计数显示;第十三行和十四行为洗衣机剩余秒数数码管显示,可不计。 由于预置时间倒计时完成后,分钟数和秒数都为0,观察上图,可发现BO置高电平,即触发停机声音信号。剩余分钟数和秒数为8h00;数码管都显示7h40;洗衣机状态灯D1、D2和D3都为低电平,即洗衣机不工作。三、结论经过这一次的课程设计,自己对FPGA有了更加深入的了解。在FPGA实践中技能与知识储备都有了更大的提高,也把Verilog HDL语法知识巩固了一下。同时动手能力也得到了提高。在做课程设计的过程中,我也遇到了很多问题。刚开始时,由于对软件不太熟悉和对Verilog HDL语言的生疏,课程设计及编码都进行的很慢。我就把上课用的Verilog HDL数字系统设计编程这本教材看了一遍。在课程设计中,我遇到了以下问题:如何给变量输入一个初始值(即洗衣机输入预置时间)、数码管如何显示、利用什么去控制洗衣机的运行状态、停机声音信号的判断条件等等。在遇到问题的时候,通过问老师、同学和去图书馆或者在网上查找相关资料,一点一点解决了我的问题。刚开始编程时,自己写程序时没有注意层次分明,在模块调用时,也没有注意输入与输出,因此在调试时候总出错,浪费了很多些时间。所以编写程序时一定要细心、认真,程序时要有层次感,便于阅读和修改。模块要有一定的分隔,条理清晰。对于洗衣机控制器,由于没有开发板,就用洗衣机状态灯来代替洗衣机的运行状态。最主要的程序就是如何控制洗衣机的运行状态。本来觉得状态机可行,但是太复杂了。后面我采用的是利用洗衣机正转20s,暂停10s,反转20s,暂停10s,这样一个流程正好一分钟,通过识别秒的大小来判断洗衣机工作状态:0到20s时,正转;20到30s,暂停;30到50s,反转;50到60s,暂停。这样就可以完成洗衣机控制模块。 对于这次课程设计,自己收获很多。加深了对QUARTUS II软件的使用,同时也学会了利用Modelsim仿真。在课程设计中,自己不懂的去学习,去向别人请教,到网上寻找教程。这种自学的态度,我觉得是最重要的。还有反复调试程序,想得到自己满意的波形,这是一个有点麻烦的过程,不过也很有趣。总体而已,自己收获很多。参考资料1 夏宇闻.Verilog数字系统设计(第2版)M. 北京:北京航空航天大学出版社,2008.2潘松.EDA技术实用教程-Verilog HDL版(第五版)M. 北京:科学出版社,2010.3阎石.数字电子技术基础(第五版) M. 北京:高教出版社,2006.4 褚振勇FPGA设计及应用M西安:西安电子科技大学出版社,2002 5 李国丽EDA与数字系统设计M北京:机械工业出版社,2004 6 何小艇电子系统设计M杭州:浙江大学出版社,2000.7康华光主编.电子技术基础 数字部分 第五版.8EDA先锋工作室. 设计与验证Verilog HDL.