eda第五章.docx
- 文档编号:15515759
- 上传时间:2023-07-05
- 格式:DOCX
- 页数:18
- 大小:156.17KB
eda第五章.docx
《eda第五章.docx》由会员分享,可在线阅读,更多相关《eda第五章.docx(18页珍藏版)》请在冰点文库上搜索。
eda第五章
第五章状态机在VHDL中的实现
利用VHDL设计的许多实用逻辑系统中,有许多是可以利用有限状态机的设计方法来描述和实现的。
无论与基于VHDL的其它设计方案相比,还是与可完成相似功能的CPU相比,状态机都有其无可比拟的优越性。
状态机设计与分类的传统理论是根据状态机的输出输入关系,将其分为所谓Mealy型和Moore型两类状态机。
然而,面对多种多样的实际应用要求,可以有更多种类,结构类型和功能特点的状态机。
Mealy型和Moore型两类状态机区别就在于:
Mealy型系统的输出不仅受系统当前状态的控制,而且受输入控制信号状态的控制;Moore型系统的输出仅受当前系统状态的控制。
状态机的结构框图
状态机一般由三部分组成:
状态译码器、状态寄存器、输出译码器。
采用VHDL进行描述时亦有多种方法,如表5-14所示。
描述风格
功能划分
进程数目
风格A
1.次态译码2.状态寄存器3.输出译码
3
风格B
1.次态译码、状态寄存器、输出译码
1
风格C
1.次态译码、状态寄存器
2.输出译码
2
风格D
1.次态译码
2.状态寄存器、输出译码
2
风格E
1.次态译码、输出译码
2.状态寄存器
2
有些系统除了表5-14中的主要进程外,还有一些辅助进程,一般由以下几部分组成:
(1)说明部分
说明部分中有新数据类型TYPE的定义以及其状态类型(状态名)以及在此新数据下定义的状态变量。
状态类型一般用枚举类型,其中每一个状态名可任意选取。
但为了便于辨认和含义明确,状态名最好有明显的解释性意义。
状态变量一定定义为信号,便于信息传递,说明部分放在结构体的定义语句区即ARCHITECTURE和BEGIN之间。
例如:
ARCHITECTURE...IS
TYPEstatesIS(st0,st1,st2,st3);--定义新的数据类型和状态名
SIGNALcurrent_state,next_state:
states;--定义状态变量
...
BEGIN
...;
(2)主控时序进程
主控时序进程完成状态转移的功能。
状态机是随外部时钟信号,以同步时序方式工作的,因此,状态机中必须包含一个对工作时钟信号敏感的进程,作为状态机的“驱动泵”。
状态机的下一个状态(包括再次进入本状态)仅仅取决于时钟信号的到来。
根据实际情况来决定,此进程中也可以放置一些同步清零或置位方面的控制信号。
(3)主控组合进程
主控组合进程完成状态输出的功能是根据外部输入的控制信号或当前状态机的状态值确定对外输出或对内部其它组合或时序进程输出控制信号的内容
(4)辅助组合进程
用于配合状态机工作的其它组合进程,如为了完成某种算法的进程。
(5)辅助时序进程
用于配合状态机工作的其它时序进程,如为了稳定输出设置的数据锁存器等。
例一:
Moore状态机的VHDL描述
Moore型系统的输出仅受当前系统状态的控制。
LIBRRYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYMooreIS
PORT
(Reset:
INSTD_LOGIC;
Clock:
INSTD_LOGIC;
DIN:
INSTD_LOGIC;
DOUT:
OUTSTD_LOGIC_Vector(2DOWNTO0)
);
END;
ARCHITECTUREMooremachineOFMooreIS
TYPEState_typeIS(S0,S!
S2,S3);
SIGNALState:
State_type;
BEGIN
Change_State:
PROCESS(Reset,Clock)
BEGIN
IFReset=′1′THEN
State<=S0;
ELSEIFrising_edge(Clock)THEN
CASEStateIS
WHENS0=>
IFDIN=′1′THEN
State<=S1;
ENDIF;
WHENS1=>
IFDIN=′1′THEN
State<=S2;
ENDIF;
WHENS2>=
IFDIN=′1′THEN
State<=S3;
ENDIF;
WHHENS3=>
IFDIN=′1′THEN
State<=S0;
ELSE
State<=S1;
ENDIF;
ENDCASE;
ENDIF;
ENDPROCESS;
OUTput_Process:
PROCESS(State)
BEGIN
CASEStateIS
WHENS0=>DOUT<=″001″;
WHENS1=>DOUT<=″101″;
WHENS3=>DOUT<=″111″;
ENDCASE;
ENDPROCESS;
例二:
Mealy状态机的VHDL描述
Mealy型系统的输出不仅受系统当前状态的控制,而且受输入控制信号状态的控制;
LIBRRYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYMealyMachineIS
PORT
(Reset:
INSTD_LOGIC;
Clock:
INSTD_LOGIC;
DIN:
INSTD_LOGIC;
DOUT:
OUTSTD_LOGIC_Vector(2DOWNTO0)
);
END;
ARCHITECTUREStatemachineOFMealyMachineIS
TYPEState_typeIS(S0,S!
S2,S3);
SIGNALState:
State_type;
BEGIN
Change_State:
PROCESS(Reset,Clock)
BEGIN
IFReset=′1′THEN
State<=S0;
ELSEIFrising_edge(Clock)THEN
CASEStateIS
WHENS0=>
IFDIN=′1′THEN
State<=S1;
ENDIF;
WHENS1=>
IFDIN=′1′THEN
State<=S2;
ENDIF;
WHENS2>=
IFDIN=′1′THEN
State<=S3;
ENDIF;
WHHENS3=>
IFDIN=′1′THEN
State<=S0;
ELSE
State<=S1;
ENDIF;
ENDCASE;
ENDIF;
ENDPROCESS;
OUTput_Process:
PROCESS(State,DIN)
BEGIN
CASEStateIS
WHENS0=>
IFDIN=′0′THEN
DOUT<=″000″;
ELSE
DOUT<=″001″;
ENDIF;
WHENS1=>
IFDIN=′0′THEN
DOUT<=″010″
ELSE
DOUT<=″011″;
ENDIF;
WHENS2=>
IFDIN=′0′THEN
DOUT<=″100″;
ELSE
DOUT<=″101″;
ENDIF:
WHENS3=>
IFDIN=′0′THEN
DOUT<=″110″;
ELSE
DOUT<=″111″;
ENDIF:
ENDCASE;
ENDPROCESS;
例三:
利用状态机工作方式设计的空调机控制器
例5-58是一个利用状态机工作方式设计的空调机控制器。
有两个温度控制输入信号,两个温度调节控制输出信号,一个时钟输入信号。
tmp_hign----温度太高
tmp_low-----温度太低
heat-----------加热
cool-----------降温
clk------------时钟信号
其状态转移图如图5-38所示。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYair_conditionerIS
PORT(clk,tmp_high,tmp_low:
INSTD_LOGIC;
heat,cool:
OUTSTD_LOGIC);
ENDair_conditioner;
ARCHITECTUREstyleOFair_conditionerIS
TYPEstatetypeIS(just_right,too_cold,too_hot);
SIGNALstate:
statetype;
begin
Change_state:
process(reset,clock)
begin
ifreset=‘1’then
state<=just_right;
elsifrising_edge(clock)then
casestateis
whenjust_right>=
iftmp_high=‘1’then
state=too_hot;
elsiftmp_low=‘1’then
state=too_cold;
endif;
Output_process:
process(state)
begin
casestateis
whenjust_right>=
Heat<=‘0’;
cool<=‘0’;
whentoo_cold>=
Heat<=‘1’;
cool<=‘0’;
whenjust_right>=
Heat<=‘0’;
cool<=‘1’;
endcase;
Endprocess;
End;
状态机的容错设计
状态机的容错设计主要是针对未定义状态(或称剩余状态)。
状态机的每一状态即对应着一个用二进制表示的状态编码,因此,若状态机中定义的状态数不足2N(N为状态编码的二进制位数),则必然会有一些状态编码未使用,即存在剩余状态。
例如,在状态机中定义了3个状态,那么它们对应的编码是用2位二进制数表示的,分别是00、01、10,而11则未使用,这就是剩余状态了。
系统一旦意外进入此状态,状态机的行为将出错。
为了使系统进入未定义状态后能够回复正常工作,那么只需要在CASE语句中加上WHENOTHERS语句,指明在出现其他未知状态时的处理方法。
一般用以下两种处理方法:
①单独设计一个状态(如Error),用以处理状态机出错时的情况,然后whenothers>=state<=Error;
②直接回复到其他已设定的状态。
如果系统对状态机的容错性要求不是很高,那么可以不对状态机出错进行事后的处理,直接回复到某一确定状态即可(通常是回复到初始状态)。
例题用状态机设计方法设计一个汽车尾灯控制器。
该控制器共有4种状态:
状态A代表正常直行或静止;状态B代表左转弯;状态C代表右转弯;状态D代表刹车;
三个控制信号:
LH左转弯控制;RH右转弯控制;JMH刹车控制。
两个输出控制:
LD点亮左尾灯控制输出;RD点亮右尾灯控制输出。
其状态转移图如下:
entitydetectoris
port(LH,RH,JMH,clk:
inbit;
LD,RD:
outbit);
enddetector;
architecturertlofdetectoris
typestateis(A,B,C,D);
signalcurrent_state,next_state:
state;
begin
process(clk)
begin
ifclk’eventandclk=‘1’then
current_state<=next_state;
endif;
endprocess;
process(LH,RH,JMH,current_state)
begin
casecurrent_stateis
whenA=>LD<=’0’;RD<=’0’;
ifLH=‘1’ANDRH=’0’ANDJMH=’0’thennext_state<=B;
ELSifLH=‘0’ANDRH=’1’ANDJMH=’0’thennext_state<=C;
ELSifLH=‘0’ANDRH=’0’ANDJMH=’1’thennext_state<=D;
ELSEnext_state<=A;
endif;
whenB=>LD<=’1’;RD<=’0’;
ifLH=‘1’ANDRH=’0’ANDJMH=’0’thennext_state<=B;
ELSifLH=‘0’ANDRH=’0’ANDJMH=’0’thennext_state<=A;
ENDIF;
whenC=>LD<=’0’;RD<=’1’;
ifLH=‘0’ANDRH=’1’ANDJMH=’0’thennext_state<=C;
ELSifLH=‘0’ANDRH=’0’ANDJMH=’0’thennext_state<=A;
ENDIF;
WhenD=>LD<=’1’;RD<=’1’;
ifLH=‘1’ANDRH=’0’ANDJMH=’1’thennext_state<=D;
ELSifLH=‘0’ANDRH=’0’ANDJMH=’0’thennext_state<=A;
ENDIF;
endcase;
endprocess;
endrtl;
还可以用下面的语句代替上面
process(LH,RH,JMH,current_state)
begin
casecurrent_stateis
whenA=>
ifLH=‘1’ANDRH=’0’ANDJMH=’0’thennext_state<=B;
ELSifLH=‘0’ANDRH=’1’ANDJMH=’0’thennext_state<=C;
ELSifLH=‘0’ANDRH=’0’ANDJMH=’1’thennext_state<=D;
ELSEnext_state<=D;
endif;
whenB=>
ifLH=‘1’ANDRH=’0’ANDJMH=’0’thennext_state<=B;
ELSifLH=‘0’ANDRH=’0’ANDJMH=’0’thennext_state<=A;
ENDIF;
whenC=>
ifLH=‘0’ANDRH=’1’ANDJMH=’0’thennext_state<=C;
ELSifLH=‘0’ANDRH=’0’ANDJMH=’0’thennext_state<=A;
ENDIF;
WhenD=>
ifLH=‘1’ANDRH=’0’ANDJMH=’1’thennext_state<=D;
ELSifLH=‘0’ANDRH=’0’ANDJMH=’0’thennext_state<=A;
ENDIF;
endcase;
endprocess;
process(current_state)
begin
casecurrent_stateis
whenA=>LD<=’0’;RD<=’0’;
whenB=>LD<=’1’;RD<=’0’;
whenC=>LD<=’0’;RD<=’1’;
WhenD=>LD<=’1’;RD<=’1’;
endcase;
endprocess;
endrtl;
作业
5-11
5-12
5-11用状态机的设计方法设计一个自动售饮料的逻辑电路。
它的投币口每次只能投入一枚五角或一元的硬币;投入一元五角的硬币后机器自动给出一杯饮料;投入两元(两枚一元)的硬币后,在给出饮料的同时找回一枚五角的硬币。
分析:
输入:
D0:
5角D1:
1元
输出:
Y0:
找零,Y1:
饮料
三个状态:
S2:
无钱
S1:
5角
S0:
1元
状态转移图如右:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYdrink_conditionerIS
PORT(clock,reset:
INSTD_LOGIC;
d:
INSTD_LOGIC_VECTOR(1downto0);
y:
OUTSTD_LOGIC_VECTOR(1downto0));
ENDdrink_conditioner;
ARCHITECTUREoneOFdrink_conditionerIS
TYPEstatetypeIS(s0,s1,s2);
SIGNALstate:
statetype;
begin
Change_state:
process(reset,clock)
begin
ifreset=‘1’then
state<=s2;
elsifrising_edge(clock)then
casestateis
whens2>=
ifd=“01”then
state=s1;
elsifd=“10”then
state=s0;
endif;
whens1>=
ifd=“01”then
state=s0;
elsifd=“10”then
state=s2;
endif;
whens0>=
ifd=“01”then
state=s2;
elsifd=“10”then
state=s2;
endif;
endcase;
endif;
Endprocess;
Output_process:
process(state,d)
begin
casestateis
whens0>=
ifd=“01”then
y=“10”;
elsifd=“10”then
y=“11”;
else
y=“00”;
endif;
whens1>=
ifd=“10”then
y=“10”;
else
y=“00”;
endif;
whens0>=
y=“00”;
endcase;
Endprocess;
End;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- eda 第五