主要内容

使用米利语义进行自动售货机建模

此示例说明如何使用米利语义进行自动售货机建模。米利图仅在转移时计算输出,而不在状态中计算输出。有关详细信息,请参阅Design Considerations for Mealy Charts

米利自动售货机的逻辑

在此示例中,自动售货机需要投入 15 美分才能释放一罐苏打水。购买者可以通过一次一枚的方式投入一枚 5 美分镍币或一枚 10 美分硬币来购买苏打水。该图的行为类似于一个米利状态机,因为其输出 soda 取决于投入的硬币和当前状态:

got_0 - 尚未收到硬币或当前无剩余硬币。

  • 如果收到一枚 5 美分镍币 (coin == 1),输出 soda 保持为 0,但状态 got_nickel 被激活。

  • 如果收到一枚 10 美分硬币 (coin == 2),输出 soda 保持为 0,但状态 got_dime 被激活。

  • 如果投入的硬币既不是 10 美分也不是 5 美分,则状态 got_0 保持激活状态,且不会释放苏打水(输出 soda = 0)。

got_nickel - 收到一枚 5 美分镍币。

  • 如果收到另一枚 5 美分镍币 (coin == 1),状态 got_dime 被激活,但不会释放苏打水(soda 保持为 0)。

  • 如果收到一枚 10 美分硬币 (coin == 2),则释放苏打水 (soda = 1),并计入硬币,激活状态变为 got_0,因为没有剩余硬币。

  • 如果投入的硬币不是 10 美分或 5 美分,则状态 got_nickel 保持激活状态,并且不会释放苏打水(输出 soda = 0)。

got_dime - 收到一枚 10 美分硬币。

  • 如果收到一枚 5 美分镍币 (coin == 1),则释放苏打水 (soda = 1),并计入硬币,激活状态变为 got_0,因为没有剩余硬币。

  • 如果收到一枚 10 美分硬币 (coin == 2),则释放苏打水 (soda = 1),计入 15 美分,激活状态变为 got_nickel,因为剩余一枚 5 美分镍币(找零)。

  • 如果投入的硬币不是 10 美分或 5 美分,则状态 got_dime 保持激活状态,并且不会释放苏打水(输出 soda = 0)。

米利自动售货机中的设计规则

此米利自动售货机示例展示了以下米利设计规则:

  • 图在条件动作中计算输出。

  • 没有状态动作或转移动作。

  • 输入 coin 的值确定输出 soda 的值。

另请参阅

主题