基于FPGA的洗衣机的设计.docx
《基于FPGA的洗衣机的设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA的洗衣机的设计.docx(28页珍藏版)》请在冰豆网上搜索。
![基于FPGA的洗衣机的设计.docx](https://file1.bdocx.com/fileroot1/2023-1/10/9d8de4b8-58d7-404a-8905-9f1937275ffe/9d8de4b8-58d7-404a-8905-9f1937275ffe1.gif)
基于FPGA的洗衣机的设计
基于FPGA的洗衣机控制电路实现
姓名:
学号:
专业:
2010--11--15
洗衣机洗涤控制电路设计
一、洗衣机洗涤控制电路的性能要求
1.强洗、标准、轻柔三种洗涤模式
强洗周期水流控制:
正向电机接通5秒后,停2秒;再反向电机接通5秒,停2秒;然后又正向电机接通5秒。
如此循环控制电机,直到洗涤定时结束。
标准洗周期水流控制:
其过程与强洗周期水流控制相同,不同的是正向接通时间为3.5秒,停止时间为1.5秒,反向接通时间为3.5秒。
轻柔洗周期水流控制:
正向接通时间为2.5秒,停止时间为1.5秒,反向接通时间为2.5秒。
2.三种洗涤定时
洗衣机洗涤定时可有三种选择:
5分钟、10分钟、15分钟。
3.上电复位后的初始设定
初始设定为标准模式,定时时间为15分钟。
如需修改可按模式选择按键和定时选择按键。
每按一次按键转换一次,可多次进行循环选择。
当某一次洗涤过程结束后,自动返回初始状态,等待下一次洗涤过程开始。
4.启/停控制
洗涤过程由启/停键控制。
每按一次启/停键,状态转换一次。
5.洗涤定时精度
洗涤定时误差要求不大于0.1秒。
为简化设计洗衣机洗涤控制电路,只要求输出正向和反向的电机控制信号。
二、洗衣机洗涤控制电路的结构
根据上述对洗衣机洗涤控制电路的性能要求,可以画出如下图所示的结构框图。
该控制器由四大部分组成:
主分频器、主控制器、洗涤定时器和水流控制器。
洗衣机洗涤控制电路的结构框图
主分频器
主分频器用来产生0.1秒的时钟供主控制器使用。
本方案DE2板自带时钟,其振荡频率为50MHz。
这样,主分频器的分频系数为5M。
现采用3个分频器构成主分频器的分频电路。
3个分频器是1k分频器、1k分频器和5分频器。
主分频器的结构如下图所示。
主分频器的结构
三、洗衣机洗涤控制电路的算法状态机图描述
1.主控制器算法状态机图描述
根据主控制器的工作要求,洗衣机洗涤时的工作状态共有以下9种:
标准——15分钟标准——10分钟
标准——5分钟轻柔——15分钟
轻柔——10分钟轻柔——5分钟
强洗——15分钟强洗——10分钟
强洗——5分钟
1)模式选择控制状态机图
2)定时选择控制状态机图
3)启/停控制算法状态机图描述
2.洗涤定时器算法状态机图描述
洗涤定时器有3种状态:
停止状态(IDLE)、计时状态(INCCOUNT)和暂停状态(TMP_STOP)。
3.水流控制器算法状态机图描述
该状态机图有3种状态:
停止状态(STOP)、电机接通定时计数状态(ON_TIME)和电机断开定时计数状态(OFF_TIME)。
四、洗衣机洗涤控制电路的VHDL语言描述
1.主分频器timectr_clkdiv模块
主分频器的功能是将50MHz的主频分频为10Hz的时钟。
该模块由3个进程组成,其VHDL语言描述的程序清单如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYtimectr_clkdivIS
PORT(sysclk:
INSTD_LOGIC;
clk_01:
OUTSTD_LOGIC);
ENDtimectr_clkdiv;
ARCHITECTURErtlOFtimectr_clkdivIS
SIGNALdiv1:
STD_LOGIC_VECTOR(9DOWNTO0):
="0000000000";
--divideby1kcounter
SIGNALdiv2:
STD_LOGIC_VECTOR(9DOWNTO0):
="0000000000";
--divideby1kcounter
SIGNALdiv3:
STD_LOGIC_VECTOR(2DOWNTO0):
="000";
--divideby5counter
SIGNALclk1,clk2:
STD_LOGIC;
BEGIN
div_1k:
PROCESS(sysclk)
BEGIN
IF(sysclk'EVENTANDsysclk='1')THEN
IF(div1="1111100111")THENdiv1<="0000000000";
ELSEdiv1<=div1+1;
ENDIF;
ENDIF;
ENDPROCESS;
clk1<=div1(999);
div_1k:
PROCESS(clk1)
BEGIN
IF(clk1'EVENTANDclk1='1')THEN
IF(div2="1111100111")THENdiv2<="0000000000";
ELSEdiv2<=div2+1;
ENDIF;
ENDIF;
ENDPROCESS;
clk2<=div2(999);
div_5:
PROCESS(clk2)
BEGIN
IF(clk2'EVENTANDclk2='1')THEN
IF(div3="100")THENdiv3<="000";
ELSEdiv3<=div3+1;
ENDIF;
ENDIF;
ENDPROCESS;
clk_01<=div3
(2);
ENDrtl;
div_5进程为5分频进程,div_1k进程为1000分频进程。
50MHz主频经该3个进程串行分频就得到10Hz的时钟clk_01。
2.定时器控制timer_ctr模块
如前所述,定时器控制timer_ctr模块的功能是根据启/停按键(start_stop)、模式选择按键(mode_sel)和定时选择按键(time_sel)的不同输入状态,产生对应的控制信号输出,其VHDL语言描述的程序清单如下。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYtimer_ctrIS
PORT(reset,sysclk,start_stop,mode_sel,time_sel,timer_down:
INSTD_LOGIC;
s5min_out,s10min_out,s15min_out,start_out:
OUTSTD_LOGIC;
b_out,j_out,z_out:
OUTSTD_LOGIC);
ENDtimer_ctr;
ARCHITECTURErtlOFtimer_ctrIS
TYPEstate1TYPEIS(s_b,s_z,s_j);
TYPEstate2TYPEIS(s_15min,s_10min,s_5min);
TYPEstate3TYPEIS(s_start,s_stop);
SIGNALstate1,nextstate1:
state1TYPE;
SIGNALstate2,nextstate2:
state2TYPE;
SIGNALstate3,nextstate3:
state3TYPE;
SIGNALstart_stop_rising,start_stop_dlayed,setstart,clrstart:
STD_LOGIC;
SIGNALmode_sel_dlayed,modesel_rising,time_sel_dlayed,timesel_rising,
timer_down_rising:
STD_LOGIC;
SIGNALset_5min,set_10min,set_15min,start,set_b,set_j,set_z,
timer_down_dlayed:
STD_LOGIC;
BEGIN
modesel_rising<=mode_selAND(NOTmode_sel_dlayed);
timesel_rising<=time_selAND(NOTtime_sel_dlayed);
start_stop_rising<=start_stopAND(NOTstart_stop_dlayed);
mode_ctr:
PROCESS(modesel_rising,state1,timer_down)
BEGIN
set_b<='0';set_j<='0';set_z<='0';
CASEstate1IS
WHENs_b=>set_b<='1';
IF(timer_down='1')THENset_b<='0';nextstate1<=s_b;
ELSIF(modesel_rising='0')THENnextstate1<=s_b;
ELSE
set_b<='0';nextstate1<=s_z;
ENDIF;
WHENs_z=>set_z<='1';
IF(timer_down='1')THENset_z<='0';nextstate1<=s_b;
ELSIF(modesel_rising='0')THENnextstate1<=s_z;
ELSE
set_z<='0';nextstate1<=s_j;
ENDIF;
WHENs_j=>set_j<='1';
IF(timer_down='1')THENset_j<='0';nextstate1<=s_b;
ELSIF(modesel_rising='0')THENnextstate1<=s_j;
ELSE
set_j<='0';nextstate1<=s_b;
ENDIF;
ENDCASE;
ENDPROCESS;
time_ctr:
PROCESS(timesel_rising,state2,timer_down)
BEGIN
set_15min<='0';set_10min<='0';set_5min<='0';
CASEstate2IS
WHENs_15min=>set_15min<='1';
IF(timer_down='1')THENset_15min<='0';nextstate2<=s_15min;
ELSIF(timesel_rising='0')THENnextstate2<=s_15min;
ELSE
nextstate2<=s_10min;
ENDIF;
WHENs_10min=>set_10min<='1';
IF(timer_down='1')THENset_10min<='0';nextstate2<=s_15min;
ELSIF(timesel_rising='0')THENnextstate2<=s_10min;
ELSE
nextstate2<=s_5min;
ENDIF;
WHENs_5min=>set_5min<='1';
IF(timer_down='1')THENset_5min<='0';nextstate2<=s_15min;
ELSIF(timesel_rising='0')THENnextstate2<=s_5min;
ELSE
nextstate2<=s_15min;
ENDIF;
ENDCASE;
ENDPROCESS;
timer_down_rising<=timer_downAND(NOTtimer_down_dlayed);
start_ctr:
PROCESS(start_stop_rising,state3,timer_down)
BEGIN
setstart<='0';clrstart<='0';
CASEstate3IS
WHENs_stop=>
IF(start_stop_rising='1')THENnextstate3<=s_start;setstart<='1';
ELSE
nextstate3<=s_stop;clrstart<='1';
ENDIF;
WHENs_start=>
IF(timer_down_rising='1')THENclrstart<='1';nextstate3<=s_stop;
ELSIF(start_stop_rising='1')THENnextstate3<=s_stop;clrstart<='1';
ELSE
nextstate3<=s_start;
ENDIF;
ENDCASE;
ENDPROCESS;
time_ctr_update:
PROCESS(reset,sysclk,timer_down_rising)
BEGIN
IF(reset='0')THEN
state1<=s_b;state2<=s_15min;state3<=s_stop;start_stop_dlayed<='0';
ELSIF(sysclk'EVENTANDsysclk='1')THEN
state1<=nextstate1;state2<=nextstate2;state3<=nextstate3;
IF(set_b='1')THENb_out<='1';ELSEb_out<='0';ENDIF;
IF(set_z='1')THENz_out<='1';ELSEz_out<='0';ENDIF;
IF(set_j='1')THENj_out<='1';ELSEj_out<='0';ENDIF;
IF(set_15min='1')THENs15min_out<='1';ELSEs15min_out<='0';ENDIF;
IF(set_10min='1')THENs10min_out<='1';ELSEs10min_out<='0';ENDIF;
IF(set_5min='1')THENs5min_out<='1';ELSEs5min_out<='0';ENDIF;
IF(timer_down_rising='1')THENstart_out<='0';
ELSIF(clrstart='1')THENstart_out<='0';
ELSIF(setstart='1')THENstart_out<='1';
ENDIF;
mode_sel_dlayed<=mode_sel;
time_sel_dlayed<=time_sel;
start_stop_dlayed<=start_stop;
timer_down_dlayed<=timer_down;
ENDIF;
ENDPROCESS;
ENDrtl;
该模块由4个进程组成。
mode_ctr进程是模式选择控制进程,对应图的模式选择控制状态机图;timer_cnt进程是定时选择控制进程,对应图的定时选择控制状态机图;start_ctr进程是启/停控制进程,对应图的启/停控制算法状态机图;最后一个进程是time_ctr_update进程,它的功能是根据上述3个进程中不同的控制标志输出,在该进程中对输出控制信号进行刷新,其刷新频率为系统主时钟频率(50MHz),这样就可确保控制的精度。
3.定时器timer_count模块
定时器timer_count模块的功能是根据定时控制输出,对洗衣机的洗涤时间进行定时控制。
它由3个进程构成,其VHDL语言描述的程序清单如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYtimer_countIS
PORT(reset,sysclk,clk_01,time_sel:
INSTD_LOGIC;
s5min_in,s10min_in,s15min_in,start_in:
INSTD_LOGIC;
timer_down_out,timer_on_out:
OUTSTD_LOGIC);
ENDtimer_count;
ARCHITECTURErtlOFtimer_countIS
COMPONENTcnt10a1
PORT(reset,clk:
INSTD_LOGIC;
carry:
OUTSTD_LOGIC);
ENDCOMPONENT;
COMPONENTcnt60a
PORT(reset,clk:
INSTD_LOGIC;
ca60:
OUTSTD_LOGIC);
ENDCOMPONENT;
TYPEstateTYPEIS(IDLE,INCOUNT,TMP_STOP);
SIGNALstate,nextstate:
stateTYPE;
SIGNALset_timer_on,set_timer_down,ca10,s1min,s1min_dlayed,s1min_rising,count_inc,count_clr:
STD_LOGIC;
SIGNALtime_sel_dlayed,time_sel_rising,setdown,clrdown,seton,clron,timer_on,timer_down,timer_down_dlayed,timer_down_rising,start1,reset1,clk_01_s:
STD_LOGIC;
SIGNALcount,count_u:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
s1min_rising<=s1minAND(NOTs1min_dlayed);
time_sel_rising<=time_selAND(NOTtime_sel_dlayed);
timer_down_rising<=timer_downAND(NOTtimer_down_dlayed);
count_ctr:
PROCESS(s1min_rising,state,start_in,count)
BEGIN
setdown<='0';clrdown<='0';seton<='0';clron<='0';count_inc<='0';count_clr<='0';
CASEstateIS
WHENIDLE=>clrdown<='1';
IF(start_in='1'ANDtimer_down='0')THEN
seton<='1';nextstate<=INCOUNT;
ELSE
clron<='1';nextstate<=IDLE;
ENDIF;
WHENINCOUNT=>IF(start_in='0')THENclron<='1';nextstate<=TMP_STOP;
ELSE
IF(s1min_rising='1')THEN
IF(count/=count_u)THEN
count_inc<='1';nextstate<=INCOUNT;
ELSE
clron<='1';
setdown<='1';
count_clr<='1';
nextstate<=IDLE;
ENDIF;
ENDIF;
ENDIF;
WHENTMP_STOP=>IF(start_in='1')THENnextstate<=INCOUNT;seton<='1';
ELSEnextstate<=TMP_STOP;
ENDIF;
ENDCASE;
ENDPROCESS;
update:
PROCESS(reset,sysclk)
BEGIN
IF(reset='0'AND(NOTtimer_down)='0')THEN
state<=IDLE;s1min_dlayed<='0';time_sel_dlayed<='0';
count<="0000";
ELSIF(sysclk'EVENTANDsysclk='1')THEN
state<=nextstate;
IF(seton='1')THENtimer_on<='1';ELSIF(clron='1')THENtimer_on<='0';ENDIF;
IF(clrdown='1')THENtimer_down<='0';ELSIF(setdown='1')THEN
timer_down<='1';ENDIF;
IF(count_inc='1')THEN
count<=count+1;
ELSIF(count_clr='1')THENcount<="0000";
ENDIF;
s1min_dlayed<=s1min;
time_sel_dlayed<=time_sel;
timer_down_dlayed<=timer_down;
ENDIF;
timer_down_out<=timer_down;timer_on_out<=timer_on;
ENDPROCESS;
INIT:
PROCESS(reset,time_sel_rising,timer_down_rising)
BEGIN
IF(reset='0'ortimer_down_rising='1')THEN
count_u<="1110";
ELSIF(time_sel_rising'EVENTANDtime_sel_rising='1')THEN
IF(s15min_in='1')THENcount_u<="1001";
ELSIF(s10min_in='1')THENcount_u<="0100";
ELSIF(s5min_in='1')THENcount_u<="1110";
ENDIF;
ENDIF;
ENDPROCESS;
clk_01_s<=clk_01ANDstart_in;
reset1<=resetAND(NOTtimer_down);
u0:
cnt10a1PORTMAP(reset1,clk_01_s,ca10);
u1:
cnt60aPORTMAP(reset1,ca10,s1min);
ENDrtl;
count_cnt进程是定时计时进程,根据定时选择所确定的定时时间进行计时控制,它对应于图的洗涤定时算法状态机图。
update进程是一个刷新进程,它根据count_ctr进程的输出控制标志,对输出控制信号进行刷新。
INIT进程是对本次定时器赋初值的进程。
定时器根据所赋初值的时间,实现洗涤时间的控制。
在timer_count清单中还含有10分频器和60分频器元件,这主要是为在本模块中得到分时钟s1min。
4.水流周期控制timeronoff_ctr模块
水流周期控制timeronoff_ctr模块的功能是控制洗涤电机的