Lógica de la máquina de estados
Parte de la sección Fundamentos del Journey de Verilog de Coddy. Lección 80 de 90.
Desafío
En esta lección, añadirás la lógica de transición de estados al controlador del semáforo. La máquina de estados determina cuándo pasar de un estado al siguiente.
La lógica de la máquina de estados controla cuándo y cómo el semáforo cambia de estado.
Secuencia de estados
Verde → Amarillo → Rojo → Verde → …
Tu tarea es añadir la lógica de la máquina de estados al módulo.
En este paso, una nueva señal de entrada, next, activa cada cambio; el contador de tiempo se incorporará en el siguiente paso. Conserva todo lo que escribiste en el paso anterior (el registro state, la declaración no utilizada de counter y el bloque de salida always @(*)).
Qué hacer:
- Añade un puerto de entrada de 1 bit llamado
nexta la cabecera del módulo, después dereset:input next,. El banco de pruebas genera un pulso para solicitar el siguiente estado - Añade un bloque
always @(posedge clk or posedge reset) - Al reiniciarse, establece
stateen Rojo (2) - Cuando
nextsea 1, pasa al siguiente estado:- Si el estado es Verde (0): cambia a Amarillo
- Si el estado es Amarillo (1): cambia a Rojo
- Si el estado es Rojo (2): cambia a Verde
Pruébalo tú mismo
module traffic_light (
input clk,
input reset,
input next, // Disparador para cambiar el estado
output reg red,
output reg yellow,
output reg green
);
reg [1:0] state;
// Asignaciones de salida
always @(*) begin
case (state)
0: begin green = 1; yellow = 0; red = 0; end
1: begin green = 0; yellow = 1; red = 0; end
2: begin green = 0; yellow = 0; red = 1; end
default: begin green = 0; yellow = 0; red = 1; end
endcase
end
// TODO: Añadir lógica de la máquina de estados (sin temporización)
// always @(posedge clk or posedge reset) begin
// if (reset) begin
// state <= 2;
// end else if (next) begin
// case (state)
// 0: state <= 1;
// 1: state <= 2;
// 2: state <= 0;
// endcase
// end
// end
endmoduleTodas las lecciones de Fundamentos
1Introducción
Qué es VerilogHardware frente a softwareTu primer móduloComentariosNiveles de abstracción del diseño4Operadores, parte 1
Operadores aritméticosOperador móduloOperadores de comparaciónRepaso: matemáticas simplesOperadores bit a bit7Asignaciones y compuertas
Asignación continuaAsignación con operadoresPrimitivas de compuertas integradasCompuertas AND, OR y NOTCompuertas XOR y XNORRepaso: circuito de compuertas lógicas10Toma de decisiones
Sentencia IfIf - ElseRepaso - Comparador simpleSentencia CaseCasex y CasezRepaso - Diseño de ALU5Operadores, parte 2
Operadores lógicosOperadores de reducciónOperadores de desplazamientoOperador de concatenaciónOperador condicionalRepaso: desafío de operadores11Bucles
Bucle ForBucle WhileBucle de repeticiónBucle infinitoInstrucción DisableRepaso: patrones de bucles3Sistema numérico
Representación binariaNúmeros con tamañoNúmeros sin tamañoNúmeros negativosValores especiales X y ZRepaso: formatos numéricos6Módulos
Estructura de módulosPuertos de entrada y salidaPuertos inoutInstanciación de módulosAsignación de puertos por nombreAsignación de puertos por ordenRepaso: construir un módulo9Bloques procedurales
Bloque AlwaysBloque InitialLista de sensibilidadAsignación bloqueanteAsignación no bloqueanteRepaso: Always vs Initial15Controlador de semáforos
Definición de los estadosLógica de la máquina de estadosPractica por tu cuenta: Compilador de Verilog online