题目为使用Mealy FSM 实现一个序列检测器,要求可以检测重叠序列。
比较简单的一题,本来不需要状态机也能实现序列检测器,不太清楚出题的目的是啥,可能只是为了让人熟悉Mealy型状态机吧。
还是说一下需要重点注意的:
- 区分Mealy FSM 和Moore FSM
-
输出只和当前状态有关而与输入无关,则称为摩尔(Moore)状态机;
-
输出不仅和当前状态有关而且和输入有关,则称为米利(Mealy)状态机;
-
-
两种状态机的区别
-
在波形上区别:以一个序列检测器为例,检测到输入信号11时输出z为1,其他时候为0。用摩尔型FSM实现需要用到三个状态(A,B,C)。而用米利型FSM实现则需要两个状态(A,B)。摩尔型FSM输出函数的输入只由状态变量决定,要想输出z=1,必须C状态形成,即寄存器中的两个1都打进去后才可以。输出z=1会在
下一个有效沿到来
的时候被赋值。而米利型FSM输出函数是由输入和状态变量共同决定的。状态在B的时候如果输入为1,则直接以组合电路输出z=1
,不需要等到下个有效沿到来。从而也就不需要第三个状态C。 -
摩尔状态机更安全:输出在时钟边沿变化(总是在一个周期后)。在Mealy机器中,输入更改可能会在逻辑完成后立即导致输出更改, 当两台机器互连时出现大问题 ,如果不小心,可能会发生
异步反馈
。 -
Mealy状态机对输入的
反应更快:在相同的周期内反应 - 不需要等待时钟。
在Moore机器中,可能需要更多逻辑来将状态解码为输出 - 在时钟边沿之后更多的门延迟。
并非所有时序电路都可以使用Mealy模型实现。 一些时序电路只能作为摩尔机器实现。
-
笔者写完发现自己还是写的组合逻辑,状态机就是个摆设,咱们暂且称其为“自欺欺人”解法吧(doge),不过不想改了就这样吧。。。。。
正确的符合题意的序列检测状态机解法参考下面链接:
Moore型状态机和Mealy型状态机 - 青河 - 博客园
下面贴出自欺欺人解法:
module top_module (
input clk,
input aresetn, // Asynchronous active-low reset
input x,
output z );
parameter IDLE = 1'b0;
parameter DETECT = 1'b1;
reg [1:0] seq_reg;
reg curr_state;
reg next_state;
always @(posedge clk or negedge aresetn) begin
if(~aresetn) begin
curr_state <= IDLE;
end
else begin
curr_state <= next_state;
end
end
always @(*) begin
case(curr_state)
IDLE:next_state <= DETECT;
DETECT:next_state <= DETECT;
default:next_state <= IDLE;
endcase
end
always @(posedge clk or negedge aresetn) begin
if(~aresetn) begin
seq_reg <= 2'd0;
end
else begin
seq_reg <= {seq_reg[0],x};
end
end
always @(*) begin
if(~aresetn)
z = 1'b0;
else if((seq_reg == 2'b10) &&(x == 1'b1))
z = 1'b1;
else
z= 1'b0;
end
endmodule