Mealy和moore型状态机编程


Mealy和moore型状态机的主要区别

状态机一般分为三种类型:
Moore型状态机:下一状态只由当前状态决定,即次态=f(现状,输入),输出=f(现状);
Mealy型状态机:下一状态不但与当前状态有关,还与当前输入值有关,即次态=f(现状,输入),输出=f(现状,输入);
混合型状态机。


Moore型与Mealy型两种状态机的不同点在于,Moore型状态机的输出信号是直接由状态寄存器译码得到,而Mealy型状态机则是以现时的输入信号结合即将变成次态的现态,编码成输出信号。(摘自:http://hi.baidu.com/qdhdw/blog/item/454cb98f0865c2e7f01f36a9.html

  Mooer状态机的输出只与当前的状态有关,也就是数当前的状态决定输出,而与此时的输入无关,输入只决定状态机的状态改变,不影响电路最终的输出(注意:这里所说的输出不是状态机的状态机状态的输出,而是当前状态的所代表的含义,比如:检测110 序列的状态机,当状态机跳转到STA_GOT110时,电路会有一个输出信号,假如说是find,此时find就会为高电平,其他(状态时)时find就会为低电平。find 是我们最后电路的输出,find的值置于我们的转台机当前所处的状态有关,而与输出无关)。用一本书上的话说就是:Moore状态机的每一状态指定它的输出独立于电路的输入 。

  Mealy状态机的输出不仅与当前的状态有关,还与当前的输出有关(同样,不要误认为状态机的输出只能是状态机的状态),即当前的输入和当前的状态共同决定当前的输入。

  Mooer 状态机和 Mealy 状态机的状态的是相同的,当前的状态和输入共同决定下一个状态是什么。

 

There are certain ways to implement a state machine
in C code. An obvious way is to implement the different states and actions by one
big case differentiation:

1 enum { STATE_1 , STATE_2 , STATE_3 };
2 int state = STATE_1 ;
3
4 void state_machine_run (void * priv_data ) {
5 switch ( state ) {
6 case STATE_1 :
7 action_1 ();
8 state = STATE_2 ;
9 break;
10 case STATE_2 :
11 action_2 ()
12 if ( some_condition ) state = STATE_1 ;
13 else state = STATE_3 ;
14 break;
15 case STATE_3 :
16 action_3 ();
17 state = STATE_1 ;
18 break;
19 }
20 }


For small state machines, this is an option. The disadvantage is, that with an increasing
number of states the code soon gets complex and an additional case differentiation
is executed each run. Besides, lots of indentation is wasted.
The method used in the master is to implement every state in an own function and
to store the current state function with a function pointer:

1 void (* state )(void *) = state1 ;
2
3 void state_machine_run (void * priv_data ) {
4 state ( priv_data );
5 }
6
7 void state1 (void * priv_data ) {
8 action_1 ();
9 state = state2 ;
10 }
11
12 void state2 (void * priv_data ) {
13 action_2 ();
14 if ( some_condition ) state = state1 ;
15 else state = state2 ;
16 }
17
18 void state3 (void * priv_data ) {
19 action_3 ();
20 state = state1 ;
21 }


the “Mealy” model offers a higher flexibility, which can be seen in the listing below:

1 void state7 (void * priv_data ) {
2 if ( some_condition ) {
3 action_7a ();
4 state = state1 ;
5 }
6 else {
7 action_7b ();
8 state = state8 ;
9 }
10 }


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值