module mealy(input x_in,rst_n,clk, output reg y_out);
parameter s0 = 2'b00, s1 = 2'b01 , s2 = 2'b10;
reg [1:0] p_state,n_state;
always@(posedge clk,negedge rst_n) begin
if(!rst_n) p_state <= s0;
else
p_state <= n_state;
end
always@(x_in,p_state) begin
case (p_state)
s0:
n_state = x_in ? s2 : s1;
s1:
n_state = x_in ? s2 : s1;
s2:
n_state = x_in ? s2 : s1;
endcase
end
always@(x_in,p_state) begin
case (p_state)
s0:
y_out = 1'b0;
s1:
y_out = x_in ? 1'b1 : 1'b0;
s2:
y_out = !x_in ? 1'b1 : 1'b0;
endcase
end
endmodule
module mealy_tb;
reg x_in,rst_n,clk;
wire y_out;
mealy dut(x_in,rst_n,clk,y_out);
initial begin
clk = 1'b0;
forever #10 clk = ~clk;
end
initial begin
rst_n = 1'b0;
repeat(1000) begin
x_in = {$random};
rst_n = 1'b1;
#10;
end
end
endmodule
我得到的输出无关紧要。此外,我无法在状态图查看器中查看状态图。我已经指定了每个状态的行为和输出,但我无法在代码中找到错误。我需要一些关于为状态机编写代码的指导以及该代码不起作用的原因?
您没有正确重置您的设计。将
rst_n
设置为 0 后添加延迟:
initial begin
rst_n = 1'b0;
#20;
repeat(1000) begin
x_in = {$random};
rst_n = 1'b1;
#10;
end
end
通过查看模拟波形很容易识别问题。
rst_n
始终为 1,这意味着 p_state
始终为 x(未知)。