基于FPGA的洗衣机的设计.docx

上传人:b****5 文档编号:6900743 上传时间:2023-01-12 格式:DOCX 页数:28 大小:518.87KB
下载 相关 举报
基于FPGA的洗衣机的设计.docx_第1页
第1页 / 共28页
基于FPGA的洗衣机的设计.docx_第2页
第2页 / 共28页
基于FPGA的洗衣机的设计.docx_第3页
第3页 / 共28页
基于FPGA的洗衣机的设计.docx_第4页
第4页 / 共28页
基于FPGA的洗衣机的设计.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

基于FPGA的洗衣机的设计.docx

《基于FPGA的洗衣机的设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA的洗衣机的设计.docx(28页珍藏版)》请在冰豆网上搜索。

基于FPGA的洗衣机的设计.docx

基于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模块的功能是控制洗涤电机的

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1