Máquinas de estados finitos en verilog

-1

Soy nuevo en Verilog. Estaba tratando de escribir las siguientes máquinas de estados finitos (miley machine) en Verilog:

esto es lo que tengo:

// clk - clock, i - input, o - output
module test (clk,reset,i,o);

input   clk,reset,i;
output  o;
reg     o;
wire    clk,reset,i;

reg [2:0] present_state;
reg [2:0] next_state;

parameter A=2'b00, B=2'b01, C=2'b10;

always @(present_state,i)
begin
    case (present_state)
    A: if(i)        next_state = B;
       else         next_state = A;
    B: if(i)        next_state = A;
       else         next_state = C;
    C: if(i)        next_state = C;
       else         next_state = B;
    default:        next_state = A;
    endcase
end

always @(posedge clk, posedge reset)
begin
    if(reset)
        present_state = 0'b0;
    else
        present_state = next_state;
end


always @(present_state)
begin
    if(present_state == A)
        o = 1'b0;
    else if(present_state == C)
        o = 1'b1;
    else
        o = i;
end

endmodule

Tengo un probador y cada vez que lo ejecuto, recibo un error. ¿Cuál es el orden de la instrucción de bloque (que viene primero?). Incluso pensé que mi programa compilaba, no funciona.

    
pregunta kicklog

2 respuestas

0

Creo que el problema en su código es que el bloque cronometrado "present_state - > next_state" no emplea sintaxis de asignación sin bloqueo.

Por favor, estudie cuidadosamente los siguientes artículos,

" Técnicas sintetizables de diseño de máquina de estado finito "

y

" Los fundamentos del diseño eficiente de máquinas de estado finito sintetizable " ,

y sigue sus consejos y notación / sintaxis meticulosamente. Obtendrá resultados correctos.

Y otra , del mismo experto Clifford E. Cummings.

    
respondido por el Ale..chenski
0
// Testbench
'timescale 1ns/1ns
module test;

  reg clk   ;
  reg reset ;
  reg i     ;


  // Instantiate design under test
  test01 TST(.clk(clk), 
             .reset(reset),
             .i(i), 
             .o(o));

  initial begin
    $dumpfile("dump.vcd");
    $dumpvars(1);
    clk     =   1'b0;
    reset   =   1'b1;
    i       =   1'b0;
    end

  always begin
    #10     reset   = 1'b0;
    #15     i       = 1'b1;
    #20     i       = 1'b0;
  end

  always
    #5  clk = !clk;

endmodule

A este banco de pruebas lo veo funcionando bien :)

module test01 (clk,reset,i,o);

input   clk,reset,i;
output  o;
reg     o;
wire    clk,reset,i;

reg [2:0] present_state;
reg [2:0] next_state;

parameter A=2'b00, B=2'b01, C=2'b10;

always @(present_state,i)
begin
    case (present_state)
    A: if(i)        next_state = B;
       else         next_state = A;
    B: if(i)        next_state = A;
       else         next_state = C;
    C: if(i)        next_state = C;
       else         next_state = B;
    default:        next_state = A;
    endcase
end

always @(posedge clk, posedge reset)
begin
    if(reset)
        present_state = 2'b00;
    else
        present_state = next_state;
end


always @(present_state)
begin
    if(present_state == A)
        o = 1'b0;
    else if(present_state == C)
        o = 1'b1;
    else
        o = i;
end

endmodule

Prueba2:estotambiénfunciona

//Testbenchmoduletest;regclk;regreset;regi;//Instantiatedesignundertesttest01TST(.clk(clk),.reset(reset),.i(i),.o(o));initialbegin$dumpfile("dump.vcd");
    $dumpvars(1);
    clk     =   1'b1;
    reset   =   1'b1;
    i       =   1'b1;
    end

  always begin
    #10     reset   = 1'b0;
    //#15   i       = 1'b1;
    //#20       i       = 1'b0;
  end

  always
    #5  clk = !clk;

endmodule

    
respondido por el rsg1710

Lea otras preguntas en las etiquetas