题目:用三段式moore型状态机实现序列“1011”的不重叠检测。
注意点:三段式状态机,Moore状态机,不重叠检测。
代码:
module fsm(
input clk,
input rst_n,
input data_in,
output reg data_out
);
reg [4:0]c_state;
reg [4:0]n_state;
parameter s0 = 5'b00001;
parameter s1 = 5'b00010;
parameter s2 = 5'b00100;
parameter s3 = 5'b01000;
parameter s4 = 5'b10000;
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
c_state <= s0;
else
c_state <= n_state;
end
always@(*)begin
case(c_state)
s0:
begin
if(data_in)
n_state <= s1;
else
n_state <= s0;
end
s1:
begin
if(data_in)
n_state <= s1;
else
n_state <= s2;
end
s2:
begin
if(data_in)
n_state <= s3;
else
n_state <= s0;
end
s3:
begin
if(data_in)
n_state <= s4;
else
n_state <= s2;
end
s4:
begin
if(data_in)
n_state <= s1;
else
n_state <= s0;
end
default:
n_state <= s0;
endcase
end
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
data_out <= 1'b0;
else if(n_state == s4)
data_out <= 1'b1;
else
data_out <= 1'b0;
end
endmodule
状态转移图:

补充:状态机从三方面进行覆盖率的测试:
- 所有状态都是完备的;
- 不会进入死循环和不确定的状态;
- 进入异常状态也能恢复正常的状态。
248

被折叠的 条评论
为什么被折叠?



