基于VerilogHDL的洗衣机程序.docx
《基于VerilogHDL的洗衣机程序.docx》由会员分享,可在线阅读,更多相关《基于VerilogHDL的洗衣机程序.docx(14页珍藏版)》请在冰豆网上搜索。
基于VerilogHDL的洗衣机程序
EDA嵌入式系统课程设计
印刷学院
课程设计报告
——嵌入式系统EDA
课程设计名称:
EDA技术课程设计
课程设计题目:
洗衣机控制电路
专业:
电子信息工程专业
班级:
XXXXX
学生XX:
XXXXXXXXXXXXX
XXXXXXXXXXX
指导教师:
XXXXXXX
时间:
XXXXXX至XXXXX年XXXX月XXXX日
一、设计任务要求·················································3
1、根本要求···················································3
二、总体设计方案·················································3
1、系统功能···············································3
2、系统设计···············································3
1)系统构造框图···········································3
2)模块分析···············································3
1、分频模块···············································3
2、七段数码管显示模块·····································3
3、洗衣机主程序模块·······································3
三、应用设备及软件介绍···········································3
1、主要仪器设备〔实验用的软硬件环境〕······················3
2、实验的软件环境·········································4
3、操作方法与实验步骤·····································4
四、调试过程分析、遇到的问题及解决方法···························4
1、分频模块···············································3
2、七段数码管显示模块·····································3
3、洗衣机主程序模块·······································3
五、设计结论·····················································3
六、DE2管脚分配说明············································3
七、参考文献·····················································3
八、附录·························································3
附录一分频模块··················································9
附录二七段数码管显示模块········································9
附录三洗衣机主程序模块··········································9
一、设计任务要求
1、根本要求:
1〕洗衣机的状态为待机5s→正转60s→待机5s→反转60s→,并用3个LED灯和7段显示器分别表示其工作状态和显示相应工作状态下的时间。
2)可自行设定洗衣机的循环次数,这里设置最大的循环次数为15次。
3)具有紧急情况的处理功能。
当发生紧急情况时,立即转入待机状态,紧急情况解除后,继续执行后续步骤。
4)洗衣机设定循环次数递减到零时立即报警,以表示洗衣机设定的循环次数已经完毕。
二、设计方案
1、系统功能
根本功能:
能够实现洗衣机在设置洗衣次数后待机5s→正转60s→待机5s→反转60s的四种根本状态,并且可显示循环次数,当遇到紧急状态时可翻开紧急开关,暂停洗衣机的工作。
当洗衣机循环次数递减到0时洗衣机自动报警。
2、系统设计
1)系统构造框图,如图1-1所示:
通过分频模块得到1Hzclk作为标准时钟输入到洗衣机主程序模块中,rst,en,start,add,四个输入信号作为洗衣机主程序模块的总输入,所得到的led信号分别用三个红灯显示,alarm信号用一个红灯显示,numa信号、numb信号、tim信号用七段数码管显示,最终实现了洗衣机的各项功能。
图1-1
2)模块分析
1、分频模块
将系统给定的50MHZ的频率通过分频模块变成1HZ的clkclk,〔我们在这里以50分频为
例〕输入一个50MHz的信号作clkin,每当clkin上升沿来时,count计数加1,且每当
count==24时,clkout取反一次并且count<=0,这样会得到一个1MHz的信号,然后在进展
3次100分频,即可得到1HZclk作为我们后面所需的标准时钟。
。
其流程图及预制仿真图如
以下列图:
图2-1.1,图2-1.2,图2-1.3为100分频仿真所示:
N
Y
N
Y
Y
图2-1.1
图2-1.2
图2-1.3
2、七段数码管显示模块:
运用三个七段数码管显示模块,分别显示倒计时个位numa,倒计时十位numb,循环剩余次数tim,如图2-2.1,图2-2.2,图2-2.3,图2-2.4
图2-2.1
图2-2.2
图2-2.3
图2-2.4
3、洗衣机主程序模块:
如图3-1状态转换图与图3-2软件流程图所示,控制模块采用有限状态机实现对洗衣机工作状态的控制。
启动start后,控制器首先进入待机s0状态,时间从5秒倒计时,如果没有到0秒那么继续等待,时间自减;当t=0,进入洗衣机正转s1状态,时间从60秒倒计时,如果没有到0秒那么继续等待,时间自减;当t=0,进入洗衣机待机s2状态,同理等待5秒;当t为零后,进入s3洗衣机发转状态,时间从60秒倒计时,如果没有到0秒那么继续等待,时间自减;整个过程依次循环。
紧急状态en,当按下紧急停顿按钮后,处于正反转状态中的电机停顿转动,同时紧急报警LED灯亮,因此紧急状态不设定独立状态。
图3-1
图3-2
三、应用设备及软件介绍
1:
主要仪器设备〔实验用的软硬件环境〕
〔1〕计算机;
〔2〕DE2开发板〔ALTERACyclone2〔2C35〕〕;
〔3〕电源线一根;
〔4〕USB下载线一根。
2:
实验的软件环境
QuartusII9.0软件
3:
操作方法与实验步骤
〔1〕利用QuartusII9.0软件实现EDA的根本设计流程:
创立工程、编辑文本输设计
文件、编译前设置、全程编译、功能仿真。
(2)利用QuartusII9.0软件实现引脚锁定和编译文件下载。
四、调试过程分析、遇到的问题及解决方法
1、分频模块的调试:
分析:
如图4-1所示,每当count==24时,clkout实现一次翻转,并且count清零;
该模块总体来说思路较为简单,一般都是一次性成功的〔以50分频为例〕,其仿真图如以下列图4-1
图4-1
2、七段数码管显示模块的调试:
洗衣机对七段数码管显示的要求不太高,设计好该模块的程序后,只需将洗衣机主程序模块下的输出numa,numb,tim三个信号分别接入三个七段数码管显示模块即可显示出对应的数字。
3、洗衣机主程序模块的调试:
在设计洗衣机的时候我们小组大致的步骤如下:
1、弄清洗衣机有哪几种按键
在编写程序时我们小组决定先由易到难,从按键下手,整个洗衣机应有rst(复位键〕,add〔设置循环次数键〕、start〔开场键〕、、en〔紧急暂停键〕这四个键,并将这四个按键作为输入。
2、确立洗衣机有哪几种状态
我们小组认为该洗衣机洗衣时应有四种状态:
S0:
待机5S;S1:
正转60S;S2:
待机5S;S3:
反转60S;S4:
待机5秒。
计数的十位用numb表示,计数的个位用numa表示。
将这四种状态作为一次循环。
在编写程序时我们一开场选择从0开场计数到5,切换状态再从0开场计数到60换状态,跑板子的时候总觉得奇怪,后来经过思考,一般洗衣机计时都是倒数的,于是我们才将程序改正过来。
在编写程序时,我们把系统紧急状态也归在这四个状态当中,结果每个状态都得判断是否为紧急状态,导致程序变得非常的繁琐,后来经思考才将紧急信号作为按键输入,这样一来程序变得简练了,不必每个状态都加上紧急状态。
之后经过我们小组的努力修改和调试,最终完成了洗衣机主程序。
洗衣机的仿真如以下列图
如图4-1所示,rst置高电平,控制器复位,rst低电平后,add按下两次,设置循环次数为2,按下start后置为高电平,洗衣机开场工作。
图4-1洗衣机正常运行的仿真图
如图4-2所示,紧急状态发生,en变为高电平,洗衣机暂停工作,电机停顿运转,紧急状态完毕后,恢复原状态。
图4-2紧急暂停仿真图
如图4-3所示,紧急暂停完毕,en恢复低电平,再次开场工作,进入下一循环。
图4-3紧急状态完毕,状态恢复
五、设计结论
1〕通过设计,实现了一个能够实现洗衣机在按下add设置洗衣次数后按下start洗衣机开场待机5s待机灯亮→正转60s待机灯灭,正转灯亮→待机5s正转灯灭,待机灯亮→反转60s待机灯灭反转灯亮的四种根本状态,并且可用tim显示循环次数,当遇到紧急状态时可翻开紧急开关en,暂停洗衣机alarm灯亮的工作。
当洗衣机循环次数递减到0时洗衣机自动报警,alarm灯亮。
2〕设计体会:
通过这次课程设计使我发现了很多自己在EDA学习中被忽略的问题,一些重点。
从一次次的程序的调试中发现了自己在程序设计中的弱项,为自己敲了一个警钟。
更是我充分的认识到不断学习、不断探索的重要性。
通过查阅其它资料丰富了我们的知识,是我们所能学到的。
东西不仅仅是局限于课堂上,加强了我们自主学习的积极性。
并且从同学的相互交流中弥补了自身的弱点。
形成了一种你争我赶的良好学风。
因为这次课设题目的新颖,更提高了我们的自主创新能力,大幅的提高了我们的学习效率,快速的实现了学以致用的目的。
在整个设计工过程中,尤其是设计之前,一定要有整体的逻辑思路;然后在分块解决。
同样在检测的过程中,要学会分模块检测,这一点是很重要的,会起事半功倍的效果。
小组成员之间要及时沟通,分享思路及想法,不断改良,成员之间还要互相现任,还要有耐心。
总之,通过这次课设我受益匪浅。
3)3:
系统工程图及洗衣机效果展示图如以下列图:
图5-1至图5-6所示
图5-1
六、DE2管脚分配说明
图6-1
七、参考文献
[1]夏宇闻.Verilog数字系统设计教程(第3版).航空航天.2021.
[2]夏宇闻.Verilog嵌入式数字系统设计教程.航空航天.2021.
八、附录
附录1:
分频模块〔此处选取50分频,其余分频模块省略〕
modulefenping50(clockin,clockout);
inputclockin;
outputclockout;
reg[9:
0]count;
regclockout;
parameterN=24;//改变N的值可以显示任意偶分频
always(posedgeclockin)//clockin上升沿触发
begin
if(count==N)
begin
count<=3'b000;
clockout<=~clockout;//counter==24的时候clockout实现一次翻转
end
else
count<=count+3'b001;
end
Endmodule
附录2:
七段数码管显示模块
moduleseg7(code,display);
input[3:
0]code;
output[6:
0]display;
reg[6:
0]display;
always(code)
begin
case(code)
4'b0000:
display<=7'b1000000;//0
4'b0001:
display<=7'b1111001;//1
4'b0010:
display<=7'b0100100;//2
4'b0011:
display<=7'b0110000;//3
4'b0100:
display<=7'b0011001;//4
4'b0101:
display<=7'b0010010;//5
4'b0110:
display<=7'b0000011;//6
4'b0111:
display<=7'b1111000;//7
4'b1000:
display<=7'b0000000;//8
4'b1001:
display<=7'b0011000;//9
default:
display<=7'b1000000;//F
endcase
end
Endmodule
附录3:
洗衣机主程序模块
modulewasher(clk,rst,en,start,add,fore,back,numa,numb,alarm,led,tim);
inputclk,rst,start,add,en;//en为紧急状态信号
outputregfore,back,alarm;//displayled,wait:
led[0],fore:
led[1],back:
led[2]
outputreg[3:
0]numa,numb,tim;//numa为倒计时个位,numb为倒计时十位
outputreg[2:
0]led;
reg[3:
0]state;
reg[3:
0]count;
parameters0=4'b0001,
s1=4'b0010,
s2=4'b0100,
s3=4'b1000;
always(posedgeaddorposedgerst)//循环次数count设置
begin
if(rst)
count<=1'b0;
else
begin
if(start==0)
begin
if(count<15)
count<=count+1'b1;
else
count<=1'b0;
end
end
end
always(posedgeclkorposedgerst)
begin
if(rst)//系统复位
begin
back<=1'b0;
fore<=1'b0;
numa<=4'b0000;
numb<=4'b0000;
state<=s0;
led<=3'b001;
alarm=1'b0;
end
else
begin
if(!
en&&start)//start为1,en为0那么正常工作
begin
alarm<=0;
if(tim)//循环次数tim>0,开场工作
begin
case(state)
s0:
begin
if(numb==0&&numa==0)//时间为0,状态转移
begin
state<=s1;
numa<=4'b0100;//4
numb<=4'b0000;//0
led<=3'b001;
back<=1'b0;
fore<=1'b0;
end
else
begin
state<=s0;
led<=3'b100;
back<=1'b0;
fore<=1'b0;
end
end
s1:
begin
if(numb==0&&numa==0)
begin
state<=s2;
numa<=4'b1001;//9
numb<=4'b0101;//5
back<=1'b0;
fore<=1'b1;
led<=3'b010;
end
else
begin
state<=s1;
led<=3'b001;
back<=1'b0;
fore<=1'b0;
end
end
s2:
begin
if(numb==0&&numa==0)
begin
state<=s3;
numa<=4'b0100;//4
numb<=4'b0000;//0
back<=1'b0;
fore<=1'b0;
led<=3'b001;
end
else
begin
state<=s2;
back<=1'b0;
fore<=1'b0;
led<=3'b010;
end
end
s3:
begin
if(numb==0&&numa==0)
begin
state<=s0;
numa<=4'b1001;//9
numb<=4'b0101;//5
led<=3'b100;
back<=1'b1;
fore<=1'b0;
end
else
begin
state<=s3;
back<=1'b0;
fore<=1'b0;
led<=3'b001;
end
end
default:
state<=s0;
endcase
if({numb,numa}>0)//倒计时控制局部
begin
if(numa==0)//numa为0,那么numa赋值9,numb自减1
begin
numa<=9;//9
numb<=numb-1'b1;
end
else
numa<=numa-1'b1;
end
elseif(numa==0&&numb==0&&state==s0&&!
en&&led==3'b100)
begin//一次循环完毕tim自减1
tim<=tim-1'b1;
end
end
else
begin
back<=1'b0;
fore<=1'b0;
numa<=4'b0000;
numb<=4'b0000;
alarm<=0;
state<=s0;
led<=3'b001;
end
end
elseif(en&&start)//en为1,进入紧急状态
begin
back<=1'b0;
fore<=1'b0;
alarm<=1'b1;
end
else//start为0,给循环次数tim赋值
begin
tim<=count;
numa<=0;
numb<=0;
alarm<=1'b0;
end
end
end
endmodule