Verilog Práctico

Capítulo 22. Temporizadores

16 de abril de 2023

Un temporizador se puede describir a partir de un contador, de hecho, cuando encontremos un temporizador dentro de un código Verilog, hay muchas posibilidades de que esté basado en un contador.


1. Temporizador sencillo

El siguiente ejemplo muestra un temporizador cuya salida done se activa durante un ciclo de reloj, cuando se alcanza el tiempo establecido de 10 segundos. El temporizador esta basado en un contador tipo modulus cuyo valor final es 9. Para una mejor visualización del funcionamiento, he generado una señal de reloj de 1 Hz para el incremento del contador.

En amarillo vemos la señal de reloj de 1 Hz y en azul vemos cómo se genera un pulso cada 10 segundos, el ancho del pulso es un ciclo re reloj.

2. Temporizador Dinámico

En el ejemplo anterior el tiempo de disparo del temporizador es fijo y lo determinamos con el parámetro t=9. El siguiente ejemplo describe un contador dinámico, en el que podemos variar el tiempo de disparo mediante una entrada de dato con un dip switch.

El tiempo a contar es el dato que pongamos en la entrada + 1.

3. Automático de escalera

Vamos a ver un ejemplo de aplicación real de los temporizadores.

En el siguiente ejemplo vamos a describir un temporizador de escalera, que acciona una lámpara durante un tiempo definido y se resetea cada vez que se acciona el pulsador.

El temporizador está basado en un contador con entrada enable para habilitar la cuenta y reset para reiniciar el tiempo.

Código Verilog

Archivo .pcf

El código se puede simplificar, ya que en realidad sólo necesitamos la salida lamp que conectaremos a un relé para encender la luz de la escalera, pero he sacado los bits del contador y la señal done por los ledes de la Alhambra para visualizar el funcionamiento y verificar que se comporta como se espera.

4. Puerta de garaje

Otro ejemplo de aplicación de un temporizador puede ser el funcionamiento de una puerta de garaje, donde una vez se abre la puerta, habilitamos un temporizador que tras un tiempo determinado acciona el motor en sentido contrario para cerrarla.

Para programar el circuito vamos a utilizar una máquina de estado finito que habilita el temporizador y proporciona además, las salidas para un driver tipo L298 con el que controlaremos el motor de la puerta.

La señal set pone en marcha la puerta, la señal reset lleva la FSM a un estado inicial -si fuera necesario- y para detectar si la puerta está abierta o cerrada empleamos los finales de carrera fc_up y fc_dw.


Diagrama de transiciones de la FSM

Esquema

Código Verilog


Declaramos las entradas y salidas.

Hacemos las siguientes asignaciones:


Asignamos la señal done al LED0 para ver cuando se cumple el tiempo.

Asignamos la salida del temporizador al registro Q que luego visualizaremos en los ledes 4 a 7 (ver archivo .pcf)

Concatenamos las entradas {done, set, fc_dw, fc_up} en un solo array tipo wire. 

Generamos una señal clk2 de 1 Hz para el contador. 

A continuación describimos la FSM con tres bloques always.

Bloque always que almacena el estado actual. 

Bloque always que genera el estado siguiente. 

Bloque always para las salidas.

Archivo .pfc

Subimos el código a la Alhambra y al pulsar el sw1 el motor comienza a girar, cuando pisa el fc_up la puerta se detiene y comienza a contar el temporizador. Pasado el tiempo establecido el motor gira en sentido contrario para cerrar la puerta. Cuando pisa el fc_dw el motor se para.

Si mientras se está cerrando la puerta, pulsamos sw1, el motor cambia el sentido de giro y la puerta se abre de nuevo hasta que toca el fc_up, el temporizador empieza a contar y pasado el tiempo accionará el motor para cerrar la puerta. 

Eso es todo, espero que os haya gustado.

Links

Basado en el curso Digital Circuit Design Using Verilog 

Lecture 33. Counters as Timers 

Many thanks to Mr assedin  for sharing

Descargas

Puedes descargar el código Verilog de los ejemplos anteriores en el siguiente enlace.