¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Reloj y contadores en Verilog

Después de esta lección: Puedo describir un contador que cambia en el flanco de subida del reloj.

Lección de 55 min7 comandosLaboratorio de Diseño digital: Verilog, VHDL y yosys en una VM Ubuntu privada

El torno que cuenta personas

Un contador digital es un circuito que cuenta los pulsos de un reloj. El reloj es una señal que sube y baja a un ritmo fijo, y el contador cambia de número solo cuando sube.

El torno de una estación de metro funciona así: cada persona que pasa suma una unidad. Hoy verás cómo se describe en Verilog un circuito que recuerda un número.

Al final de esta lección

Nota

Puedo describir un contador que cambia en el flanco de subida del reloj.

Palabras clave

PalabraQué significaEjemplo
Relojuna señal que sube y baja a un ritmo fijoclk
Flanco de subidael instante en que el reloj pasa de 0 a 1
Biestableuna pieza que guarda un bit y solo lo cambia con el reloj
reguna variable de Verilog que guarda un valor entre dos flancos
Resetuna entrada que devuelve el circuito a su valor inicialrst
Habilitaciónuna entrada que permite o impide que el circuito cambieen

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Un biestable guarda un valor entre dos flancos

Hasta ahora, la salida de cada circuito seguía a sus entradas, sin recordar nada. Un contador tiene que recordar su número.

Lo guarda en biestables. Un biestable copia su entrada solo en el flanco de subida del reloj y la conserva hasta el siguiente. En Verilog, always @(posedge clk) significa "cada vez que el reloj sube".

El contador del laboratorio, en cuatro líneas

Código: c
// El cuerpo de counter.v: q guarda el número y cambia solo en el flanco de subida.
always @(posedge clk)
  if (rst) q <= 4'd0;
  else q <= q + 4'd1;

Entra en la carpeta del laboratorio

Comando
cd ~/hdl

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Compila el contador con su banco de pruebas

Comando
iverilog -o /tmp/counter counter.v counter_tb.v

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Simula el contador

Comando
vvp /tmp/counter

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

El reset da un punto de partida

Al encender un circuito, un biestable no vale 0 ni 1: su valor es desconocido. El simulador lo escribe x.

El reset resuelve esto. Mientras vale 1, el contador pasa a 0 en cada flanco. Los siguientes Runs hacen una copia del contador donde el reset no hace nada, para ver qué pasa sin él.

Copia el contador con el reset roto

Comando
sed 's/q <= 4.d0;/q <= q;/' counter.v > /tmp/counter_norst.v

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Compila la copia

Comando
iverilog -o /tmp/cnr /tmp/counter_norst.v counter_tb.v

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Simula la copia

Comando
vvp /tmp/cnr

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un error frecuente

Advertencia

Mucha gente cree que un circuito empieza en 0 al encenderse. No es así: un biestable no tiene un valor conocido hasta que un reset o una asignación se lo da. Si no lo tiene, sumar 1 a un valor desconocido sigue dando un valor desconocido.

Reset y habilitación deciden en cada flanco

Un contador real suele tener una entrada de habilitación, en. Con en a 0 no cuenta y guarda su valor.

En cada flanco se mira primero el reset, y después la habilitación. Con cuatro bits solo caben los números del 0 al 15, así que después del 15 vuelve a 0.

Qué hace q en cada flanco

rstenQué pasa con q
10 o 1Pasa a 0
01Sube una unidad
00Se queda igual
01, con q en 15Vuelve a 0

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Por qué el 15 vuelve a 0

Comando
python3 -c "print((14 + 1) % 16, (15 + 1) % 16)"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Para ir más lejos

Un reset síncrono actúa en el flanco del reloj. Uno asíncrono actúa en cuanto sube la señal, sin esperar al reloj. El laboratorio comprueba antes y después de cada flanco, y el reset síncrono no cambia nada entre dos flancos.

Piensa qué se vería en una onda si el reset fuera asíncrono y se pulsara entre dos flancos.

Sobre este laboratorio y su código: Laboratorio de Diseño digital: Verilog, VHDL y yosys en una VM Ubuntu privada

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.