Mealy FSM and Moore FSM特点、转换以及verilog实现方式

有限状态机FSM

   有限状态机-Finite State Machine,简写为FSM,是表示有限个状态及在这些状态之间的转移和动作等行为的数学模型

状态机的两种形式

Moore状态机时序逻辑输出只取决于当前状态 的这一类状态机。此时,其输出表达式为  输出信号=G(当前状态)
时钟同步的Moore状态机结构如下图所示,从图中可以看出其输出逻辑G的输出仅由当前状态决定。
Mealy状态机:时序逻辑输出不但取决于状态,还取决于输入的一类状态机。此时,其状态机输出表达式为 输出信号=G(当前状态,输出信号)
时钟同步的Mealy状态机结构如下图所示,从图中可以看出其输出逻辑G的输出由输入和当前状态一同决定。
T ips :Moore 和 Mealy 两种状态机的次态都是输入和当前状态的函数。

Moore vs Mealy 状态机

  1. Mealy机比Moore机“响应”速度快。

    Mealy机的输出与当前状态和输入有关,而Moore机输出仅与当前状态有关。Mealy机的输入立即反应在当前周期;Moore机的输入影响下一状态,通过下一状态影响输出。为此Mealy机比Moore机输出序列超前一个周期,即“响应速度”较快。Mealy机的输出在当前周期,具有较长的路径(组合逻辑);Moore机的输出具有一个周期的延时,容易利用时钟同步,Moore机具有较好的时序。因为Mealy机的输出不与时钟同步,当状态译码比较复杂时,易在输出端产生不可避免的竞争毛刺;而Moore机的输出与时钟保持同步,则在一定的程度上可以消除抖动,因此经常使用Moore机设计来提高系统的稳定性。

  2. Mealy机状态少,Moore机结构简单。

    由于Moore机的输出只有当前的状态有关,一个状态对应一个输出,Moore机具有更多的状态。Mealy和Moore机之间可以相互转化,对于每个Mealy机,都有一个等价的Moore机,Moore机状态的上限为所对应的Mealy机状态的数量和输出数量的乘积。

  3. 状态机的状态通过触发器的数量来反应,Mealy机具有较少的状态,为此具有较少的触发器。


Mealy和Moore状态机的互换

对于给定的时序逻辑功能,可以用Mealy机实现,也可以用Moore机实现。根据Moore机比Mealy机输出落后一个周期的特性,可以实现两种状态机之间的转换。把Moore机转换为Mealy机的办法为,把次态的输出修改为对应现态的输出,同时合并一些具有等价性能的状态。把Mealy机转换为Moore机的办法是,把当前态的输出修改为对应次态的输出,同时添加一些状态。如下图所示,为把Mealy机状态图转化为Moore机状态图。


如上图所示,把Mealy型机转换为Moore型机,只要把现时输出改变为下一时刻输出。对于状态A,有4个箭头指向它,表示在当前状态下有4个状态可以转换为下一状态的A;同时当前输出均为0,可以把0移入状态A内部,表示在Moore机中状态A的输出为0。同理,可以把0分别移位B/C状态。但对于状态D,有两个箭头指向且具有不同的输出值,需要把状态D分解成两个状态D1和D2(每个状态对应一个输出,当输出不同需要利用不同的状态表示,这即是Moore机具有更多状态的原因),得到完整的Moore机状态模型。

同理,若把上图的Moore机转换为Mealy机,只要把Moore机中下一状态的输出改变成Mealy机中当前状态的输出,由于D1/D2两状态处于A/C两状态之间,且相当于A/C节点之间的一个等效节点,可以把D1/D2两状态合并为一个状态。

状态机设计原则

Mealy机和Moore机实现的电路是同步时序逻辑电路的两种不同形式,它们之间不存在功能上的差异,并可以相互转换。Moore型电路有稳定的输出序列,而Mealy型电路的输出序列早Moore型电路一个时钟周期产生。在时序设计时,根据实际需要,结合两种电路的特性选择。

对于时序电路中常见的计数器,因计数器状态已经固定不变,无论采用Mealy型还是Moore型电路,复杂度一样。

在时序电路设计中Mealy型和Moore型电路的选择原则是: 当要求输出对输入快速响应及希望电路尽量简单时,选择Mealy型电路。当要求时序输出稳定,能接受输出序列晚一个周期,及选择Moore型电路不增加电路复杂性时,适宜选择Moore型电路。

3段式Moore状态机

A-普通型
// 第一个always块,描述当前状态的状态寄存器,non-blocking
always @ ( posedge clk or negedge rst_n)    begin
    if (!rst_n)
        curr_state    <= idle;
    else
        curr_state    <= next_state;
end
// 第二个always块,描述状态转移,即下一状态的状态寄存器,blocking
always @ (*)    begin
    next_state    = idle;    // 初始化
    case (curr_state)
        idle:    begin
            if (...)
                next_state    = sx;
            else
                next_state    = sy;
        end
        ...
        default:
            next_state    = sz;
    endcase
end
// 第三个always块,组合逻辑描述输出,blocking
always @ (*)    begin
    if (!rst_n)    begin
        o1    = 1'b0;
    end
    else    begin
        case (curr_state)
            s1:    begin
                o1 = 1'b1;
            end
            ...
            default:    begin
                o1    = 1'b0;
            end
        endcase
    end
end
// 第三个always块,时序逻辑描述输出,non-blocking
// 此时为时序逻辑
always @ ( posedge clk or negedge rst_n)    begin
    if (!rst_n)    begin
        o1    <= 1'b0;
    end
    else    begin
        case (curr_state) // 注意此处为当前状态
            s1:    begin
                o1 <= 1'b1;
            end
            ...
            default:    begin
                o1 <= 1'b0;
            end
        endcase
    end
end
/ 第三个always块,时序逻辑描述输出,non-blocking
// 此时为时序逻辑
always @ ( posedge clk or negedge rst_n)    begin
    if (!rst_n)    begin
        o1    <= 1'b0;
    end
    else    begin
        case (next_state) // 注意此处为前一状态
            s1:    begin
                o1 <= 1'b1;
            end
            ...
            default:    begin
                o1 <= 1'b0;
            end
        endcase
    end
end
Mealy FSM Verilog实现

对于三段式状态机,只需在第三段,添加上输出与输入的关系即可

你可能感兴趣的:(数字IC设计)