máquina de estado verilog - el estado no se actualizará

-1

Así que estoy tratando de simular una máquina de estados con salidas s y v y un estado. por alguna razón, nuestros valores s y v se están actualizando, pero el estado se niega a cambiar, cualquier ayuda sería increíble

module controller(
  input x,
  input clk,
  output reg S,
  output reg V);

  parameter  S0 = 3'b000, S1 = 3'b010, S2 = 3'b001, S3 = 3'b101, S4 = 3'b011, S5 = 3'b100,S6=3'b111;

  reg [2:0] state = S0; //assuming starting at S0

  always @(negedge clk) 
    case(state)
      S0: begin
        if(x==0)begin
          S<=1;
          V<=0;
          state<=S1;
        end else begin
          S<=0;
          V<=0;
          state<=S2;
        end
      end
      S1:begin
        if(x==0)begin
          S<=1;
          V<=0;
          state<=S3;
        end else begin
          S<=0;
          V<=0;
          state<=S4;
        end
      end
      S2: begin
        if(x==0)begin
          S<=0;
          V<=0;
          state<=S4;
        end else begin
          S<=1;
          V<=0;
          state<=S4;
        end
      end
      S3: begin
        if(x==0)begin
          S<=0;
          V<=0;
          state<=S5;
        end else begin
          S<=1;
          V<=0;
          state<=S5;
        end
      end
      S4:begin
        if(x==0)begin
          S<=1;
          V<=0;
          state<=S5;
        end else begin
          S<=0;
          V<=0;
          state<=S6;
        end
      end
      S5: begin
        if(x==0)begin
          S<=0;
          V<=0;
          state<=S0;
        end else begin
          S<=1;
          V<=0;
          state<=S0;
        end
      end
      S6: begin
        if(x==0)begin
          S<=1;
          V<=0;
          state<=S0;
        end else begin
          S<=0;
          V<=1;
          state<=S0;
        end
      end
    endcase

endmodule


'timescale 1ns/1ps
module driver();
  wire testX,testClk, testS,testV;

  controller c
  (
    .x (testX),
    .clk (testClk),
    .S (testS),
    .V (testV)
  );

  tester t
  (
    .x (testX),
    .clk (testClk)
  );

endmodule

'timescale 1ns/1ps
module tester(
  output reg x,
  output reg clk
);

  always
    begin
      clk <=0;
      #5;
      clk <=1;
      #5;
    end

  initial
    begin
      //1011 1100 1101
      #2.5 x=1;
      #10 x=0;
      #10 x=1;
      #10 x=1;
      #10 x=0;
      #10 x=0;
      #10 x=1;
      #10 x=1;
      #10 x=1;
      #10 x=1;
      #10 x=0;
      #10 x=1;
    end 

endmodule
    
pregunta greenteam

2 respuestas

1

El problema es que no tienes ninguna señal de reinicio

Es inusual inicializar un registro con la siguiente línea de código:

reg [2: 0] estado = S0; // asumiendo que comienza en S0

1. Cambie a:

reg [2: 0] estado;

2 Agregar una entrada real de señal de reinicio:

reinicio de entrada, 3. Use esta señal de restablecimiento (activa alta) para inicializar su registro de estado:

module controller(
  input x,
  input clk,
  input reset,
  output reg S,
  output reg V);

  parameter  S0 = 3'b000, S1 = 3'b010, S2 = 3'b001, S3 = 3'b101, S4 = 3'b011, S5 = 3'b100,S6=3'b111;

  reg [2:0] state ;

always @(negedge clk or posedge reset) begin
  if (reset) begin
    state <= 0;
    S <= 1;
    V <= 0;
  end
  else begin
    case(state)
      S0: begin
        if(x==0)begin
          S<=1;
          V<=0;
          state<=S1;
        end else begin
          S<=0;
          V<=0;
          state<=S2;
        end
      end
    .......
      S6: begin
        if(x==0)begin
          S<=1;
          V<=0;
          state<=S0;
        end else begin
          S<=0;
          V<=1;
          state<=S0;
        end
      end
    endcase
 end
endmodule

....

    
respondido por el Blade Runner
0

El código anterior está funcionando bien. Probablemente debería comprobar la configuración de su simulador. También es una buena práctica tener una señal reset ya que todas las máquinas / sistemas prácticos tienen una opción reset . El reinicio suele ser 'bajo activo'.

    
respondido por el Hesham Ahmad

Lea otras preguntas en las etiquetas