题解 | #根据状态转移写状态机-二段式#
根据状态转移写状态机-二段式
http://www.nowcoder.com/practice/5b2ff27610d04993ae92374d51bfc2e6
看了一下评论区的题解 题目要求mealy型状态机,全部写的是moore型 ,用一个条件去判断他们的代码就能发现错误,
如果此时在状态4 (s4)data为0;输出是什么,应该是0,而不是1;但是网站给的测试代码是moore型所以我这个通过不了。他们的通过了。
如果有错误欢迎指正。谢谢!
`timescale 1ns/1ns
module fsm2(
input wire clk ,
input wire rst ,
input wire data ,
output reg flag
);
//*************code***********//
reg [2:0] state ,next_state;
parameter s0 = 0;
parameter s1 = 1;
parameter s2 = 2;
parameter s3 = 3;
parameter s4 = 4;
always @ (posedge clk or negedge rst)begin
if(!rst)
state <= s0;
else
state <= next_state;
end
always @ (*)begin
if(!rst)begin
next_state <= s0;
flag <= 1'b0;
end
else begin
case(state)
s0 : begin
flag <= 1'b0;
if(data)
next_state <= s1;
else
next_state <= s0;
end
s1 : begin
flag <= 1'b0;
if(data)
next_state <= s2;
else
next_state <= s1;
end
s2 : begin
flag <= 1'b0;
if(data)
next_state <= s3;
else
next_state <= s2;
end
s3 : begin
flag <= 1'b0;
if(data)
next_state <= s4;
else
next_state <= s3;
end
s4 : begin
if(data)begin
next_state <= s1;
flag <= 1'b1;
end
else begin
next_state <= s0;
flag <= 1'b0;
end
end
default : begin
next_state <= next_state;
flag <= 1'b0;
end
endcase
end
end
//*************code***********//
endmodule
module fsm2(
input wire clk ,
input wire rst ,
input wire data ,
output reg flag
);
//*************code***********//
reg [2:0] state ,next_state;
parameter s0 = 0;
parameter s1 = 1;
parameter s2 = 2;
parameter s3 = 3;
parameter s4 = 4;
always @ (posedge clk or negedge rst)begin
if(!rst)
state <= s0;
else
state <= next_state;
end
always @ (*)begin
if(!rst)begin
next_state <= s0;
flag <= 1'b0;
end
else begin
case(state)
s0 : begin
flag <= 1'b0;
if(data)
next_state <= s1;
else
next_state <= s0;
end
s1 : begin
flag <= 1'b0;
if(data)
next_state <= s2;
else
next_state <= s1;
end
s2 : begin
flag <= 1'b0;
if(data)
next_state <= s3;
else
next_state <= s2;
end
s3 : begin
flag <= 1'b0;
if(data)
next_state <= s4;
else
next_state <= s3;
end
s4 : begin
if(data)begin
next_state <= s1;
flag <= 1'b1;
end
else begin
next_state <= s0;
flag <= 1'b0;
end
end
default : begin
next_state <= next_state;
flag <= 1'b0;
end
endcase
end
end
//*************code***********//
endmodule