现代数字系统设计 最后Word格式.docx

上传人:b****5 文档编号:16893466 上传时间:2022-11-26 格式:DOCX 页数:26 大小:291.67KB
下载 相关 举报
现代数字系统设计 最后Word格式.docx_第1页
第1页 / 共26页
现代数字系统设计 最后Word格式.docx_第2页
第2页 / 共26页
现代数字系统设计 最后Word格式.docx_第3页
第3页 / 共26页
现代数字系统设计 最后Word格式.docx_第4页
第4页 / 共26页
现代数字系统设计 最后Word格式.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

现代数字系统设计 最后Word格式.docx

《现代数字系统设计 最后Word格式.docx》由会员分享,可在线阅读,更多相关《现代数字系统设计 最后Word格式.docx(26页珍藏版)》请在冰豆网上搜索。

现代数字系统设计 最后Word格式.docx

clk_01:

OUTSTD_LOGIC);

ENDtimectr_clkdiv;

ARCHITECTURErtlOFtimectr_clkdivIS

SIGNALdiv1:

STD_LOGIC_VECTOR(3DOWNTO0):

="

0000"

;

--divideby10counter

SIGNALdiv2:

STD_LOGIC_VECTOR(7DOWNTO0):

00000000"

--divideby256counter

SIGNALdiv3:

STD_LOGIC_VECTOR(1DOWNTO0):

00"

--divideby3counter

SIGNALclk1,clk2:

STD_LOGIC;

BEGIN

div_10:

PROCESS(clk1)

IF(clk1'

EVENTANDclk1='

1'

)THEN

IF(div1="

1001"

)THENdiv1<

ELSEdiv1<

=div1+1;

ENDIF;

ENDIF;

ENDPROCESS;

clk2<

=div1(3);

div_256:

PROCESS(sysclk)

IF(sysclk'

EVENTANDsysclk='

)THEN

div2<

=div2+1;

clk1<

=div2(7);

--selectbaudrate

div_3:

PROCESS(clk2)

IF(clk2'

EVENTANDclk2='

IF(div3="

10"

)THENdiv3<

ELSEdiv3<

=div3+1;

clk_01<

=div3

(1);

ENDrtl;

在MAXPLUS软件中编译成功后生成的顶层文件TIMER_CLKDIV为:

单独对以上分频程序进行仿真,所的仿真结果如图3所示。

图3由程序timerctr_clkdiv仿真所得结果

由图得:

当设定输入sysclk的周期约为13.02us(频率为76800HZ)时,图形阴影部分的时间间隔为0.1s,即经分频后clk_01周期为0.1s故符合设计要求。

2主控制器程序设计及其仿真

(1)主控制器输入输出设计

主控制器的设计包括的输入信号和输出信号如图1所示,分别叙述如下。

(1)输入信号:

reset:

上电复位;

start_stop:

启/停按键输入;

modesel:

洗涤模式选择按键输入;

系统时钟输入(sysclk):

76800Hz主时钟;

timer_down:

定时到输入。

(2)输出信号:

start_out:

启/停控制

j_out:

强洗水流控制;

b_out:

标准水流控制;

z_out:

轻柔水流控制

(2)主控制器算法状态机图设计

主控制器的功能包括:

1、输出洗衣机启/停信号。

2、输出洗涤模式(强洗、标准、轻柔)的选择信号。

故对主控制器的算法状态机图设计,包括对启/停控制算法状态机图以及洗涤模式选择状态机图的设计,分别如图4、图5所示。

图4启/停控制算法状态机图

如图4所示的算法状态机图,图中只有2种状态:

停止状态和启动状态。

系统复位时进入停止状态s_stop,当start_stop按键按下时,则状态转移至启动状态s_start,并送出启动控制信号start(start='

)。

再按一下start_stop键,状态又能回停止状态,start控制信号置“0”,暂停洗涤工作。

再按一次start_stop按键,系统又回到启动状态。

这样,根据需要可人为地暂停或启动洗衣机工作。

图5主控制器的算法状态机图

如图5所示主控制器控制算法状态机图,复位后进入标准洗涤模式,并输出set_b标准模式状态信号。

接着判断定时结束timer_down是否有效。

如果有效,则表明洗涤结束,set_b置“0”回到标准模式状态;

如果无效,则判别模式选择按键是否按下。

如果未按下,则仍处于标准状态;

如果已按下,则进入轻柔状态。

通过类同的操作和判别,该状态机图可在标准、轻柔、强洗三种模式下循环选择和工作,并送出相应的状态信号。

(3)主控制器的VHDL程序、顶层文件及程序仿真

主控制器的VHDL程序为timer_ctr,如下所述:

USEIEEE.STD_LOGIC_ARITH.ALL;

--系统时钟sysclk:

76800Hz,timer_down:

计时时间到

ENTITYtimer_ctrIS

PORT(reset,sysclk,start_stop,mode_sel,timer_down:

start_out,b_out,j_out,z_out:

ENDtimer_ctr;

ARCHITECTURErtlOFtimer_ctrIS

TYPEstate1TYPEIS(s_b,s_z,s_j);

--洗涤模式选择,标准,轻柔,强

TYPEstate3TYPEIS(s_start,s_stop);

--启停模式

SIGNALstate1,nextstate1:

state1TYPE;

SIGNALstate3,nextstate3:

state3TYPE;

SIGNALstart_stop_rising,start_stop_dlayed,setstart,clrstart:

SIGNALmode_sel_dlayed,modesel_rising,timer_down_rising:

SIGNALstart,set_b,set_j,set_z,timer_down_dlayed:

modesel_rising<

=mode_selAND(NOTmode_sel_dlayed);

start_stop_rising<

=start_stopAND(NOTstart_stop_dlayed);

mode_ctr:

PROCESS(modesel_rising,state1,timer_down)

BEGIN

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;

WHENs_z=>

set_z<

)THENset_z<

=s_j;

WHENs_j=>

set_j<

)THENset_j<

ENDCASE;

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<

ENDIF;

ENDPROCESS;

time_ctr_update:

PROCESS(reset,sysclk,timer_down_rising)

IF(reset='

state1<

state3<

start_stop_dlayed<

ELSIF(sysclk'

=nextstate1;

state3<

=nextstate3;

IF(set_b='

)THENb_out<

ELSEb_out<

ENDIF;

IF(set_z='

)THENz_out<

ELSEz_out<

IF(set_j='

)THENj_out<

ELSEj_out<

)THENstart_out<

ELSIF(clrstart='

ELSIF(setstart='

mode_sel_dlayed<

=mode_sel;

start_stop_dlayed<

=start_stop;

timer_down_dlayed<

=timer_down;

在MAXPLUS软件中编译成功后生成的顶层器件timer_ctr为:

对timer_ctr单独进行仿真,得到的仿真结果如图6所示为:

图6对程序timer_ctr仿真所得仿真结果

由图6所示的仿真图得出:

当start_stop为1,timer_down为0,mode_sel为0时,洗衣机定时器开始工作,洗涤模式为标准;

当按照标准模式运行过程中,遇mode_sel为1,洗涤模式改变为轻柔;

当按照轻柔模式工作时,遇mode_sel为1,则洗涤模式改变为强洗;

而当按照强洗模式工作时,遇mode_sel为1时,则洗涤模式改变为标准模式;

当洗衣机工作过程中遇timer_down为1时间段,则在此时间段,洗衣机不工作。

以上仿真结果符合设计要求。

3洗涤定时器程序设计及其仿真

(1)洗涤定时器输入输出设计

洗涤定时器的功能是根据主控制器送来的有关控制信号,实现15分钟的洗涤时间控制。

其输入和输出信号分别如下。

(1)输入信号:

reset

sysclk

start_in

timer_on_out:

定时有效;

timer_down_out:

定时到

(2)洗涤定时器算法状态机图设计

图7洗涤定时器算法状态机图

所设计的洗涤定时器的算法状态机图如图7所示。

定时器有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操作。

接着判断是否到了指定的定时计时值(15分钟)。

如果未到计时值,仍停留在计时状态;

如果到了计时值,则停止计时,Timer_on=“0”,timer_down=“1”,count=“0000”,start=“0”,状态转移至停止状态

(3)洗涤定时器VHDL程序、顶层文件以及程序仿真

所设计的洗涤定时器的VHDL程序timer_count为:

ENTITYtimer_countIS

PORT(reset,sysclk,clk_01,start_in:

timer_down_out,timer_on_out:

ENDtimer_count;

ARCHITECTURErtlOFtimer_countIS

COMPONENTcnt10

PORT(reset,clk:

div10:

ENDCOMPONENT;

COMPONENTcnt60

div60:

TYPEstateTYPEIS(IDLE,INCOUNT,TMP_STOP);

SIGNALstate,nextstate:

stateTYPE;

SIGNALset_timer_on,set_timer_down,ca10,s1min,s1min_dlayed,s1min_rising,count_inc,count_clr:

SIGNALsetdown,clrdown,seton,clron,timer_on,timer_down,timer_down_dlayed,timer_down_rising,reset1,clk_01_s:

SIGNALcount,count_u:

STD_LOGIC_VECTOR(3DOWNTO0);

s1min_rising<

=s1minAND(NOTs1min_dlayed);

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='

seton<

nextstate<

=INCOUNT;

clron<

=IDLE;

WHENINCOUNT=>

IF(start_in='

=TMP_STOP;

IF(s1min_rising='

IF(count/=count_u)THEN

count_inc<

ELSE

clron<

setdown<

count_clr<

nextstate<

WHENTMP_STOP=>

)THENnextstate<

ELSEnextstate<

update:

PROCESS(reset,sysclk)

AND(NOTtimer_down)='

state<

s1min_dlayed<

count<

state<

=nextstate;

IF(seton='

)THENtimer_on<

ELSIF(clron='

ENDIF;

IF(clrdown='

)THENtimer_down<

ELSIF(setdown='

timer_down<

IF(count_inc='

count<

=count+1;

ELSIF(count_clr='

)THENcount<

s1min_dlayed<

=s1min;

timer_down_out<

=timer_down;

timer_on_out<

=timer_on;

INIT:

PROCESS(reset,timer_down_rising)

ortimer_down_rising='

count_u<

1110"

clk_01_s<

=clk_01ANDstart_in;

reset1<

=resetAND(NOTtimer_down);

u0:

cnt10PORTMAP(reset1,clk_01_s,ca10);

--10分频,1Hz

u1:

cnt60PORTMAP(reset1,ca10,s1min);

--60分频,周期1min

程序中的十进制和六十进制计数器的程序分别为cnt10和程序cnt60:

cnt10如下所示:

ENTITYcnt10IS

div10:

ENDENTITYcnt10;

ARCHITECTURErtlOFcnt10IS

SIGNALdiv_2:

PROCESS(clk,reset)

IF(reset='

div_2<

ELSIF(clk'

EVENTANDclk='

IF(div_2="

ELSEdiv_2<

=div_2+1;

div10<

=div_2(3);

ENDARCHITECTURErtl;

cnt60如下所示:

LIBRA

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

当前位置:首页 > 小学教育 > 数学

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

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