tuniumobile 2020-06-26
一、状态机的定义
状态机就是能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定动作的控制中心。状态机简写为 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
整体流程字符流 -> 状态机 -> 词token -> 栈 -> dom构建 DOM 的过程是:从父到子,从先到后,一个一个节点构造,并且挂载到DOM树上。<p class="a">text text