FSM(Finite state machine)即“有限状态机”有两种实现方式。
- 摩尔型:输出只和当前的状态有关。
- 米勒型:输出不仅和当前状态相关,还和输入相关。
我们通过两种不同的方式来实现一个如下图所示的上升沿检测电路来说明这两种FSM。
这个电路的逻辑是当输入从0变为1时,输出为1,否则保持为0.
1. 摩尔型
首先,该逻辑电路的状态转化图如下:
该状态机有如下特点:
- 该状态机有三个状态:zero, change, one.
- 输出只和状态相关,在change状态时,输出为1.
其对应的门级电路如下:
我们可以看到,这里用两个Flip-Flop来表示当前的状态(3个状态),而且输出只和当前的状态相连。左边的组合逻辑用来控制状态的切换,右边的组合逻辑用来根据状态控制输出。
verilog代码如下:
module EDGE_MOORE(
input clk,
input rst,
input in,
output reg out
)
parameter ZERO = 2'b00;
parameter CHANGE = 2'b01;
parameter ONE = 2'b10;
reg[1:0] current_state, next_state;
always@(posedge clk)
begin
if(rst == 0)
current_state <= ZERO;
else
current_state <= next_state;
end
always@(*)
begin
case (current_state)
ZERO: begin
out = 1'b0;
if(in)
next_state = CHANGE;
else
next_state = ZERO;
end
CHANGE: begin
out = 1'b1;
if(in)
next_state = ONE;
else
next_state = ZERO;
end
ONE: begin
out = 1'b0;
if(in)
next_state = ONE;
else
next_state = ZERO;
end
default: begin
out = 1'bx;
next_state = default;
end
endcase
end
endmodule
2. 米勒型
状态转换图如下:
该状态机有如下特点:
- 该状态机只有两个状态:zero, one.
- 输出和状态与输入相关,当当前状态是zero时,如果输入为1,则输出为1.
其对应的门级电路如下:
这个电路相对摩尔型就简单很多,只需要一个Flip-Flop来表示两个状态,同时输入和输出通过一个组合逻辑连接。
verilog代码如下:
module FSM_MEALY(
input clk,
input rst,
input in,
output reg out
)
parameter ZERO= 1'b0;
parameter ONE = 1'b1;
reg current_state, next_state;
always@(posedge clk)
begin
if(rst==0)
current_state <= ZERO;
else
current_state <= next_state;
end
always@(*)
begin
case(current_state)
ZERO: begin
if(in)begin
out = 1'b1;
next_state = ONE;
end else begin
out = 1'b0;
next_state = ZERO;
end
end
ONE: begin
if(in)begin
out = 1'b0;
next_state = ONE;
end else begin
out = 1'b0;
next_state = ZERO;
end
end
default:begin
next_state = default;
out = 1'bx;
end
endcase
end
endmodule
3. 对比
两种不同FSM实现方式的时序图如下:
- 由于摩尔型FSM的输出只和当前状态相关,而当前状态是由FF表示的,进而只能在时钟上升沿发生变化(同步)。
- 而米勒型FSM的输出与当前状态和输入都有关系,输入的变化会立刻反应到输出(异步)。当输入信号上升沿发生时,输出也为1,当下一个时钟的上升沿到达时,当前状态变为ONE,此时由于输入为1,所以输出变为0.