1、成 绩指导教师:EDA技术与实验课程设计题 目: 基于洗衣机控制器的研究 姓 名: 院 系: 电子信息工程系 专 业: 通信工程 班 级: 2班 学 号: 指导教师: 2012年 12 月14基于洗衣机控制器的研究胡晋1、 实验原理 本实验运用verilog语言和有限状态机的原理.1通过设定时间,实现洗衣机从启动状态正转2个脉冲(1个脉冲等于10S),进入暂停状态,暂停2个脉冲,再由暂停状态进入状态,即反转2个脉冲,然后再进入暂停状态,暂停3个脉冲,如此在这3种状态中循环下去,直到设定的时间到达后停止工作。如果设定的时间没有到达循环将一直持续下去。程序运用verilog语言编码并且运用max+
2、plusII软件仿真。2 2总体方案(1)新建文件:打开Max+plus软件,新建一个Text Editor文件,操作界面见图1。 图1 新建文本文件(2)在新建文件中输入源程序代码,下面这部分是确定输入与输出的变量,并且也在这部分程序当中确定输入和输出量的大小范围。我假设的a为正转,b为反转,c为暂停,d为停止,x为输入的设定的一个值,它是用来控制脉冲的个数,当达到x设定数值的脉冲时洗衣机停止工作。clk为脉冲输入端。State是控制状态的。module hj991(x,clk,a,b,c,d,state);input3:0 x;input clk;output a,b,c,d;output
3、2:0 state;reg2:0 state;reg3:0i,j;reg a,b,c,d;(3)下面这段程序是主程序,运用case语句和if语句实现循环,3也运用了有限状态机的原理。首先各一个脉冲,state从s0开始运行,让j清零并且指向下一步s1。parameter s0=d0,s1=d1,s2=d2,s3=d3,s4=d4,s5=d5;always (posedge clk)begin case(state)s0: begin state=s1; j=0; end(4)下面的程序是由s0执行下来的,首先先判断i是否等于x,如果等于x则直接跳到s5执行停止程序,如果不等于x,再判断j是否等
4、于1,如果等于1就执行i与j自加一次并且state指向s2再让a置为高电平(正转),如果j也不等于1则i与j自加,state继续执行s1的程序,并且a也置为高电平(正转)。 s1: begin if(i=x) begin state=s5; end else if(j=1) begin i=i+1; j=j+1; state=s2; a=1; b=0; c=0; d=0; end else begin i=i+1; j=j+1; state=s1; a=1; b=0; c=0; d=0; end end(5)当程序从s1跳到s2的时候,首先还是判断i与x是否相等,相等就直接跳到s5处停止运行,
5、不是则i与j自加个1,并且判断j是否等于3,如果相等则将state赋值s3,如果不想等则将c置高电平(暂停)并将state赋值s2让其循环运行。 s2: begin if(i=x) begin state=s5; end else if(j=3) begin i=i+1; j=j+1; state=s3; end else begin i=i+1; j=j+1; state=s2; a=0; b=0; c=1; d=0; end end(6)下面的程序是在s2(暂停)后进入反转阶段,首先还是先判断i与x之间是否相等,相等则state赋为s5,不相等就判断j是否等于5,相等就i与j自加个1,再把
6、state赋为s4再把b置为高电平(反转),如果2个都不满足则执行else所包含的内容,i与j还是要自加,但state赋为s4且b置为高电平(反转)。 s3: begin if(i=x) begin state=s5; end else if(j=5) begin state=s4; i=i+1; j=j+1; a=0; b=1; c=0; d=0; end else begin i=i+1; j=j+1; state=s3; a=0; b=1; c=0; d=0; end end(7)当state由s3进入s4时,继续判断i与x是否相等,如果不相等则看j是否等于7,等于的话就i与j自加个1,
7、把s0赋给state,如果都不想等就运行else,i和j自加把c置为高电平(暂停),然后循环。 s4: begin if(i=x) begin state=s5; end else if(j=7) begin i=i+1; j=j+1; state=s0; end else begin i=i+1; j=j+1; state=s4; a=0; b=0; c=1; d=0; end EndS5为停止端,当运行s5时,表示d要为高电平,这时的洗衣机就停止运行。 s5: begin a=0; b=0; c=0; d=1; state=s5; end default: state=s0; endcas
8、e endendmodule (8)输入完程序后保存并命名为“hj991.v”,点击FileProjectset project to current file 设置此项目为当前文件,启动MAX+plus II Compiler 菜单,。按Start 开始编译,并显示编译结果,生成下载文件见图2所示。 图2 程序运行图(9)新建文件:打开Max+plus软件,新建一个Waveform Editor文件,操作界面见图3所示。 图3 新建波形文件(10)导入波形的输入量与输出量如图4所示。 图4 输入输出导入(11)新建文件:打开Max+plus软件,新建一个Graphic Editor文件,操作
9、界面见图5所示。 图5 图形文件(12)将图形文件连接好如图6所示图6 电路图(13)运行文本文件和电路图得到的波形如图7和8所示。图7 由文本文件运行得到的波形图8 由电路图得到的波形(14)图7和图8的波形对比分析1、a代表正转。b代表反转。c代表暂停。d代表停止。2、首先在输入时要进行定时操作,然后给其接入脉冲信号让其工作。3、在每次启动后state都会自动清零,所以每次启动后都会从正转开始。4、当正转的圈数达到3圈后洗衣机会自动暂停2圈的时间,一旦暂停2圈的时间完成后会进行反转程序,反转2圈后又会进入暂停2圈时间的状态。如此周而复始,直到定时的时间达到停止。5、当定时时间一经到达无论在
10、什么状态都要立马变成停止状态。6、波形就是先由acbca。循环。3、结束语 本次的EDA课程设计历时了一个多星期,时间虽短,但通过一个星期的实践,使我对EDA技术有了更进一步的了解。同时,大致懂得了一个课题制作的具体流程和实施方法。另外,课程设计让我对MAX+plus2软件的使用更加的了解,使我较为熟悉的运用此软件。在设计时,设计所采用的Verilog语言对系统的描述具有相对独立性,可以直接对目标系统进行描述,省去了中间电路的细节设计环节。课程设计中,需要找很多资料,在当今的信息化环境中,资料虽然很多,但需要仔细斟酌才能找到所要的。这次的课程设计很好的锻炼了这种能力。此外,与同学的交流必不可少
11、,我从中也学到了不少东西。 课程设计使一次很好的锻炼机会,我从中学到的很多知识对将来的学习和工作都会有很大的帮助,十分感谢老师能提供这样一个机会。4、心得体会 经过自己亲自编写程序,我才真正明白原来自己有多么的差,以前一直以为都学会的东西在自己编写的程序中都会有或大或小的错误,我自己编写的洗衣机控制器的程序根据自己的分析是可以完全无误差运行的,可是看到波形的时候我才明白,机器和人是不一样的。会出现一些逻辑上的错误,所以是不是真正弄懂了verilog语言只需要自己编写个程序就可以很明确的看出来。我在这次的课程设计中解决了很多以前不知道的难题,虽然我最后的作品还是有些不足但我还是比较满意的,因为我
12、们才学的不可能做到没有任何错误。虽然程序的代码有点长,但这样也更加容易的检查出错误的所在,我觉得这应该是一种比较好的习惯吧!5、 参考文献【1】王金明.冷自强.EDA技术与Verilog设计【M】.北京:科学出版社,2008【2】江国强.EDA技术与应用【M】.北京:电子工业出版社,2010-04-01【3】李洋.EDA技术实用教程【M】.北京:机械工业出版社,2009-08-01附录基于洗衣机控制器研究的程序代码module hj991(x,clk,a,b,c,d,state);input3:0 x;input clk;output a,b,c,d;output2:0 state;reg2:
13、0 state;reg3:0i,j;reg a,b,c,d;parameter s0=d0,s1=d1,s2=d2,s3=d3,s4=d4,s5=d5;always (posedge clk)begin case(state) s0: begin state=s1; j=0; end s1: begin if(i=x) begin state=s5; end /如果i等于x则跳到s5让其停止 else if(j=1) begin i=i+1; j=j+1; state=s2; a=1; b=0; c=0; d=0; end /如果j等于3则跳到下个阶段反转 else begin i=i+1;
14、j=j+1; state=s1; a=1; b=0; c=0; d=0; end /正转 end s2: begin if(i=x) begin state=s5; end else if(j=3) begin i=i+1; j=j+1; state=s3; end /如果j等于9则跳到下个阶段,j清零,且执行s1 else begin i=i+1; j=j+1; state=s2; a=0; b=0; c=1; d=0; end /暂停 end s3: begin if(i=x) begin state=s5; end else if(j=5) begin state=s4; i=i+1;
15、j=j+1; a=0; b=1; c=0; d=0; end /如果j等于6则跳到下个阶段暂停 else begin i=i+1; j=j+1; state=s3; a=0; b=1; c=0; d=0; end /反转 end s4: begin if(i=x) begin state=s5; end else if(j=7) begin i=i+1; j=j+1; state=s0; end /如果j等于9则跳到下个阶段,j清零,且执行s1 else begin i=i+1; j=j+1; state=s4; a=0; b=0; c=1; d=0; end /暂停 end s5: begin a=0; b=0; c=0; d=1; state=s5; /停止 end default: state=s0; /默认状态为初始状态 endcase endendmodule