Verilog Práctico
Capítulo 21.1. Contadores
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.
Links
Basado en el curso Digital Circuit Design Using Verilog
Lecture 33 - Up Down Load Counters
Many thanks to Mr Anas Salah Eddin for sharing
Descargas
Aquí abajo puedes descargar el código verilog de los ejemplos vistos en este tutorial.