状态机代码获得意外输出

问题描述 投票:0回答:1
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

状态图如下:

我得到的输出无关紧要。此外,我无法在状态图查看器中查看状态图。我已经指定了每个状态的行为和输出,但我无法在代码中找到错误。我需要一些关于为状态机编写代码的指导以及该代码不起作用的原因?

verilog state-machine
1个回答
0
投票

您没有正确重置您的设计。将

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(未知)。

© www.soinside.com 2019 - 2024. All rights reserved.