1.原题复现
2.解题思路
可以看出题目本身还是比较简单的,但是要注意的是这题的要求是利用Meanly来做,当然通过这道题,也要寻找出Meanly和Moore的类型的不同。
利用Meanly思路来解题:
Meanly的输出的明显特点就是:输出不仅与当前的状态有关,而且也会受到当前输入的影响。如下图的上方状态图所示:
在本题中,当z=1的时候,要求为当前状态为s2而且满足同时x=1。
同时也可以看出,相比Moore思路来写的话,将会少一个状态S3。
给出相应的代码:
module top_module (
input clk,
input aresetn, // Asynchronous active-low reset
input x,
output z );
parameter IDLE=0,S1=1,S2=2'b10,S3=3'b101;
reg [2:0]state,next_state;//一定要注意,reg的位数要与参数的赋值位宽相匹配。
always@(*)begin
case(state)
IDLE:next_state = x?S1:IDLE;
S1:next_state = x?S1:S2;
S2:next_state = x?S3:IDLE;
S3:next_state = x?S1:S2;
endcase
end
always@(posedge clk,negedge aresetn)begin
if(~aresetn) begin
state<=IDLE;
end
else begin
state<=next_state;
end
end
assign z = (next_state == S3);
endmodule
Moore的解题思路:
Moore类型的输出与当前的输入是无关的,只与当前所处的状态相关。要注意,因为这里是要求Meanly类型来解题,因此输出时候的状态应该为进入状态S3的上一个时序(也就是说,在判断出下一个状态为S3的时候,就应该对输出置高了,因为这样才能体现出是一个Meanly型,与输入有关。)
给出相关的代码:
module top_module (
input clk,
input aresetn, // Asynchronous active-low reset
input x,
output z );
parameter IDLE=0,S1=1,S2=2;
reg [1:0] state,next_state;
always@(*)begin
case(state)
IDLE: next_state = x?S1:IDLE;
S1: next_state = x?S1:S2;
S2: next_state = x?S1:IDLE;
endcase
end
always@(posedge clk,negedge aresetn)begin
if(~aresetn)begin
state<=IDLE;
end
else begin
state<=next_state;
end
end
assign z = (state == S2) && (x==1);
endmodule
总结一下别人的笔记:
1、Moore型的输出只与当前状态有关,而Meanly型的输出与输入、当前状态都相关
2.在实现相同功能的情况下,Meanly型状态机相对来说要比Moore型状态机的状态数目要少,而且Moore型需要等待状态稳定才能输出。
3.输出时序上,Moore状态机同步输出,Meanly状态机异步输出。
4.输出变化上,Mealy状态机比Moore状态机领先一个时钟周期。
摘自Exams/ece241 2013 q8——Mealy型和Moore型FSM的比较