基于FPGA的洗衣机的设计Word格式文档下载.docx
《基于FPGA的洗衣机的设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于FPGA的洗衣机的设计Word格式文档下载.docx(28页珍藏版)》请在冰豆网上搜索。
![基于FPGA的洗衣机的设计Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2023-1/10/9d8de4b8-58d7-404a-8905-9f1937275ffe/9d8de4b8-58d7-404a-8905-9f1937275ffe1.gif)
主分频器、主控制器、洗涤定时器和水流控制器。
洗衣机洗涤控制电路的结构框图
主分频器
主分频器用来产生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:
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<
ELSEdiv1<
=div1+1;
ENDIF;
ENDIF;
ENDPROCESS;
clk1<
=div1(999);
PROCESS(clk1)
IF(clk1'
EVENTANDclk1='
IF(div2="
)THENdiv2<
ELSEdiv2<
=div2+1;
clk2<
=div2(999);
div_5:
PROCESS(clk2)
IF(clk2'
EVENTANDclk2='
IF(div3="
100"
)THENdiv3<
ELSEdiv3<
=div3+1;
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语言描述的程序清单如下。
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYtimer_ctrIS
PORT(reset,sysclk,start_stop,mode_sel,time_sel,timer_down:
s5min_out,s10min_out,s15min_out,start_out:
OUTSTD_LOGIC;
b_out,j_out,z_out:
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:
SIGNALmode_sel_dlayed,modesel_rising,time_sel_dlayed,timesel_rising,
timer_down_rising:
SIGNALset_5min,set_10min,set_15min,start,set_b,set_j,set_z,
timer_down_dlayed:
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)
set_b<
='
0'
set_j<
set_z<
CASEstate1IS
WHENs_b=>
IF(timer_down='
)THENset_b<
nextstate1<
=s_b;
ELSIF(modesel_rising='
)THENnextstate1<
ELSE
=s_z;
ENDIF;
WHENs_z=>
set_z<
)THENset_z<
=s_j;
WHENs_j=>
set_j<
)THENset_j<
ENDCASE;
ENDPROCESS;
time_ctr:
PROCESS(timesel_rising,state2,timer_down)
set_15min<
set_10min<
set_5min<
CASEstate2IS
WHENs_15min=>
)THENset_15min<
nextstate2<
=s_15min;
ELSIF(timesel_rising='
)THENnextstate2<
nextstate2<
=s_10min;
WHENs_10min=>
)THENset_10min<
=s_5min;
WHENs_5min=>
set_5min<
)THENset_5min<
timer_down_rising<
=timer_downAND(NOTtimer_down_dlayed);
start_ctr:
PROCESS(start_stop_rising,state3,timer_down)
setstart<
clrstart<
CASEstate3IS
WHENs_stop=>
IF(start_stop_rising='
)THENnextstate3<
=s_start;
setstart<
nextstate3<
=s_stop;
WHENs_start=>
IF(timer_down_rising='
)THENclrstart<
nextstate3<
ELSIF(start_stop_rising='
nextstate3<
time_ctr_update:
PROCESS(reset,sysclk,timer_down_rising)
IF(reset='
)THEN
state1<
state2<
state3<
start_stop_dlayed<
ELSIF(sysclk'
)THEN
=nextstate1;
state2<
=nextstate2;
state3<
=nextstate3;
IF(set_b='
)THENb_out<
ELSEb_out<
ENDIF;
IF(set_z='
)THENz_out<
ELSEz_out<
IF(set_j='
)THENj_out<
ELSEj_out<
IF(set_15min='
)THENs15min_out<
ELSEs15min_out<
IF(set_10min='
)THENs10min_out<
ELSEs10min_out<
IF(set_5min='
)THENs5min_out<
ELSEs5min_out<
)THENstart_out<
ELSIF(clrstart='
ELSIF(setstart='
mode_sel_dlayed<
=mode_sel;
time_sel_dlayed<
=time_sel;
start_stop_dlayed<
=start_stop;
timer_down_dlayed<
=timer_down;
该模块由4个进程组成。
mode_ctr进程是模式选择控制进程,对应图的模式选择控制状态机图;
timer_cnt进程是定时选择控制进程,对应图的定时选择控制状态机图;
start_ctr进程是启/停控制进程,对应图的启/停控制算法状态机图;
最后一个进程是time_ctr_update进程,它的功能是根据上述3个进程中不同的控制标志输出,在该进程中对输出控制信号进行刷新,其刷新频率为系统主时钟频率(50MHz),这样就可确保控制的精度。
3.定时器timer_count模块
定时器timer_count模块的功能是根据定时控制输出,对洗衣机的洗涤时间进行定时控制。
它由3个进程构成,其VHDL语言描述的程序清单如下:
ENTITYtimer_countIS
PORT(reset,sysclk,clk_01,time_sel:
s5min_in,s10min_in,s15min_in,start_in:
timer_down_out,timer_on_out:
ENDtimer_count;
ARCHITECTURErtlOFtimer_countIS
COMPONENTcnt10a1
PORT(reset,clk:
carry:
ENDCOMPONENT;
COMPONENTcnt60a
ca60:
TYPEstateTYPEIS(IDLE,INCOUNT,TMP_STOP);
SIGNALstate,nextstate:
stateTYPE;
SIGNALset_timer_on,set_timer_down,ca10,s1min,s1min_dlayed,s1min_rising,count_inc,count_clr:
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:
SIGNALcount,count_u:
STD_LOGIC_VECTOR(3DOWNTO0);
s1min_rising<
=s1minAND(NOTs1min_dlayed);
time_sel_rising<
timer_down_rising<
count_ctr:
PROCESS(s1min_rising,state,start_in,count)
BEGIN
setdown<
clrdown<
seton<
clron<
count_inc<
count_clr<
CASEstateIS
WHENIDLE=>
IF(start_in='
ANDtimer_down='
nextstate<
=INCOUNT;
clron<
=IDLE;
WHENINCOUNT=>
IF(start_in='
)THENclron<
=TMP_STOP;
IF(s1min_rising='
IF(count/=count_u)THEN
count_inc<
ELSE
setdown<
count_clr<
nextstate<
WHENTMP_STOP=>
)THENnextstate<
ELSEnextstate<
update:
PROCESS(reset,sysclk)
AND(NOTtimer_down)='
state<
s1min_dlayed<
time_sel_dlayed<
count<
0000"
=nextstate;
IF(seton='
)THENtimer_on<
ELSIF(clron='
IF(clrdown='
)THENtimer_down<
ELSIF(setdown='
timer_down<
IF(count_inc='
=count+1;
ELSIF(count_clr='
)THENcount<
=s1min;
timer_down_out<
=timer_down;
timer_on_out<
=timer_on;
INIT:
PROCESS(reset,time_sel_rising,timer_down_rising)
ortimer_down_rising='
count_u<
1110"
ELSIF(time_sel_rising'
EVENTANDtime_sel_rising='
IF(s15min_in='
)THENcount_u<
1001"
ELSIF(s10min_in='
0100"
ELSIF(s5min_in='
clk_01_s<
=clk_01ANDstart_in;
reset1<
=resetAND(NOTtimer_down);
u0:
cnt10a1PORTMAP(reset1,clk_01_s,ca10);
u1:
cnt60aPORTMAP(reset1,ca10,s1min);
count_cnt进程是定时计时进程,根据定时选择所确定的定时时间进行计时控制,它对应于图的洗涤定时算法状态机图。
update进程是一个刷新进程,它根据count_ctr进程的输出控制标志,对输出控制信号进行刷新。
INIT进程是对本次定时器赋初值的进程。
定时器根据所赋初值的时间,实现洗涤时间的控制。
在timer_count清单中还含有10分频器和60分频器元件,这主要是为在本模块中得到分时钟s1min。
4.水流周期控制timeronoff_ctr模块
水流周期控制timeronoff_ctr模块的功能是控制洗涤电机的