Temporización de las transiciones
Parte de la sección Fundamentos del Journey de Verilog de Coddy. Lección 81 de 90.
Desafío
En esta lección, añadirás la lógica del contador que controla cuánto tiempo permanece encendida cada luz. El contador cuenta hacia atrás desde un valor preestablecido hasta cero y después activa el siguiente cambio de estado.
Requisitos de temporización
| Estado | Duración | Valor del contador |
|---|---|---|
| Verde | 30 segundos | 30 |
| Amarillo | 10 segundos | 10 |
| Rojo | 40 segundos | 40 |
Cómo funciona el contador
- Cuando comienza un estado, el contador se carga con el valor de duración
- En cada ciclo de reloj, el contador disminuye en 1
- Cuando el contador llega a 0, es momento de cambiar al siguiente estado
Tu tarea es añadir la lógica del contador que falta a la máquina de estados. La entrada next del paso anterior ya no se utiliza: ahora el contador decide cuándo cambia el estado, y el banco de pruebas ya no controla next.
Qué hacer:
- Elimina
input next,de la cabecera del módulo y reemplaza la condiciónelse if (next)por la lógica del contador que aparece a continuación - Añade una declaración
reg [5:0] counter(consérvala si ya la declaraste en el primer paso) - Al reiniciar, establece
counteren 0 - Cuando
counter == 0:- Carga la duración del siguiente estado en el contador
- Cambia al siguiente estado
- De lo contrario, decrementa el contador en 1 en cada ciclo de reloj
Pruébalo tú mismo
module traffic_light (
input clk,
input reset,
output reg red,
output reg yellow,
output reg green
);
reg [1:0] state;
// TODO: Declarar registro contador (6 bits)
// 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
// Máquina de estados con temporización
always @(posedge clk or posedge reset) begin
if (reset) begin
state <= 2; // Iniciar en Rojo
// TODO: Establecer contador a 0
end else begin
if (counter == 0) begin
case (state)
0: begin
state <= 1;
// TODO: Cargar contador para Amarillo (10 segundos)
end
1: begin
state <= 2;
// TODO: Cargar contador para Rojo (40 segundos)
end
2: begin
state <= 0;
// TODO: Cargar contador para Verde (30 segundos)
end
endcase
end else begin
// TODO: Decrementar contador en 1
end
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