Menu
Coddy logo textTech

Definición de los estados

Parte de la sección Fundamentos del Journey de Verilog de Coddy. Lección 79 de 90.

challenge icon

Desafío

Un controlador de semáforo es una máquina de estados finitos que recorre diferentes estados de las luces (Rojo, Amarillo, Verde) con intervalos de tiempo específicos. Una máquina de estados finitos (FSM) es un circuito que puede estar en uno de un número limitado de estados. Cambia de un estado a otro según las entradas o el tiempo.

En este proyecto, construirás un controlador de semáforo para una intersección sencilla. El semáforo tiene tres salidas:

LuzSalidaSignificado
Rojared = 1Detenerse
Amarillayellow = 1Precaución
Verdegreen = 1Avanzar

Las luces siguen este orden:

Green → Yellow → Red → Green → …

Secuencia de tiempos

EstadoDuraciónSiguiente estado
Verde30 segundosAmarillo
Amarillo10 segundosRojo
Rojo40 segundosVerde

En esta lección, definirás los estados del controlador de semáforo.

Un semáforo tiene tres estados posibles:

EstadoLuzCódigo
VerdeLuz verde ENCENDIDA2'b00
AmarilloLuz amarilla ENCENDIDA2'b01
RojoLuz roja ENCENDIDA2'b10

Completa el módulo añadiendo las partes que faltan.

Qué hacer:

Define la codificación de estados: 0=Verde, 1=Amarillo, 2=Rojo

  1. Declara un registro de 2 bits llamado state
  2. Declara un registro de 6 bits llamado counter (para tiempos de hasta 40 segundos). No se utiliza en este paso: la lógica de temporización que cuenta con él se verá más adelante en este proyecto, en el paso Temporización de las transiciones
  3. Añade las asignaciones de salida dentro de un bloque combinacional always @(*) begin ... end, con un case (state) dentro de él. red, yellow y green se declaran como output reg, y un reg solo puede asignarse dentro de un bloque de este tipo. @(*) significa que el bloque se ejecuta de nuevo cada vez que cambia cualquier elemento que lee, que en este caso es state:
    • Cuando el estado es 0: green = 1, yellow = 0, red = 0
    • Cuando el estado es 1: green = 0, yellow = 1, red = 0
    • Cuando el estado es 2: green = 0, yellow = 0, red = 1

Pruébalo tú mismo

module traffic_light (
  input clk,
  input reset,
  output reg red,
  output reg yellow,
  output reg green
);
  // TODO: Tarea 1 - Declarar registro de estado (2 bits)
  
  // TODO: Tarea 2 - Declarar registro contador (6 bits)
  

  // TODO: Tarea 3 - Asignaciones de salida usando case (state)
  // state 0: green=1, yellow=0, red=0
  // state 1: green=0, yellow=1, red=0
  // state 2: green=0, yellow=0, red=1

endmodule

Todas las lecciones de Fundamentos

Practica por tu cuenta: Compilador de Verilog online