Verilog-HDL课程设计_洗衣机模块
金品文档,尽在金牌辅导
洗衣机设计实例
一、洗衣机洗涤控制电路的性能要求
1(强洗、
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
、轻柔三种洗涤模式
强洗周期水流控制:正向电机接通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秒。
为简化设计洗衣机洗涤控制电路,只要求输出正向和反向的电机控制信号。
二、洗衣机洗涤控制电路的结构
根据上述对洗衣机洗涤控制电路的性能要求,可以画出如图10-17所示的结构框图。
该控制器由四大部分组成:主分频器、主控制器、洗涤定时器和水流控制器。
分钟定时到5复位10分钟启停/洗涤15分钟定时有效定时器洗涤模式选择start_in洗涤时间选择
主控制器
正通强正向控制反标准主分频器水流向?7680控制器停轻柔控反向控制制
时钟76 800 Hz
洗衣机洗涤控制电路的结构框图
1(主分频器
主分频器用来产生0.1秒的时钟供主控制器使用。本方案使用民用的石英晶体 ,其振荡频率为76.8 kHz。这样,主分频器的分频系数为7680。现采用3个分频器构成主分频器的分频电路。3个分频器是256分频器、3分频器和10分频器。主分频器的结构如图10-18所示。
876 800 Hz10 Hz?2?10?3
主分频器的结构
2(主控制器
主控制器的输入信号和输出信号如图10-17所示,分别叙述如下。
便宜下载==QQ:674083593 email:ffgo@foxmail.com 版权所有@金牌辅导 - 1 -
金品文档,尽在金牌辅导
(1) 输入信号:
reset:上电复位;
start_stop:启/停按键输入;
modesel:洗涤模式选择按键输入;
系统时钟输入(sysclk):76 800 Hz主时钟;
time_sel:洗涤定时选择按键输入;
timer_down:定时到输入。
(2) 输出信号:
5min_out:5分钟定时控制;
10min_out:10分钟定时控制;
15分钟定时控制; 15min_out:
start_out:启/停控制;
j_out:强水流控制;
b_out:标准水流控制;
z_out:轻柔水流控制。
3(洗涤定时器
洗涤定时器的功能是根据主控制器送来的有关控制信号,实现5分钟、10分钟和15分钟
的洗涤时间控制。其输入和输出信号分别如下。 (1) 输入信号:
s5min_in s10min_in
s15min_in start_in
reset sysclk (2) 输出信号:
timer_on_ou:定时有效;
timer_down_out:定时到。
4(水流控制器
水流控制器根据主控制器输出的强、标准、轻柔控制信号产生不同的水流控制周期,去
控制洗衣机电机的工作,其输入和输出信号分别如下。 (1) 输入信号:
j_in b_in
z_in sysclk
clk_01 timer_down
reset timer_on (2) 输出信号:
off_out:电机断开控制信号输出;
on_out:电机接通控制信号输出。
三、洗衣机洗涤控制电路的算法状态机图描述
1(主控制器算法状态机图描述
根据主控制器的工作要求,洗衣机洗涤时的工作状态共有以下9种:
标准——15分钟 标准——10分钟
标准——5分钟 轻柔——15分钟
轻柔——10分钟 轻柔——5分钟
强洗——15分钟 强洗——10分钟
强洗——5分钟
1)模式选择控制状态机图
便宜下载==QQ:674083593 email:ffgo@foxmail.com 版权所有@金牌辅导 - 2 -
reset
金品文档,尽在金牌辅导
s_15 min/set_15 mins_b/set_bset_15 min?0
YY timer_down是否有效,timer_down是否有效, set_b?0N NN NYtimer_sel是否有效,mode_sel
Yset_10 min?0 set_b?0 s_10 min/set_10 minY 是否有效, s_z/set_zNtimer_down Y
是否有效, N是否有效,timer_selYset_z?0timer_down YN N
是否有效, mode_selset_5 min?0 s_5 min/set_5 min Yset_z?0 是否有效,
timer_downN s_j/set_jN Y是否有效,timer_sel 是否有效,set_j?0 timer_downYNN
是否有效,mode_sel
Y
set_j?0
(a)
主控制器算法状态机图
(a) 模式选择控制状态机图;(b) 定时选择控制状态机图
复位后进入标准洗涤模式,并输出set_b标准模式状态信号。接着判断定时结束timer_down是否有效。如果有效,则
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
明洗涤结束,set_b置“0”回到标准模式状态;如果无效,则判别模式选择按键是否按下。如果未按下,则仍处于标准状态;如果已按下,则进入轻柔状态。通过类同的操作和判别,该状态机图可在标准、轻柔、强洗三种模式下循环选择和工作,并送出相应的状态信号。
2) 定时选择控制状态机图
定时选择控制状态机图如 10-19(b)所示。其结构与模式选择控制状态机图一致,所不同的仅仅是状态名、状态输出信号及引起状态转换的按键信号。图中的3个状态分别为 s_5 min、s_10 min、s_15 min。3个状态输出信号分别为set_5min、set_10min、set_15min。按键输入信号为timer_sel。
3) 启/停控制算法状态机图描述
主控制器还要产生启/停控制信号,启/停控制算法状态机图如下图所示。
便宜下载==QQ:674083593 email:ffgo@foxmail.com 版权所有@金牌辅导 - 3 -
金品文档,尽在金牌辅导
N
s_stop停止状态
Y
start_stop 是否有效, s_start/start
启动状态 start?1timer_down
Y 是否有效, start?0
NN
是否有效,start_stop
start?0
Y
上图中只有2种状态:停止状态和启动状态。系统复位时进入停止状态s_stop,当start_stop按键按下时,则状态转移至启动状态s_start,并送出启动控制信号start (start='1')。再按一下start_stop键,状态又能回停止状态,start 控制信号置“0”,暂停洗涤工作。再按一次start_stop按键,系统又回到启动状态。这样,根据需要可人为地暂停或启动洗衣机工作。 2(洗涤定时器算法状态机图描述
洗涤定时器算法状态机图如图10-21所示。
洗涤定时器有3种状态:停止状态(IDLE)、计时状态(INCCOUNT)和暂停状态(TMP_STOP)。
系统复位后就进入停止状态(IDLE)。在停止状态下不断判别启动信号start是否为“1”。如果为“1”,表明启动键已按下,定时器开始工作,timer_on标志置“1”,转移的下一个状态为计数状态;否则仍留在停止状态。
在计时状态下(INCCOUNT),先要判别启动信号是否仍为“1”。前面已经提到,启/停按键是一个乒乓按键,按一次启/停按键使start输出状态转换一次。如果复位后按一下启/停按键,使start=“1”,则定时器开始进行定时计数。如果再按一次启/停按键就会使start=“0”,定时器就处于暂时停止状态,定时计数值将被保留。如再按一次启/停键,洗涤定时器继续启动,在原有计时值上进行计时。如果在计时状态下发现start=“0”,定时器就进入暂停状态(temp_stop),同时timer_on置“0”,定时器停止计数。
在暂停状态下,继续判别start信号。如果start=“0”,则仍留在暂停状态;如果start=“1”表明定时器再启动,timer_on=“1”,状态将转移至计时状态。
在计时状态下,如果start=“1”,接着就判别分时钟上升沿是否到来s1min。如果未到来,则仍停留在计时状态;若分时钟的上升沿到来了,分计数器就进行加1操作。接着判断是否到了指定的定时计时值(定时计数值只有3种:5分钟、10分钟和15分钟)。如果未到计时值,仍停留在计时状态;如果到了计时值,则停止计时,Timer_on=“0”,timer_down=“1”,count=“0000”,start=“0”,状态转移至停止状态。
便宜下载==QQ:674083593 email:ffgo@foxmail.com 版权所有@金牌辅导 - 4 -
金品文档,尽在金牌辅导
IDLE
N,1, start Y
timer_on?1
INCCOUNT N
,1,
Ytimer_on?0timer_on?1start Ns 1 min?到来否, Y
TMP_STOPcount,count,1N Y,1, N,count_v,start count
Y
timer_on?0
timer_down?1
count?''0000''
start?0
NN
YY timer_downtimer_down3(水流控制器算法状态机图描述
on_count?0on_count?0 off_count?0off_count?0 seton?1seton?1STOP
Ntimer_onon_timer
Y
NYN set_ontimer_on
YOFF_timer
N clk_01?N timer_onY on_countY ,,N off_count,1on_count,1clk_01? YNN ,,off_counton_countoff_countoff_count_von_count_v
YY
off_down?1on_down?1
set_off?0set_off?1 set_on?1set_on?0 off_count?0on_count?0
该状态机图有3种状态:停止状态(STOP)、电机接通定时计数状态(ON_TIME)和电机断开
定时计数状态(OFF_TIME)。
系统复位后进入停止状态,接着判断洗涤定时器是否启动(timer_on='1')。如果未启动,则
仍停留在停止状态;如果已启动,则判别当前是处在电机接通定时计数状态,还是电机处在
便宜下载==QQ:674083593 email:ffgo@foxmail.com 版权所有@金牌辅导 - 5 -
金品文档,尽在金牌辅导 断开定时计数状态。根据设置不同,转入相应的状态:ON_TIME或OFF_TIME。
在ON_TIME状态下,判别timer_on是否继续为“1”(因为洗涤过程有可能暂停)。如果为“1”,再判别0.1秒时钟clk_01的上升沿是否到来。如果未到来,则停留在on_timer状态;如果已到来,则电机接通定时计数器加1(count_on=count_on+1)。下面要判别定时计数值是否到规定时间值:
强 洗 counton_u = 5秒
标准洗 counton_u = 3.5秒
轻柔洗 counton_u = 2.5秒
在未到规定计数值时,返回on_time 状态继续进行定时计数;当计数到规定的定时值时,就使cnton_clk、 clron 、cntoff_inc、 setoff置“1”,接着状态转移至电机断开定时计数状态off_timer。
在on_time状态下,如果发现timer_on为“0”,表明洗涤定时过程结束,对水流控制器进行初始化,然后进入停止状态。
电机断开的定时计数状态的工作过程与电机接通定时计数工作过程类同,请读者自行阅读。
下面对标志量的含义作一说明 :
seton='1' ? on_out='1';
clron='1' ? on_out='0';
setoff='1' ? off_out='1';
cnton_inc='1' ? count_on+1;
cntoff_inc='1' ? count_off+1;
四、洗衣机洗涤控制电路的VHDL语言描述
1(主分频器timectr_clkdiv模块
主分频器的功能是将76 800 Hz的主频分频为10 Hz的时钟。该模块由3个进程组成,其VHDL语言描述的程序清单如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY timectr_clkdiv IS
PORT(
sysclk:IN STD_LOGIC;
clk_01:OUT STD_LOGIC);
END timectr_clkdiv;
ARCHITECTURE rtl OF timectr_clkdiv IS SIGNAL div1:STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";
-- divide by 256 counter
SIGNAL div2:STD_LOGIC_VECTOR(7 DOWNTO 0):="00000000";
-- divide by 10 counter
SIGNAL div3:STD_LOGIC_VECTOR(1 DOWNTO 0):="00";
-- divide by 3 counter
SIGNAL clk1,clk2:STD_LOGIC;
BEGIN
div_10:PROCESS(clk1)
BEGIN
IF(clk1'EVENT AND clk1='1') THEN
IF(div1="1001") THEN div1<="0000";
ELSE div1<=div1+1;
END IF;
END IF;
END PROCESS;
便宜下载==QQ:674083593 email:ffgo@foxmail.com 版权所有@金牌辅导 - 6 -
金品文档,尽在金牌辅导 clk2<=div1(3);
div_256:PROCESS(sysclk)
BEGIN
IF(sysclk'EVENT AND sysclk='1') THEN
div2<=div2+1;
END IF;
END PROCESS;
clk1<=div2(7); --select baud rate
div_3:PROCESS(clk2)
BEGIN
IF(clk2'EVENT AND clk2='1') THEN
IF(div3="10") THEN div3<="00";
ELSE div3<=div3+1;
END IF;
END IF;
END PROCESS;
clk_01<=div3(1);
END rtl;
Div_10进程为10分频进程,div_256进程为256分频进程,div_3是3分频进程。76 800 Hz主频经该3个进程 串行分频就得到10 Hz的时钟clk_01。
2(定时器控制timer_ctr模块
如前所述,定时器控制timer_ctr模块的功能是根据启/停按键(start_stop)、模式选择按键(mode_sel)和定时选择按键(time_sel)的不同输入状态,产生对应的控制信号输出,其VHDL语言描述的程序清单如下。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY timer_ctr IS
PORT(reset,sysclk,start_stop,mode_sel,time_sel,timer_down:IN STD_LOGIC;
s5min_out,s10min_out,s15min_out,start_out:OUT STD_LOGIC;
b_out,j_out,z_out:OUT STD_LOGIC);
END timer_ctr;
ARCHITECTURE rtl OF timer_ctr IS
TYPE state1TYPE IS (s_b,s_z,s_j);
TYPE state2TYPE IS (s_15min,s_10min,s_5min);
TYPE state3TYPE IS (s_start,s_stop);
SIGNAL state1,nextstate1:state1TYPE;
SIGNAL state2,nextstate2:state2TYPE;
SIGNAL state3,nextstate3:state3TYPE;
SIGNAL start_stop_rising,start_stop_dlayed,setstart,clrstart:STD_LOGIC;
SIGNAL mode_sel_dlayed,modesel_rising,time_sel_dlayed,timesel_rising,
timer_down_rising:STD_LOGIC;
SIGNAL set_5min,set_10min,set_15min,start,set_b,set_j,set_z,
timer_down_dlayed:STD_LOGIC; BEGIN
modesel_rising<=mode_sel AND (NOT mode_sel_dlayed);
timesel_rising<=time_sel AND (NOT time_sel_dlayed);
start_stop_rising<=start_stop AND (NOT start_stop_dlayed);
mode_ctr:PROCESS(modesel_rising,state1,timer_down)
BEGIN
set_b<='0';set_j<='0';set_z<='0'; 便宜下载==QQ:674083593 email:ffgo@foxmail.com 版权所有@金牌辅导 - 7 -
金品文档,尽在金牌辅导
CASE state1 IS
WHEN s_b => set_b<='1';
IF(timer_down='1') THEN set_b<='0';nextstate1<=s_b;
ELSIF(modesel_rising='0') THEN nextstate1<=s_b;
ELSE
set_b<='0';nextstate1<=s_z;
END IF;
WHEN s_z => set_z<='1';
IF(timer_down='1') THEN set_z<='0';nextstate1<=s_b;
ELSIF(modesel_rising='0') THEN nextstate1<=s_z;
ELSE
set_z<='0';nextstate1<=s_j;
END IF;
WHEN s_j => set_j<='1';
IF(timer_down='1') THEN set_j<='0';nextstate1<=s_b;
ELSIF(modesel_rising='0') THEN nextstate1<=s_j;
ELSE
set_j<='0';nextstate1<=s_b;
END IF;
END CASE;
END PROCESS;
time_ctr:PROCESS(timesel_rising,state2,timer_down)
BEGIN
set_15min<='0'; set_10min<='0';set_5min<='0';
CASE state2 IS
WHEN s_15min => set_15min<='1';
IF(timer_down='1') THEN set_15min<='0';nextstate2<=s_15min;
ELSIF(timesel_rising='0') THEN nextstate2<=s_15min;
ELSE
nextstate2<=s_10min;
END IF;
WHEN s_10min => set_10min<='1';
IF(timer_down='1') THEN set_10min<='0';nextstate2<=s_15min;
ELSIF(timesel_rising='0') THEN nextstate2<=s_10min;
ELSE
nextstate2<=s_5min;
END IF;
WHEN s_5min => set_5min<='1';
IF(timer_down='1') THEN set_5min<='0';nextstate2<=s_15min;
ELSIF(timesel_rising='0') THEN nextstate2<=s_5min;
ELSE
nextstate2<=s_15min;
END IF;
END CASE;
END PROCESS;
timer_down_rising<=timer_down AND (NOT timer_down_dlayed);
start_ctr:PROCESS(start_stop_rising,state3,timer_down)
BEGIN
setstart<='0';clrstart<='0';
CASE state3 IS
WHEN s_stop =>
IF(start_stop_rising='1') THEN nextstate3<=s_start;setstart<='1';
ELSE
nextstate3<=s_stop;clrstart<='1'; 便宜下载==QQ:674083593 email:ffgo@foxmail.com 版权所有@金牌辅导 - 8 -
金品文档,尽在金牌辅导
END IF;
WHEN s_start =>
IF(timer_down_rising='1') THEN clrstart<='1';nextstate3<=s_stop;
ELSIF(start_stop_rising='1') THEN nextstate3<=s_stop;clrstart<='1';
ELSE
nextstate3<=s_start;
END IF;
END CASE;
END PROCESS;
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'EVENT AND sysclk='1') THEN
state1<=nextstate1;state2<=nextstate2;state3<=nextstate3;
IF(set_b='1') THEN b_out<='1';ELSE b_out<='0';END IF;
IF(set_z='1') THEN z_out<='1';ELSE z_out<='0';END IF;
IF(set_j='1') THEN j_out<='1';ELSE j_out<='0';END IF;
IF(set_15min='1') THEN s15min_out<='1';ELSE s15min_out<='0';END IF;
IF(set_10min='1') THEN s10min_out<='1';ELSE s10min_out<='0';END IF;
IF(set_5min='1') THEN s5min_out<='1';ELSE s5min_out<='0';END IF;
IF(timer_down_rising='1') THEN start_out<='0';
ELSIF(clrstart='1') THEN start_out<='0';
ELSIF(setstart='1') THEN start_out<='1';
END IF;
mode_sel_dlayed<=mode_sel;
time_sel_dlayed<=time_sel;
start_stop_dlayed<=start_stop;
timer_down_dlayed<=timer_down;
END IF;
END PROCESS;
END rtl;
该模块由4个进程组成。mode_ctr进程是模式选择控制进程,对应图10-19(a)的模式选择
控制状态机图;timer_cnt进程是定时选择控制进程,对应图10-19(b)的定时选择控制状态机图;
start_ctr进程是启/停控制进程,对应图10-20的启/停控制算法状态机图;最后一个进程是
time_ctr_update进程,它的功能是根据上述3个进程中不同的控制标志输出,在该进程中对
输出控制信号进行刷新,其刷新频率为系统主时钟频率(76 800 Hz),这样就可确保控制的精度。
3(定时器timer_count模块
定时器timer_count模块的功能是根据定时控制输出,对洗衣机的洗涤时间进行定时控制。
它由3个进程构成,其VHDL语言描述的程序清单如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY timer_count IS
PORT(reset,sysclk,clk_01,time_sel:IN STD_LOGIC;
s5min_in,s10min_in,s15min_in,start_in:IN STD_LOGIC;
timer_down_out,timer_on_out:OUT STD_LOGIC);
END timer_count;
ARCHITECTURE rtl OF timer_count IS
COMPONENT cnt10a1
PORT(reset,clk:IN STD_LOGIC;
carry:OUT STD_LOGIC);
便宜下载==QQ:674083593 email:ffgo@foxmail.com 版权所有@金牌辅导 - 9 -
金品文档,尽在金牌辅导
END COMPONENT;
COMPONENT cnt60a
PORT(reset,clk:IN STD_LOGIC;
ca60:OUT STD_LOGIC);
END COMPONENT;
TYPE stateTYPE IS (IDLE,INCOUNT,TMP_STOP);
SIGNAL state,nextstate:stateTYPE;
SIGNAL set_timer_on,set_timer_down,ca10,s1min,s1min_dlayed,s1min_rising,count_inc,
count_clr:STD_LOGIC;
SIGNAL time_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;
SIGNAL count,count_u:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
s1min_rising<=s1min AND (NOT s1min_dlayed);
time_sel_rising<=time_sel AND (NOT time_sel_dlayed);
timer_down_rising<=timer_down AND (NOT timer_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';
CASE state IS
WHEN IDLE =>clrdown<='1';
IF(start_in='1' AND timer_down='0') THEN
seton<='1';nextstate<=INCOUNT;
ELSE
clron<='1';nextstate<=IDLE;
END IF;
WHEN INCOUNT =>IF(start_in='0') THEN clron<='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;
END IF;
END IF;
END IF;
WHEN TMP_STOP =>IF(start_in='1') THEN nextstate<=INCOUNT;seton<='1';
ELSE nextstate<=TMP_STOP;
END IF;
END CASE;
END PROCESS;
update:PROCESS(reset,sysclk)
BEGIN
IF(reset='0' AND (NOT timer_down)='0') THEN
state<=IDLE;s1min_dlayed<='0';time_sel_dlayed<='0';
count<="0000";
ELSIF(sysclk'EVENT AND sysclk='1') THEN
state<=nextstate;
IF(seton='1') THEN timer_on<='1';ELSIF(clron='1') THEN timer_on<='0';END IF;
IF(clrdown='1') THEN timer_down<='0';ELSIF (setdown='1') THEN
便宜下载==QQ:674083593 email:ffgo@foxmail.com 版权所有@金牌辅导 - 10 -
金品文档,尽在金牌辅导
timer_down<='1';END IF;
IF(count_inc='1') THEN
count<=count+1;
ELSIF(count_clr='1') THEN count<="0000";
END IF;
s1min_dlayed<=s1min;
time_sel_dlayed<=time_sel;
timer_down_dlayed<=timer_down;
END IF;
timer_down_out<=timer_down ;timer_on_out<=timer_on;
END PROCESS;
INIT:PROCESS(reset,time_sel_rising,timer_down_rising)
BEGIN
IF(reset='0' or timer_down_rising='1') THEN
count_u<="1110";
ELSIF(time_sel_rising'EVENT AND time_sel_rising='1') THEN
IF(s15min_in='1') THEN count_u<="1001";
ELSIF(s10min_in='1') THEN count_u<="0100";
ELSIF(s5min_in='1') THEN count_u<="1110";
END IF;
END IF;
END PROCESS;
clk_01_s<=clk_01 AND start_in;
reset1<=reset AND (NOT timer_down); u0:cnt10a1 PORT MAP(reset1,clk_01_s,ca10);
u1:cnt60a PORT MAP(reset1,ca10,s1min);
END rtl;
count_cnt进程是定时计时进程,根据定时选择所确定的定时时间进行计时控制,它对应于图10-21的洗涤定时算法状态机图。update进程是一个刷新进程,它根据count_ctr进程的输出控制标志,对输出控制信号进行刷新。INIT进程是对本次定时器赋初值的进程。定时器根据所赋初值的时间,实现洗涤时间的控制。
在timer_count清单中还含有10分频器和60分频器元件,这主要是为在本模块中得到分时钟s1min。
4(水流周期控制timeronoff_ctr模块
水流周期控制timeronoff_ctr模块的功能是控制洗涤电机的通断时间,不同的洗涤模式有不同的通断时间要求。Timeronoff_ctr模块由3个进程组成,其VHDL语言描述的程序清单如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY timeronoff_ctr IS
PORT(reset,sysclk,clk_01,j_in,b_in,z_in,timer_on,timer_down:IN STD_LOGIC;
off_out,on_out:OUT STD_LOGIC);
END timeronoff_ctr;
ARCHITECTURE rtl OF timeronoff_ctr IS
COMPONENT cnt5a
PORT(reset,clk:IN STD_LOGIC;
carry:OUT STD_LOGIC);
END COMPONENT;
TYPE stateTYPE IS (on_time,off_time,STOP);
SIGNAL state,nextstate:stateTYPE;
便宜下载==QQ:674083593 email:ffgo@foxmail.com 版权所有@金牌辅导 - 11 -
金品文档,尽在金牌辅导
SIGNAL seton,clron,setoff,clroff,s05,s05_dlayed,s05_rising,reset1,
cnton_inc,cnton_clr,cntoff_inc,cntoff_clr:STD_LOGIC;
SIGNAL count_on,count_off,counton_u,countoff_u:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN
s05_rising<=s05 AND (NOT s05_dlayed);
state,timer_on,count_on,count_off) onoffcnt_ctr:PROCESS(s05_rising,
BEGIN
seton<='0';clron<='0';setoff<='0';clroff<='0';
cnton_inc<='0';cnton_clr<='0';cntoff_inc<='0';cntoff_clr<='0';
CASE state IS
WHEN stop =>IF(timer_on='1') THEN
IF(cntoff_inc='1') THEN nextstate<=off_time;setoff<='1';
ELSE nextstate<=on_time;seton<='1';END IF;
ELSE
nextstate<=stop;
END IF;
WHEN on_time =>IF(timer_on='0') THEN cnton_clr<='1';nextstate<=STOP;
ELSE
IF(s05_rising='1') THEN
IF(count_on/=counton_u) THEN
nextstate<=on_time;cnton_inc<='1';
ELSE
cnton_clr<='1';
clron<='1';
cntoff_inc<='1';
setoff<='1';
nextstate<=off_time;
END IF;
ELSE
nextstate<=on_time;
END IF;
END IF;
WHEN off_time =>IF(timer_on='0') THEN nextstate<=stop;clron<='1';clroff<='1';
ELSE
IF(s05_rising='1') THEN
IF(count_off/=countoff_u) THEN
nextstate<=off_time;cntoff_inc<='1';
ELSE
cntoff_clr<='1';
clroff<='1';
seton<='1';
cnton_inc<='1';
nextstate<=on_time;
END IF;
ELSE nextstate<=off_time;
END IF;
END IF;
END CASE;
END PROCESS;
INIT:PROCESS(j_in,b_in,z_in)
BEGIN
IF(j_in='1') THEN counton_u<="1010"; countoff_u<="0100";
ELSIF(b_in='1') THEN counton_u<="0111";countoff_u<="0011";
ELSIF(z_in='1') THEN counton_u<="0101";countoff_u<="0100"; 便宜下载==QQ:674083593 email:ffgo@foxmail.com 版权所有@金牌辅导 - 12 -
金品文档,尽在金牌辅导
END IF;
END PROCESS;
update:PROCESS(reset1,sysclk)
BEGIN
IF(reset1='0') THEN state<=stop;s05_dlayed<='0';count_on<="0000";
count_off<="0000";
ELSIF(sysclk'EVENT AND sysclk='1') THEN
state<=nextstate;
IF(seton='1') THEN on_out<='1';ELSIF(clron='1') THEN on_out<='0';END IF;
IF(setoff='1') THEN off_out<='1';ELSIF (clroff='1') THEN off_out<='0';END IF;
IF(cnton_inc='1') THEN
count_on<=count_on+1;
ELSIF(cnton_clr='1') THEN count_on<="0000";
END IF;
IF(cntoff_inc='1') THEN
count_off<=count_off+1;
ELSIF(cntoff_clr='1') THEN count_off<="0000";
END IF;
s05_dlayed<=s05;
END IF;
END PROCESS;
reset1<=reset AND (NOT timer_down);
u0:cnt5a PORT MAP(reset1,clk_01,s05);
END rtl;
Onoffcnt_ctr进程根据洗涤模式要求,对输出通断进行定时控制,其对应的状态机图如图10-22所示。INIT进程根据不同洗涤模式对通断进行初始化,以实现通断的定时控制。初始化的定时值以0.5秒为1个单位进行设置。最后一个进程为刷新进程update,它根据onoff_ctr进程控制标志的输出,对控制输出信号进行刷新操作。
在该模块中还有一个5分频元件,它对0.1秒时钟clk_01进行分频,得到0.5秒的时钟s05,作为通断定时器的计时定时脉冲。
5(洗涤定时控制电路timer_sum模块
洗涤定时控制电路timer_sum模块是将上述4个模块按结构化形式连接起来的整体系统模块,它实现了10.2.1节所提出的洗涤控制电路的功能,其VHDL语言描述的程序清单如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY timer_sum IS
PORT(reset,clk,start_stop,mode_sel,time_sel:IN STD_LOGIC;
p_out,m_out,on_out,off_out,start_out,timer_down_out,j_out,b_out,z_out:OUT STD_LOGIC);
END timer_sum;
ARCHITECTURE rtl OF timer_sum IS
COMPONENT dff3
PORT(reset,set,clk,d:IN STD_LOGIC;
q,qb:OUT STD_LOGIC);
END COMPONENT;
COMPONENT timeronoff_ctr
PORT(reset,sysclk,clk_01,j_in,b_in,z_in,timer_on,timer_down:IN STD_LOGIC;
off_out,on_out:OUT STD_LOGIC);
END COMPONENT;
便宜下载==QQ:674083593 email:ffgo@foxmail.com 版权所有@金牌辅导 - 13 -
金品文档,尽在金牌辅导 COMPONENT timectr_clkdiv
PORT(
sysclk:IN STD_LOGIC;
clk_01:OUT STD_LOGIC);
END COMPONENT;
COMPONENT timer_count
PORT(reset,sysclk,clk_01,time_sel:IN STD_LOGIC;
s5min_in,s10min_in,s15min_in,start_in:IN STD_LOGIC;
timer_down_out,timer_on_out:OUT STD_LOGIC); END COMPONENT;
COMPONENT timer_ctr
PORT(reset,sysclk,start_stop,mode_sel,time_sel,timer_down:IN STD_LOGIC;
s5min_out,s10min_out,s15min_out,start_out:OUT STD_LOGIC;
b_out,j_out,z_out:OUT STD_LOGIC);
END COMPONENT;
SIGNAL timer_down,s5min_s,s10min_s,s15min_s,start_s,b_s,j_s,z_s,reset1,
timer_on,off_s,on_s,q_s,q_b,d,set,clk_01:STD_LOGIC;
BEGIN
set<='1';
on_out<=on_s;
off_out<=off_s;
p_out<=q_s AND on_s AND timer_on; m_out<=q_b AND on_s AND timer_on; start_out<=start_s;
timer_down_out<= timer_down;
j_out<=j_s;
b_out<=b_s;
z_out<=z_s;
u0: timer_ctr PORT MAP(reset,clk,start_stop,mode_sel,time_sel,timer_down,s5min_s,s10min_s,s15min_s,start_s,b_s,j_s,z_s);
u1:timectr_clkdiv PORT MAP(clk,clk_01);
u2:timer_count PORT MAP(reset,clk,clk_01,time_sel,s5min_s,s10min_s,s15min_s,start_s,timer_down,timer_on);
u3:timeronoff_ctr PORT MAP(reset,clk,clk_01,j_s,b_s,z_s,timer_on,timer_down,off_s,on_s);
u4: dff3 PORT MAP(reset,set,on_s,q_b,q_s,q_b);
END rtl;
清单中元件u4是一个T触发器,它可实现电机正转、反转的输出控制。
便宜下载==QQ:674083593 email:ffgo@foxmail.com 版权所有@金牌辅导 - 14 -