中文名 | 状态机 | 外文名 | Finite State Machine |
---|---|---|---|
缩 写 | FSM | 别 名 | 状态转移图 |
类 别 | Moore状态机、Mealy状态机 | 要 素 | 现态、条件、动作、次态 |
关于状态机的一个极度确切的描述是:它是一个有向图形,由一组节点和一组相应的转移函数组成。状态机通过响应一系列事件而“运行”。每个事件都在属于“当前” 节点的转移函数的控制范围内,其中函数的范围是节点的一个子集。函数返回“下一个”(也许是同一个)节点。这些节点中至少有一个必须是终态。当到达终态, 状态机停止。
包含一组状态集(states)、一个起始状态(start state)、一组输入符号集(alphabet)、一个映射输入符号和当前状态到下一状态的转换函数(transition function)的计算模型。当输入符号串,模型随即进入起始状态。它要改变到新的状态,依赖于转换函数。在有限状态机中,会有有许多变量,例如,状态 机有很多与动作(actions)转换(Mealy机)或状态(摩尔机)关联的动作,多重起始状态,基于没有输入符号的转换,或者指定符号和状态(非定有 限状态机)的多个转换,指派给接收状态(识别者)的一个或多个状态,等等。
传统应用程序的控制流程基本是顺序的:遵循事先设定的逻辑,从头到尾地执行。很少有事件能改变标准执行流程;而且这些事件主要涉及异常情况。“命令行实用程序”是这种传统应用程序的典型例子。
另一类应用程序由外部发生的事件来驱动——换言之,事件在应用程序之外生成,无法由应用程序或程序员来控制。具体需要执行的代码取决于接收到的事件,或者它相对于其他事件的抵达时间。所以,控制流程既不能是顺序的,也不能是事先设定好的,因为它要依赖于外部事件。事件驱动的GUI应用程序是这种应用程序的典 型例子,它们由命令和选择(也就是用户造成的事件)来驱动。
Web应用程序由提交的表单和用户请求的网页来驱动,它们也可划归到上述类别。但是,GUI应用程序对于接收到的事件仍有一定程度的控制,因为这些事件要依赖于向用户显示的窗口和控件,而窗口和控件是由程序员控制的。Web应用 程序则不然,因为一旦用户采取不在预料之中的操作(比如使用浏览器的历史记录、手工输入链接以及模拟一次表单提交等等),就很容易打乱设计好的应用程序逻辑。
显然,必须采取不同的技术来处理这些情况。它能处理任何顺序的事件,并能提供有意义的响应——即使这些事件发生的顺序和预计的不同。有限状态机正是为了满足这方面的要求而设计的。
有限状态机是一种概念性机器,它能采取某种操作来响应一个外部事件。具体采取的操作不仅能取决于接收到的事件,还能取决于各个事件的相对发生顺序。之所以能 做到这一点,是因为机器能跟踪一个内部状态,它会在收到事件后进行更新。为一个事件而响应的行动不仅取决于事件本身,还取决于机器的内部状态。另外,采取 的行动还会决定并更新机器的状态。这样一来,任何逻辑都可建模成一系列事件/状态组合。
状态机可归纳为4个要素,即现态、条件、动作、次态。这样的归纳,主要是出于对状态机的内在因果关系的考虑。“现态”和“条件”是因,“动作”和“次态”是果。详解如下:
①现态:是指当前所处的状态。
②条件:又称为“事件”,当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。
③动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。
④次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。
其Moore状态图如图1所示。
S0/0S1/1S3/0S2/100110011
其中S0/0所代表的意思为现在是状态S0且输出为0,状态图最主要是将每个状态都给予一个编号,详细描述如下:
1) 在某状态时,列出所有的输出条件。
2) 在某状态时,当输入信号是什么则会跳至哪一个状态。
3) 在某状态时,当输入信号是什么则会维持原状态不变。
可以将图1的Moore状态机写成状态表如表1.
表1 Moore状态表
现态 |
次态 |
输出 |
||
输入 |
X=0 |
X=1 |
X=0 |
X=1 |
S0 |
S0 |
S1 |
0 |
0 |
S1 |
S1 |
S2 |
1 |
1 |
S2 |
S3 |
S0 |
0 |
0 |
S3 |
S0 |
S3 |
0 |
0 |
状态表主要描述它与状态图的关系,在设计状态机电路时,需要先定义状态机的变量,定义状态机的变量时使用枚举类型来定义,如下范例所示:
Type State is (S0,S1,S2,S3)
接下来,状态会被加以编码。其状态编码方式如下:
(1) 时序编码(Sequential)
将每个状态以二进制来做编码。
(2)格雷码(Gray)
也是将四个State以二进制来编码,不过不同的是每次编码只会差一个位,其主要缺点是状态改变必须依序改变,若状态不是依序,则Gray编码不适用。
(3) 独热码(One hot)
独热码状态编码的特色为每一个状态均有自己的触发器,所以若有N个状态就也存在有N个触发器,在任一时刻只会有一组状态编码,缺点是会产生较大的电路,但是相对的使用独热码状态编码对帧错相当有帮助。
三种格式之状态编码如表2所示。
状态 |
时序编码 |
Gray编码 |
One hot编码 |
S0 |
00 |
00 |
0001 |
S1 |
01 |
01 |
0010 |
S2 |
10 |
11 |
0100 |
S3 |
11 |
10 |
1000 |
从状态编码表可以看出时序编码和Gray编码均是用二个位来做编码,而以独热码作为编码方式则编码位增加至四个位,所以电路比其他两种编码方式都大一些。
所以可以使用属性来定义编码方式,若要编码成独热码编码,则可加上:
Type State is (S0,S1,S2,S3);
Attribute encoding of state;
Type is “0001 0010 0100 1000”;
在设计状态机时,通常使用进程语句来描述状态机,其中进程语句又可以分为三种方式:
n 一个进程
利用一个进程来描述状态的转换及输出信号的定义。
n 两个进程
一个为时序电路主要负责状态变量的更新,此进程为同步电路,而另一个进程语句主要是描述下次态变量和输出的更新。
n 三个进程
第一个进程主要负责状态变量的更新,第二个进程语句负责描述次态变量,而最后一个则是负责输出信号的更新。
有了以上的初步观念,可以设计图1四个状态的Moore状态机。
首先根据之前的状态表编写VHDL程序如下所示:
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.numeric_std.all;
Entity moore_fsm is
Port(
clk : in std_logic;
rstn : in std_logic;
x : in std_logic;
output : out std_logic
);
End moore_fsm;
Architecture rtl of moore_fsm is
Type state is (s0,s1,s2,s3); ---状态定义
Signal current_state : state; ---现态
Signal next_state : state; ---次态
Begin
Statefsm: process(rstn, x, current_state)
Begin
If rstn = ‘0’ then --异步reset
next_state <= s0;
output <= ‘0’;
else
case current_state is
when s0 =>
if x =’0’ then
next_state <= s0;
else
next_state <= s1;
end if;
output <= ‘0’;
when s1 =>
if x =’0’ then
next_state <= s1;
else
next_state <= s2;
end if;
output <= ‘1’;
when s2 =>
if x =’0’ then
next_state <= s3;
else
next_state <= s0;
end if;
output <= ‘0’;
when s3 =>
if x =’0’ then
next_state <= s0;
else
next_state <= s3;
end if;
output <= ‘0’;
end case;
end if;
end process statefsm;
stat: process(clk) --current_stateànext_state
begin
if rising_edge (clk) then
current_state <=next_state;
end if;
end process stat;
end rtl;
1) 编码方式预设为时序编码
2) 使用两个进程语句来设计状态机
其综合电路如图2 所示。
其状态图如图3 所示。
Moore FSM 模拟波形如图4 所示。
模拟结果说明:
(1) 由于reset 为异步reset ,所以当reset在150ns~200ns为0时,则状态图会从s1回到s0.
(2) 在50 ns时输入x为0且现态为1,在70 ns 时clk上升沿触发且x为1,则current_state会变成next_state s2;
接下来我们要介绍Mealy状态机,它和输入、输出、状态皆有关。它的状态图、状态表与Moore状态机都有所不同,输出会随输入变化而变化。如图5 所示。
0/0 |
图5:
S0S1S3S20/11/10/10/01/11/0 1/0
若现态为s0输入为0时,则次态为s0且输出为0;若现态为s0输入为1时,则次态为s1且输出为1。
根据这个规则,列出Mealy状态机的状态表如表3。
现态 |
次态 |
输出 |
||
输入 |
X=0 |
X=1 |
X=0 |
X=1 |
S0 |
S0 |
S1 |
0 |
1 |
S1 |
S2 |
S1 |
1 |
0 |
S2 |
S3 |
S0 |
0 |
1 |
S3 |
S0 |
S3 |
1 |
0 |
其Mealy状态机的VHDL如下所示:
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.numeric_std.all;
Entity melay_fsm is
Port(
clk: : in std_logic;
rstn : in std_logic;
x : in std_logic;
output : out std_logic
);
End moore_fsm;
Architecture rtl of moore_fsm is
Type state is (s0,s1,s2,s3); ---状态定义
Signal current_state : state; ---现态
Signal next_state : state; ---次态
Begin
Statefsm: process(rstn, x, current_state)
Begin
If rstn = ‘0’ then --异步reset
next_state <= s0;
output <= ‘0’;
else
case current_state is
when s0 =>
if x =’0’ then
next_state <= s0;
else
next_state <= s1;
end if;
if x= ‘0’ then
output <= ‘0’;
else
output <= ‘1’;
end if;
when s1 =>
if x =’0’ then
next_state <= s2;
else
next_state <= s1;
end if;
if x= ‘0’ then
output <= ‘1’;
else
output <= ‘0’;
end if;
when s2 =>
if x =’0’ then
next_state <= s3;
else
next_state <= s0;
end if;
if x= ‘0’ then
output <= ‘0’;
else
output <= ‘1’;
end if;
when s3 =>
if x =’0’ then
next_state <= s0;
else
next_state <= s3;
end if;
if x= ‘0’ then
output <= ‘1’;
else
output <= ‘0’;
end if;
end case;
end if;
end process statefsm;
stat: process(clk) --current_stateànext_state
begin
if prsing_edge (clk) then
current_state <=next_state;
end if;
end process stat;
end rtl;
Mealy状态机综合电路如图6 所示。
状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作,完成特定操作的控制中心。状态机分为摩尔(Moore)型状态机和米莉(Mealy)型状态机。
状态机就是状态转移图。举个最简单的例子,人有三个状态:健康,感冒,康复中。触发的条件有淋雨(t1),吃药(t2),打针(t3),休息(t4)。所以状态机就是健康-(t4)->健康;健康-(t1)->感冒;感冒-(t3)->健康;感冒-(t2)->康复中;康复中-(t4)->健康,等等。就是这样状态在不同的条件下跳转到自己或不同状态的图。
用三段式状态机编写一个5层电梯的verilog程序,做好有仿真结果,求高手?
你是科大的研究生吗?
你好。 打印机脱机...
最多也是对墙面、地面、天棚仅仅是打底找平,就没有做任何的装饰了。
思想广泛应用于硬件控制电路设计,也是软件上常用的一种处理方法(软 件上称为FMM--有限消息机)。它把复杂的控制逻辑分解成有限个稳定状态,在每个状态上判断事件,变连续处理为离散数字处理,符合计算机的工作特点。同时,因为有限状态机具有有限个状态,所以可以在实际的工程上实现。但这并不意味着其只能进行有限次的处理,相反,有限状态机是闭环系统,有限无穷,可以用有限的状态,处理无穷的事务。
有限状态机的工作原理如图1所示,发生事件(event)后,根据当前状态(cur_state) ,决定执行的动作(action),并设置下一个状态号(nxt_state)。
表1 图2状态机实例的二维表格表示(动作/下一状态)
图2为一个状态机实例的状态转移图,它的含义是:
在s0状态,如果发生e0事件,那么就执行a0动作,并保持状态不变;
如果发生e1事件,那么就执行a1动作,并将状态转移到s1态;
如果发生e2事件,那么就执行a2动作,并将状态转移到s2态;
在s1状态,如果发生e2事件,那么就执行a2动作,并将状态转移到s2态;
在s2状态,如果发生e0事件,那么就执行a0动作,并将状态转移到s0态;
有限状态机不仅能够用状态转移图表示,还可以用二维的表格代表。一般将当前状 态号写在横行上,将事件写在纵列上,如表1所示。其中“--”表示空(不执行动作,也 不进行状态转移),“an/sn”表示执行动作an,同时将下一状态设置为sn。表1和图2表示 的含义是完全相同的。
观察表1可知,状态机可以用两种方法实现:竖着写(在状态中判断事件)和横着写( 在事件中判断状态)。这两种实现在本质上是完全等效的,但在实际操作中,效果却截然 不同。
cur_state = nxt_state;
switch(cur_state){ //在当前状态中判断事件
case s0: //在s0状态
if(e0_event){ //如果发生e0事件,那么就执行a0动作,
并保持状态不变;
执行a0动作;
//nxt_state = s0; //因为状态号是自身,所以可以删除此句
,以提高运行速度。
}
else if(e1_event){ //如果发生e1事件,那么就执行a1动作,
并将状态转移到s1态;
执行a1动作;
nxt_state = s1;
}
else if(e2_event){ //如果发生e2事件,那么就执行a2动作,
并将状态转移到s2态;
执行a2动作;
nxt_state = s2;
}
break;
case s1: //在s1状态
if(e2_event){ //如果发生e2事件,那么就执行a2动作,
并将状态转移到s2态;
执行a2动作;
nxt_state = s2;
}
break;
case s2: //在s2状态
if(e0_event){ //如果发生e0事件,那么就执行a0动作,
并将状态转移到s0态;
执行a0动作;
nxt_state = s0;
}
}
//e0事件发生时,执行的函数
void e0_event_function(int * nxt_state)
{
int cur_state;
cur_state = *nxt_state;
switch(cur_state){
case s0: //观察表1,在e0事件发生时,s1处为空
case s2:
执行a0动作;
*nxt_state = s0;
}
}
//e1事件发生时,执行的函数
void e1_event_function(int * nxt_state)
{
int cur_state;
cur_state = *nxt_state;
switch(cur_state){
case s0: //观察表1,在e1事件发生时,s1和s2处为
空
执行a1动作;
*nxt_state = s1;
}
}
//e2事件发生时,执行的函数
void e2_event_function(int * nxt_state)
{
int cur_state;
cur_state = *nxt_state;
switch(cur_state){
case s0: //观察表1,在e2事件发生时,s2处为空
case s1:
执行a2动作;
*nxt_state = s2;
}
}
光纤通道是一种具有高速数据传输性能的接口标准,在分析了光纤通道端口状态机的工作原理的基础上,针对光纤通道数据传输中存在的问题,提出了一种基于FPGA的端口状态机实现方案,解决了光纤通道控制器在运行过程中因遇到超时、失去同步、信号丢失、缓冲区溢出等错误而导致数据传输失败的问题,增强了链路的自我恢复能力。试验结果表明,在遇到上述错误时,端口状态机能自动执行相应的原语序列协议对链路进行恢复。
随着电子科技的飞速发展,现代电子产品更新换代的步伐也越来越快,现代电子产品的性能不断提高,功能越来越完善,成本越来越低,这些都归功于电子设计EDA技术的发展。当前以VHDL语言为工具、逻辑器件为载体的系统设计越来越广泛。在设计中,状态机是最典型、应用最广泛的电路模块,其在运行速度的高效、执行时间的确定性和高可靠性方面都显现出强大的优势。对于一个复杂的设计系统,运用层次化设计方法,使设计课题进一步细化,分块设计,条理清晰。使用VHDL语言进行8路彩灯电路设计,思路简单,功能明了,灵活性强。
硬度
30mm厚以下(含 30mm)钢板室温硬度 470-530 HBW,30mm以上 450-530 HBW。
横向试样室温拉伸试验(20MM(0.8英寸)厚钢板典型值):
抗拉强度:1650 N/mm2 (240 ksi)
屈服点:1300 N/mm2 (190 ksi)
延伸率:8%(1o=5.65√So)
纵向试样V缺口冲击试验(20MM(0.8英寸)厚钢板典型值):
韧性:-20°C(-4°F),25J(18 ft⋅lbf)
横向试样弯曲试验(30MM(1.2英寸)厚钢板典型值):
可成型性:弯芯半径>=3.0x试样厚度 折弯角 180°
试验
表面布氏硬度每炉测试一次(40t)。
钢板标识
标识至少包括:·工厂商标·钢种(QUARD500) ·炉号·板号
钢板上印有QUARD500字样。
加工性能
是否可以使用本钢板加工出值得信赖的产品从根本上取决于整个加工工艺及加工中所使用的技术。加工时应确保计算、设计和加工方法均符合材料本身的要求,符合最新加工工艺的要求,符合产品将来实际使用的要求。顾客应自己选择适用的材料,在考虑高强度和淬硬性的同时参照 Stahl-Eisen-Werkstoffblatt 088或 EN 1011的推荐。
冷成型
QUARD500尽管硬度很高,但仍可进行冷成型。但要注意,随着屈服强度的提高,同样厚度钢板所需的变形力及回弹力也要提高。建议打磨冷弯区域火焰切割边或剪切边,以防开裂。
进行冷成型时请考虑以下建议值( t为板厚):
热成型:
本钢种通过从奥氏体化温度加速冷却获得硬度。在热成型后,只有重新淬火才可能恢复硬度。可以预见,重新淬火获得的硬度会与出厂时测量的硬度不同,这是因为生产钢板时的淬火设备和加工厂所拥有的淬火设备在能力上有区别。钢板加热至 200°C(390°F)左右硬度不会显著下降(时间较短也可至 250°C)。
火焰切割和焊接:
火焰切割应遵循以下最低预热温度:板厚 30mm以下,50°C(125°F);板厚 30~70mm,100°C(215°F); 70mm以上,180°C(360°F)。
手工电弧焊应选用低残留潮气的碱性涂敷焊条(必要时,应按焊条生产商的要求进行干燥处理)。此外,以下几点建议也应予以考虑:
在结构刚性较高时为防止焊缝开裂,一般建议对 8 mm(0.6英寸)以上厚钢板采取 150~200°C(305~395°F)的预热温度。必须避免 200°C(390°F)以上的预热,因为它将使硬度降低。
焊缝填料应在结构承受载荷和焊缝承受磨损允许范围内尽可能选用软性的。
机械加工QUARD500加工可使用高速钢钻头,尤其是钴合金高速钢钻头。如果采用适当的进钻速度和钻速,则钻头可以获得满意的使用寿命。2100433B
以下是所有 CANopen 设备都要具备的功能:
通讯单元 处理和网络上其他模组通讯所需要的通讯协定。 设备的启动及重置由状态机(state machine)控制。状态机需包括以下的几个状态:Initialization, Pre-operational, Operational 及 Stopped。当接收到网络管理 (NMT) 通讯对象,状态机会转换到对应的状态。 对象字典 (Object Dictionary) 是一个有 16 位元索引 (Index) 的变量阵列。每个变量可以(但非必须)有 8 位元的子索引 (Subindex)。变量可用来调整设备的组态,也可以对应设备量测的资料或设备的输出。 当状态机设定为 operational 之后,设备的应用 (application) 部份就会实现设备预期的机能。此部份可以由对象字典中的变量调整其设定,而资料由通讯层传送或接收。
包括各类常用的绘图工具,提供设计人员使用。
BPMN图
组织结构图
ITIL图
ArchiMate图
价值流映射
EPC 图
因果循环图
系统树图
决策树
系图
亲属关系图
用例图
类图
活动图
组件图
部署图
包图
状态机图
序列图
一般流程图
泳道图
影响图
SDL图
审批图
Accounting流图
iOS Wireframe
Material Wireflow
Android Wireframe
Bootstrap Wireframe
模型 Wireframe
Atlassian Wireframe
用户流程(移动)
用户流程(网站)
网站地图
一般
家庭办公室
工作办公室
卧室
浴室
厨房
餐厅
卫生间
机架图
网络图
AWS
Azure
谷歌云
IBM云
Oracle云
阿里云
腾讯云
一般
清单
流程
循环
阶层图
关联
矩阵
金字塔
其他
基本电气图
逻辑图
电路原理图
接线图
工艺流程图
P&ID