一、Moore型状态机和Mealy型状态机在定义上的区别
1:输出只和当前状态有关而与输入无关,则称为摩尔(Moore)状态机;
2:输出不仅和当前状态有关而且和输入有关,则称为米利(Mealy)状态机;
二、Moore型状态机和Mealy型状态机在定义上的区别
以序列检测101为例(允许重叠检测)
- 摩尔型状态机需要s0、s1、s2、s3四种状态,每次检测到101序列,则跳转到s3输qout=1,注意“需要等到下一次的有效边沿来临才会有输出”。
- 米利型状态机则需要s0、s1、s2三种状态,每次检测到101序列,在最后一个1输入的时候就可以输出qout=1,注意“无需等到下一次有效边沿来临就会输出”。
(这就是为什么mealy型状态机比moore型状态机少一个状态输出)
三、Moore型状态机三段式之第三段讨论。
在网上看了很多作者的博客,发现,三段式状态机的第三段描述并不相同,有的使用时序描述,有的使用组合描述。
下面以101序列检测器(允许重叠检测)讨论区别。
如图是Moore型状态机的状态转换图:
第三段采用时序描述或组合描述代码:
module FSM(clk,reset,din,qout);
input clk,reset,din;
output reg qout;
parameter s0 = 2'b00, s1 = 2'b01, s2 = 2'b11, s3 = 2'b10;
reg [1:0] ns,cs;
always@(posedge clk or posedge reset) begin
if(reset) cs <= s0;
else cs <= ns;
end
always@* begin
ns = s0;
case(cs)
s0: ns = din?s1:s0;
s1: ns = din?s1:s2;
s2: ns = din?s3:s0;
s3: ns = din?s1:s2;
default: ns = s0;
endcase
end
//always@(posedge clk or posedge reset) begin
// if(reset) qout <= 0;
// else begin
// case(cs)
// s0: qout <= 0;
// s1: qout <= 0;
// s2: qout <= 0;
// s3: qout <= 1;
// default: qout <= 0;
// endcase
// end
//end
always@(*) begin
case(cs)
s0: qout <= 0;
s1: qout <= 0;
s2: qout <= 0;
s3: qout <= 1;
default: qout <= 0;
endcase
end
endmodule
仿真:
![](https://i-blog.csdnimg.cn/blog_migrate/eb9a15ca5f63d4c56c666159f8dc9019.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7def712c39f101bd184012b8cdb34c39.png)
结论:可以看出,组合描述的输出不需要等一个时钟边沿。时序描述需要等一个时钟边沿。导致时序描述的输出无法达到重叠检测的功能。