EDA课程设计洗衣机控制器.docx
《EDA课程设计洗衣机控制器.docx》由会员分享,可在线阅读,更多相关《EDA课程设计洗衣机控制器.docx(18页珍藏版)》请在冰豆网上搜索。
EDA课程设计洗衣机控制器
北京印刷学院
EDA课程设计报告
课程题目:
基于FPGA的洗衣机控制器的设计
课程名称:
EDA技术课程设计
院(系):
信息与机电工程学院
专业:
电子信息工程
姓名:
薛大神
学号:
098888888
指导老师:
xxx
实习日期:
2012年6月28日-6月30日
1.系统设计······················································3
1.1设计要求··················································3
1.2总体设计方案··············································3
1.2.1设计思路············································3
1.2.2系统组成············································3
2.单元硬件电路设计··············································4
2.1键盘模块··················································4
2.2显示模块··················································4
2.3中心控制模块··············································4
3.软件设计······················································4
3.1控制模块程序设计··········································5
3.2显示译码程序设计··········································5
3.3按键去抖程序设计··········································5
3.4分频模块程序设计··········································6
4.系统仿真测试··················································6
4.1控制模块仿真··············································6
4.2按键去抖模块仿真··········································7
4.3分频模块仿真··············································7
4.4控制器操作演示············································8
附录一使用说明··················································9
附录二电路原理图················································9
附录三管脚分配图················································9
附录四程序清单··················································10
摘要:
洗衣机控制电路由一片altera公司的cyclone2系列EP2C35F672C6的FPGA作为中心控制器加上必要的外围电路组成,实现对洗衣机工作状态的控制。
芯片编程采用Quartus2作为开发工具,由控制模块,分频模块,按键去抖模块,显示译码模块组成,顶层使用原理图实现,底层由VerilogHDL语句实现。
中心控制器FPGA根据控制键盘的信号,向洗衣机发出正传,反转,待机信号,并通过数码管和LED灯显示当前的状态及剩余时间。
该洗衣机控制电路可以方便快捷的实现对洗衣机的控制和状态的显示功能。
关键字:
洗衣机FPGAVerilogHDL语言cyclone2
1.系统设计
1.1设计要求
1.洗衣机的状态为待机5s→正转60s→待机5s→反转60s→,并用3个LED灯和7段显示器分别表示其工作状态和显示相应工作状态下的时间。
2.可自行设定洗衣机的循环次数,这里设置最大的循环次数为15次。
3.具有紧急情况的处理功能。
当发生紧急情况时,立即转入待机状态,紧急情况解除后,继续执行后续步骤;
4.洗衣机设定循环次数递减到零时立即报警,以表示洗衣机设定的循环次数已经结束
1.2总体设计方案
1.2.1设计思路
题目要求设计一个洗衣机控制电路,实现对洗衣机工作状态的控制。
设计分键盘模块,显示模块,中心控制模块,晶体振荡模块四部分。
中心控制器FPGA根据控制键盘的信号,向洗衣机发出正传,反转,待机信号,并通过数码管和LED灯显示当前的状态及剩余时间。
1.2.2系统组成
洗衣机控制电路主要由键盘模块,显示模块,时钟分频模块,中心控制模块三部分组成组成。
图1-1系统结构框图
2.单元硬件电路设计
2.1键盘模块
设有2两个按键rst,add;2个拨码开关start和en紧急状态开关。
rst用于复位,当按下reset的时候,控制器回复到初始状态。
,add用于初始状态下设置循环次数,start用于启动停止洗衣机。
2.2显示模块
设有6个LED灯,3个数码管。
3个LED灯用来表示当前状态,2个LED表示电机转动方向,另一个LED灯表示紧急状态;2个数码管用来表示当前状态所剩余时间,1个数码管表示当前剩余循环次数。
但在实验箱中,数码管已经将显码译码过程包含在相应的数码管内,故不需要单独对数码管显示进行仿真。
2.3中心控制模块
中心控制模块是以一片altera公司的Cyclone2系列EP2C35F672C6的FPGA为主体,配合一些外围电路实现的。
Cyclone2系列FPGA采用全铜层、低K值、1.2伏SRAM工艺设计,裸片尺寸被尽可能最小的优化。
采用300毫米晶圆,以TSMC成功的90nm工艺技术为基础,CycloneII器件提供了4,608到68,416个逻辑单元(LE),并具有一整套最佳的功能,包括嵌入式18比特x18比特乘法器、专用外部存储器接口电路、4kbit嵌入式存储器块、锁相环(PLL)和高速差分I/O能力。
3.软件设计
对可编程逻辑器件FPGA的编程采用Quartus2作为开发工具,顶层使用原理图实现,底层由VerilogHDL语句实现。
软件设计由控制模块,分频模块,按键去抖模块,显示译码模块四部分组成,由于输入时钟为50Mhz,因此使用了分频模块输出1hz的方波,给控制模块提供每1s自减1的信号,控制模块输出的倒计时输入给数码管显示译码模块,通过译码模块定时器的值可以在数码管上显示,控制模块由此1hz的方波信号可以控制洗衣机的正转、反转、待机和报警工作方式。
按键消抖模块的作用是为了消除按键抖动而设立的。
3.1控制模块程序设计
如图3-1状态转换图与图3-2软件流程图所示,控制模块采用有限状态机实现对洗衣机工作状态的控制。
启动start后,控制器首先进入待机s0状态,时间从5秒倒计时,如果没有到0秒则继续等待,时间自减;当t=0,进入洗衣机正转s1状态,时间从60秒倒计时,如果没有到0秒则继续等待,时间自减;当t=0,进入洗衣机待机s2状态,同理等待5秒;当t为零后,进入s3洗衣机发转状态,时间从60秒倒计时,如果没有到0秒则继续等待,时间自减;整个过程依次循环。
紧急状态emergency,当按下紧急停止按钮后,处于正反转状态中的电机停止转动,同时紧急报警LED灯亮,因此紧急状态不设定独立状态
状态转换图:
S0:
待机状态s1:
正转状态s2:
待机状态s3:
反转状态
图3-1状态转换图
软件流程图:
图3-2软件流程图
3.2显示译码程序设计
数码管显示译码模块主要功能是把定时器送来的值译码并通过数码管显示出来。
fpga的VerilogHDL硬件语言是并行的这有别于软件的描述语言扫描方式。
但在实验箱中,数码管已经将显码译码过程包含在相应的数码管内,故不需要单独对数码管显示进行仿真。
3.3按键去抖程序设计
在进行独立按键或者矩阵式按键的设计的时候,我们在按下键盘的时候其实并不只是按下去而是有一个抖动的过程,就连松手的过程也有抖动,然而这个抖动通常被人们所忽略,从而导致输入数据的错误和乱码,因此我们必须对按键进行按键的消抖处理。
fpga的VerilogHDL语言是硬件描述语言,主要运用了状态机和延时的消抖方式。
3.4分频模块程序设计
由于使用的FPGA的输入时钟是50Mhz,定时模块的频率是1hz,因此需要进行两次1000分频和一次50分频,从而得到1hz的时钟频率输入给定时模块。
4.系统仿真测试
4.1控制模块仿真
如图4-1所示,rst置高电平,控制器复位,rst低电平后,add按下两次,设置循环次数为2,按下start后置为高电平,洗衣机开始工作。
图4-1洗衣机正常运行的仿真图
如图4-2所示,紧急状态发生,en变为高电平,洗衣机暂停工作,电机停止运转,紧急状态结束后,恢复原状态。
图4-2紧急暂停仿真图
如图4-3所示,紧急暂停结束,en恢复低电平,再次开始工作,进入下一循环。
图4-3紧急状态结束,状态恢复
4.2按键去抖模块仿真
如图4-4所示,当按键时间低于8个上升沿脉冲,则无效,当按键时间大于等于8个上升沿,则按键有效
图4-4按键去抖仿真
4.3100分频模块仿真
如图4-5所示,为100分频模块仿真
图4-5100分频模块仿真
4.4控制器操作演示图
图4-6紧急暂停演示图
此时,最右侧的数码管显示剩余循环次数3次,左面两个数码管显示本次电机正转还剩27s,而左侧第4个亮的LED灯表示当前电机停止,也就是处于紧急状态。
状态灯(右侧第二个表示当前紧急状态停止)
图4-6洗衣机反转演示图
当前显示循环次数还有2次,电机正在反转,反转时间还剩5秒,控制器处于反转状态(右侧第三个LED绿灯)。
附录一使用说明
(1)电路上电后,先按下复位键rst复位,在Start拨码开关未闭合前可以由add按键开关设置总的工作循环次数,确定洗衣机控制器工作循环次数。
(2)设定好允许工作时间后,闭合Start开关,洗衣机控制器开始工作。
(3)可以看见指示待机LED灯亮5s,正转LED灯亮60S,待机LED亮5s,反转LED灯亮60s,如此反复直至工作允许时间为0。
附录二电路原理图
图附录2电路原理图
附录三管脚分配图
图附录3管脚分配图
附录四程序清单
控制模块程序
modulewasher(clk,rst,en,start,add,fore,back,numa,numb,alarm,led,tim);
inputclk,rst,start,add,en;//en为紧急状态信号
outputfore,back,alarm;
output[3:
0]numa,numb,tim;//numa为倒计时个位,numb为倒计时十位
output[2:
0]led;
reg[2:
0]led;
reg[3:
0]tim;
reg[3:
0]numa,numb;
regfore,back,alarm;
reg[3:
0]count3;
reg[3:
0]state;
wireA;
parameters0=4'b0001,
s1=4'b0010,
s2=4'b0100,
s3=4'b1000;
always@(posedgeaddorposedgerst)//循环次数count设置
begin
if(rst)
count3<=1'b0;
else
begin
if(start==0)
begin
if(count3<=14)
count3<=count3+1'b1;
else
count3<=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<=1'b0;
if(tim)//循环次数tim>0,开始工作
begin
case(state)
s0:
begin
if(numb==0&&numa==0)//时间为0,状态转移
begin
state<=s1;
numa<=4'b0100;
numb<=4'b0000;
led<=3'b001;
back<=1'b0;
fore<=1'b0;
end
else
begin
state<=s0;
led<=3'b100;
back<=1'b1;
fore<=1'b0;
end
end
s1:
begin
if(numb==0&&numa==0)
begin
state<=s2;
numa<=4'b1001;
numb<=4'b0101;
back<=1'b0;
fore<=1'b1;
led<=3'b010;
end
else
beginstate<=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;
numb<=4'b0000;
back<=1'b0;
fore<=1'b0;
led<=3'b001;
end
else
begin
state<=s2;
back<=1'b0;
fore<=1'b1;
led<=3'b010;
end
end
s3:
begin
if(numb==0&&numa==0)
begin
state<=s0;
numa<=4'b1001;
numb<=4'b0101;
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<=4'b1001;
numb<=numb-1'b1;
end
else
numa<=numa-1'b1;
end
if(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;
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<=count3;
numa<=4'b0000;
numb<=4'b0000;
alarm<=1'b0;
end
end
end
endmodule