Programación en Verilog/Máquinas de estado

← Sintetizabilidad Máquinas de estado Directivas para el compilador →



Uno de los aspectos más destacados y frecuentes en los diseños Verilog, es la realización de máquinas de estados. En esta sección, se propone un método para la estructuración de una máquina de estados, empleando tres procesos.

  • Asignación asíncrona del siguiente estado, partiendo de de las entradas al diseño y del estado en el que se encuentre.
  • Asignación síncrona, donde el flanco de reloj hace que el estado actual sea el que se ha estado preparando.
  • Asignación de las salidas.

A continuación se modela un semáforo en Verilog, mediante una máquina de estados.


  module semaforo(clk, rst, color);
    input clk;
    input rst;
    output [1:0] color;

    reg [1:0] state, nextState;
    reg [8:0] cnt;

    // Asignación asíncrona del siguiente estado
    always @(state, cnt)
      case(state)
      0:  // Color Rojo
        if (cnt == 100) nextState = 1;
        else nextState = 0;
      1:  // Color Ambar
        if (cnt == 120) nextState = 2;
        else nextState = 1;
      2:  // Color Verde
        if (cnt == 200) nextState = 0;
        else nextState = 2;
      default: nextState = 0;
      endcase

    // Asignación síncrona: Actualización del estado
    always @(posedge clk or negedge rst)
      if(rst == 0) state = 0;
      else state = nextState;

    // Asignación de las salidas
    always @(state)
      if(state == 0) color = 2'b00; // Color Rojo
      else if(state == 1) color = 2'b01; // Color Ambar
      else color = 2'b10; // Color Verde

    // Contador
    always @(posedge clk or negedge rst)
      if(rst == 0) cnt = 0;
      else cnt = cnt + 1;
    endmodule


← Sintetizabilidad Máquinas de estado Directivas para el compilador →