Programación en Verilog/Máquinas de estado
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