Moore型状态机和Mealy型状态机

一、状态机的定义

  状态机就是能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定动作的控制中心。状态机简写为 FSM (Finite  State  Machine),分为两类:

  1:输出只和当前状态有关而与输入无关,则称为摩尔(Moore)状态机;

  2:输出不仅和当前状态有关而且和输入有关,则称为米利(Mealy)状态机;

二、两种状态机的区别

  1:在波形上区别:以一个序列检测器为例,检测到输入信号11时输出z为1,其他时候为0。用摩尔型FSM实现需要用到三个状态(A,B,C)。而用米利型FSM实现则需要两个状态(A,B)。摩尔型FSM输出函数的输入只由状态变量决定,要想输出z=1,必须C状态形成,即寄存器中的两个1都打进去后才可以。输出z=1会在下一个有效沿到来的时候被赋值。而米利型FSM输出函数是由输入和状态变量共同决定的。状态在B的时候如果输入为1,则直接以组合电路输出z=1,不需要等到下个有效沿到来。从而也就不需要第三个状态C。

  2:摩尔状态机更安全:输出在时钟边沿变化(总是在一个周期后)。在Mealy机器中,输入更改可能会在逻辑完成后立即导致输出更改, 当两台机器互连时出现大问题 ,如果不小心,可能会发生异步反馈

    3:Mealy状态机对输入的<span>反应更快</span>:<span>在相同的周期内反应 - 不需要等待时钟。</span><span>在Moore机器中,可能需要更多逻辑来将状态解码为输出 - 在时钟边沿之后更多的门延迟。</span>并非所有时序电路都可以使Mealy模型实现。 一些时序电路只能作为摩尔机器实现。

  三、经典三段式状态机模板

reg        [:]            current_state           ;
reg        [:]            next_state               ;    

wire        [:0]            IDLE                    ;
wire        [:0]            S0                ;
wire        [:0]            S1                ;
wire        [:0]            S2                ;

//=============================================================================10 //****************************     State Machine    *******************************
//=============================================================================\
    
always @(posedge sclk or negedge s_rst_n) begin
    if(!s_rst_n)
        current_state <= IDLE;
    else
        current_state <= next_state;
end

always @(*) begin
    next_state = IDLE;
    case(current_state)
        IDLE:begin
            if(idle2s0 == 1‘b1)
                next_state = S0;
            else
                next_state = current_state;
        end
        
        S0:begin
            if(s02s1 == 1‘b1)
                next_state = S1;
            else
                next_state =current_state;
        end
        
        S1:begin
            if(s12s2 == 1‘b1)
                next_state = S2;
            else
                next_state = current_state;
        end
        
        S2:begin
            if(s22idle == 1‘b1)
                next_state = IDLE;
            else
                next_state = current_state;
        end
        
        default:begin
            next_state = IDLE;
        end
    endcase
end

assign        idle2s0        =    current_state == IDLE    && 
assign        s02s1        =    current_state == S0            && 
assign        s12s2        =    current_state == S1            && 
assign        s22idle        =    current_state == S2        && 

always @(posedge sclk or negedge s_rst_n) begin
    if(!s_rst_n) begin

    end
    else begin
        case(next_state)
            
    end
end

四、摩尔型状态机

举例说明摩尔型状态机,非重叠检测 1001 

相关推荐