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