Máquina de estados finitos

1

Intenté escribir un código Verilog para la máquina de estados finitos cuyo diagrama se muestra a continuación. No veo nada como una salida. ¿Cuál es la parte incorrecta de mi código? o ¿Es mi código completamente absurdo?

Mi código:

module FSM(D1,D2, NextState);
input D1,D2;
output [1:0] NextState;
reg [1:0] CurrentState=2'b00;
reg [1:0] NextStateOut;
parameter S0=2'b00, S1=2'b10, S2=2'b11, S3=2'b01;

always @(D1 or D2)
 begin
 case(CurrentState)
 S0:
 begin
    if(D1==1'b0 && D2==1'b0)
        NextStateOut <=S0;
    if(D1==1'b1 && D2==1'b0)
    begin
        NextStateOut <=S1;              
    end
end
S1:
begin
    if(D1==1'b0 && D2==1'b0)
    begin
        NextStateOut <=S0;          
    end
    if(D1==1'b1 && D2==1'b0)
        NextStateOut <=S1;
    if(D1==1'b1 && D2==1'b1)
    begin
        NextStateOut <=S2;                  
    end
end
S2:
begin
    if(D1==1'b1 && D2==1'b0)
    begin
        NextStateOut <=S1;      
    end
    if(D1==1'b1 && D2==1'b1)
        NextStateOut <=S2;
    if(D1==1'b0 && D2==1'b1)
    begin
        NextStateOut <=S3;                  
    end
end
S3:
begin
    if(D1==1'b1 && D2==1'b1)
    begin
        NextStateOut <=S2;
                end
    if(D1==1'b0 && D2==1'b1)
        NextStateOut <=S2;
    if(D1==1'b0 && D2==1'b0)
    begin
        NextStateOut <=2'b00;           
    end
end
endcase
CurrentState<= NextStateOut;
end
assign  NextState= NextStateOut;
endmodule

Diagrama de estado:

    
pregunta ffttyy

1 respuesta

1

Un FSM normalmente tiene 2 bloques siempre: 1 secuencial (con un reloj), 1 combinacional (sin reloj). Suponiendo que tiene un reloj y un reinicio asíncrono (no probado):

module FSM(D1,D2, NextState, clk, rst);
input D1,D2,clk,rst;
output [1:0] NextState;
reg [1:0] CurrentState;
reg [1:0] NextStateOut;
parameter S0=2'b00, S1=2'b10, S2=2'b11, S3=2'b01;

always @(posedge clk or posedge rst) begin
    if (rst) begin
        CurrentState <= S0;
    end else begin
        CurrentState <= NextStateOut;
    end
end

always @*
 begin
 case(CurrentState)
 S0:
 begin
    if(D1==1'b0 && D2==1'b0)
        NextStateOut =S0;
    if(D1==1'b1 && D2==1'b0)
    begin
        NextStateOut =S1;              
    end
end
S1:
begin
    if(D1==1'b0 && D2==1'b0)
    begin
        NextStateOut =S0;          
    end
    if(D1==1'b1 && D2==1'b0)
        NextStateOut =S1;
    if(D1==1'b1 && D2==1'b1)
    begin
        NextStateOut =S2;                  
    end
end
S2:
begin
    if(D1==1'b1 && D2==1'b0)
    begin
        NextStateOut =S1;      
    end
    if(D1==1'b1 && D2==1'b1)
        NextStateOut =S2;
    if(D1==1'b0 && D2==1'b1)
    begin
        NextStateOut =S3;                  
    end
end
S3:
begin
    if(D1==1'b1 && D2==1'b1)
    begin
        NextStateOut =S2;
                end
    if(D1==1'b0 && D2==1'b1)
        NextStateOut =S2;
    if(D1==1'b0 && D2==1'b0)
    begin
        NextStateOut =S0;           
    end
end
endcase
end

assign  NextState= NextStateOut;

endmodule

Algunas modificaciones:

  1. El bloque Combo siempre usa @*
  2. Usar asignaciones de bloqueo ( = ) en el bloque combinado
  3. Use el parámetro S0 en lugar de 2'b00 en la última asignación.
respondido por el toolic

Lea otras preguntas en las etiquetas