Verilog Práctico

Capítulo 21.1. Contadores

14 de abril de 2023

Los circuitos contadores tienen muchas aplicaciones en sistemas digitales. Por ejemplo: contar el número de veces que se da un suceso, generar intervalos de tiempo para el control de tareas, como temporizadores, etc.


1. Contador ascendente

Comenzaremos describiendo un sencillo contador ascendente de 4 bits, de funcionamiento cíclico (siempre está contando). 

Para una mejor visualización del funcionamiento, vamos a generar una señal de reloj de 1 Hz. Implementamos la función de reset con el sw1. La salida la mostramos por los ledes LED4 (MBS) a LED7 (LSB).


Código Verilog

Archivo .pcf

2. Contador ascendente / descendente


En el siguiente ejemplo vamos a introducir una señal enable para habilitar / detener el proceso de cuenta, además de una señal de control up para hacer que el contador funcione de manera ascendente si up = 1 o descendente si up = 0


Para mostrar el progreso del contador, empleamos un segundo módulo convertidor de binario a hexadecimal, cuya salida está conectada a un display de 7 segmentos.

Esquema


Pulsador de reset con sw1. Interruptor enable en pin D13 y selector up / down conectado en pin D12. 

Código Verilog

Describimos el contador y el decodificador en archivos .v independientes y en el módulo superior interconectamos los puertos de entrada y salida (ver módulo top.v más abajo).


up_down_counter.v

bin2hex.v

En el módulo principal o superior instanciamos los otros módulos.


módulo top.v

Archivo .pcf

3. Contador ascendente / descendente con entrada de dato


En los ejemplos anteriores el contador funciona cíclicamente contando de 0 hasta 15 o desde 15 hasta 0, dependiendo de la entrada de selección up.

El siguiente contador dispone de una entrada para introducir el número a partir del cual el contador empieza a contar / descontar. La carga del número se hace al activar la señal load con el sw2. 

Esquema


Con un dip switch de 4 bits seleccionamos el número d_in a partir del cual queremos empezar a contar/descontar  y con el pulsador de load lo introducimos en la Alhambra FPGA. El contador empezará a contar a partir de ese número inicial, hasta el máximo de 15, por ser un contador de 4 bits. Al llegar a 15 se resetea y comienza de cero. 


En función de la entrada de selección up, el contador funcionará de manera ascendente o descendente. Si está en modo descendente, al pulsar load empezará a descontar desde el valor inicial que hemos introducido hasta llegar a 0, momento en el que resetea y comienza a contar regresivamente desde 15.


Para visualizar mejor el funcionamiento del contador, vamos a sacar la salida por un display de 7 segmentos, de la misma manera que en el ejemplo anterior.

Código Verilog


El modo de funcionamiento lo seleccionamos con una declaración casex concatenando los bits load y up. Si up = 1 contador ascendente; si up = 0 contador descendente; si load = 1 introducimos el número, no importa lo que valga up.

up_down_counter_w_load.v 

El módulo bin2hex.v no cambia, no lo pego aquí por ser redundante. 

En el módulo superior interconectamos los puertos de entrada y salida. 


top module

Archivo .pcf

4. Modulus Counter


Un contador tipo modulus cuenta desde cero hasta un número determinado. Al llegar al valor que hemos establecido se resetea y comienza de  nuevo.

En este ejemplo el contador se detiene al llegar a 7 y se activa la señal dn, que sacamos por el LED0. La cuenta se puede resetear en cualquier momento pulsando el sw1 de reset. 

Código Verilog


modulus_counter.v

En el módulo superior interconectamos los puertos de entrada y salida . El módulo bin2hex.v es el mismo que en los ejemplos anteriores.


top module

Archivo .pcf

5. Modulus Counter con entrada de dato


Mismo ejemplo anterior, pero ahora el número final de la cuenta, se puede modificar sobre la marcha. El valor final lo introducimos con un dip switch conectado en las entradas D8 a D11

No hay pulsador de load para introducir el dato, el valor se actualiza en tiempo real.

Esquema

Código Verilog

En el módulo superior interconectamos los puertos de entrada y salida . El módulo bin2hex.v no cambia.


top module

Archivo .pcf

Eso es todo, espero que os haya gustado.

Descargas

Aquí abajo puedes descargar el código verilog de los ejemplos vistos en este tutorial.