米利和摩尔状态机概述
在有限状态机中,状态是局部数据和图活动的组合。“计算状态”意味着更新局部数据并产生从当前激活状态到新状态的转移。在状态机模型中,下一状态是当前状态及其输入的函数:
在此方程中:
X(n) 表示位于时间步 n 的状态。
X(n+1) 表示位于下一时间步 n+1 的状态。
u 表示输入。
状态会从一个时间步保留到下一个时间步。
米利和摩尔状态机语义
米利状态机和摩尔状态机经常被视为有限状态机建模的基本业界标准范式。您可以创建实现纯米利和摩尔语义的图,作为 Stateflow® 图语义的一部分。您可以使用 Embedded Coder®、Simulink® Coder™ 和 HDL Coder™ 软件在仿真和代码生成中使用米利和摩尔图。在 MATLAB® 中的独立 Stateflow 图中不支持米利和摩尔语义。
米利图的语义
米利状态机是有限状态机,其中转移发生在时钟沿上。米利图的输出是输入和状态的函数:
在每个时间步,米利图都会唤醒,计算自身的输入,然后转移到新的激活状态配置,也称为其下一个状态。图在转移到下一个状态时计算其输出。
为了确保输出是输入和状态的函数,米利状态机强制实施以下语义:
输出不依赖于下一个状态。
图仅在转移时计算输出,而不在状态中计算输出。
图根据系统时钟周期性唤醒。
米利状态机在转移时计算其输出。因此,米利图可以在图的默认路径执行时计算其第一个输出。如果为米利图启用图属性初始化时执行(进入)图,此计算将在 t = 0(第一个时间步)时发生。否则,计算将在 t = 1(下一个时间步)时发生。有关详细信息,请参阅初始化时执行(进入)图。
摩尔图的语义
摩尔状态机是有限状态机,其中输出在时钟沿上发生更改。摩尔图的输出仅是状态的函数:
在每个时间步,摩尔图都会唤醒,计算自身的输出,然后计算其输入以在下一个时间步重新配置。例如,图在计算其输入后,可以转移到新的激活状态配置。图在计算其输入并更新状态之前计算输出。
为了确保输出仅是当前状态的函数,摩尔状态机强制实施以下语义:
输出不依赖于输入。
输出不依赖于以前的输出。
输出不依赖于时序逻辑。
摩尔状态机在状态中计算其输出。因此,摩尔状态机只能在默认路径执行后计算输出。此时,输出会采用默认值。
创建米利和摩尔图
创建 Stateflow 图时,默认类型是混合状态机模型,称为 Classic 图。Classic 图将米利和摩尔图的语义与扩展的 Stateflow 图语义相结合。
要创建米利图,请在 MATLAB 命令提示符下输入:
sfnew -Mealy
要创建摩尔图,请在 MATLAB 命令提示符下输入:
sfnew -Moore
或者,在将 Stateflow 图模块添加到 Simulink 模型后,您可以通过设置状态机类型图属性来选择图的语义类型。有关详细信息,请参阅状态机类型。
米利和摩尔图的优势
与 Classic Stateflow 图相比,米利和摩尔图具有以下优势:
您可以对所创建的米利和摩尔图进行验证,确保它们符合相应的形式化定义和语义规则。错误消息会在编译时而非设计时出现。
对于 C/C++ 和 HDL 目标,摩尔图可以提供比 Classic 图更高效的实现。
可以使用摩尔图进行反馈环建模。在摩尔图中,输入没有直接馈通。您可以设计一个带有从输出端口到输入端口反馈的环路,而又不会引入代数环。米利图和 Classic 图具有直接馈通,因此会在存在代数环时产生错误。