什么是状态机:
状态机是由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心;
有限状态机(Finite State Machine)分为以下两类,分别是:摩尔(Moore)状态机和米利(Mealy)状态机;
时序电路的输出总取决于触发器的当前状态,但却不一定直接依赖于原始输入,因此图中的细虚线表示的连线可能存在,也可能不存在;当不存在时,也即输出仅由电路状态决定的时序电路称为Moore型,而输出由电路状态和原始输入同时决定的成为Mealy型(这样的命名是为了纪念20世纪50年代上述电路行为的提出者Edward Moore和George Mealy);
再多说几点:
无论 Moore状态机的输入信号何时到达,他的输出信号知道下一个时钟周期的上升沿都不会改变,这对于避免设置时间违例非常重要;而当Mealy状态机的输入信号在一个时钟周期的中间的某个时刻发生了改变,它的一个或多个输出和下一个状态信号可能会在一段时间后发生变化。 而这个一段时间之后可能会出现在下一个时钟上升沿的建立时间之后。 如果发生这种情况,保存 FSM 下一个状态的寄存器可能会收到不正确的输入。这对于 FSM是 一种非常痛苦且难以找到的错误QWQ。
尽管有以上的分析,但是Mealy也有其自身的优势;比如说,Moore状态机可能会比Mealy状态机需要更多的状态来指定他的功能和作用,这是因为Moore状态机的输出信号只取决于当前的状态,而Mealy状态机则是还需要依赖输入信号,因此Mealy状态机可以为单个状态指定不同的输出行为;
Moore状态机verilog写法实例:
module simple(
input clk,
input rst_n,
input w,
output z
);
localparam A = 2'b00;
localparam B = 2'b01;
localparam C = 2'b10;
reg [1:0] state;
assign z = (y == C);
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
state <= A;
end
else
case (state)
A:
begin
if (w) begin
state <= B;
end
else begin
state <= A;
end
end
B:
begin
if (w) begin
state <= C;
end
else begin
state <= A;
end
end
C:
begin
if (w) begin
state <= C;
end
else begin
state <= A;
end
end
default:
begin
state <= state;
end
endcase
end
endmodule
Mealy状态机写法实例:
module mealy(
input clk,
input rst_n,
input w,
output y,
output Y,
output reg z
);
localparam A = 1'b0;
localparam B = 1'b1;
always @(w,y) begin
case (y)
A:
begin
if (w) begin
z = 0;
y = B;
end
else begin
z = 0;
Y = A;
end
end
B:
begin
if (w) begin
z = 1;
y = B;
end
else begin
z = 0;
Y = A;
end
end
endcase
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
y <= A;
end
else begin
y <= Y;
end
end
endmodule
这篇笔记参考网上众多资料实验并整理而成,如果涉及侵权烦请请告知,我将第一时间处理。