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
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Reloj | una señal que sube y baja a un ritmo fijo | clk |
| Flanco de subida | el instante en que el reloj pasa de 0 a 1 | |
| Biestable | una pieza que guarda un bit y solo lo cambia con el reloj | |
| reg | una variable de Verilog que guarda un valor entre dos flancos | |
| Reset | una entrada que devuelve el circuito a su valor inicial | rst |
| Habilitación | una entrada que permite o impide que el circuito cambie | en |
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
// 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
cd ~/hdlSe 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
iverilog -o /tmp/counter counter.v counter_tb.vSe 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
vvp /tmp/counterSe 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
sed 's/q <= 4.d0;/q <= q;/' counter.v > /tmp/counter_norst.vSe 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
iverilog -o /tmp/cnr /tmp/counter_norst.v counter_tb.vSe 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
vvp /tmp/cnrSe 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
| rst | en | Qué pasa con q |
|---|---|---|
| 1 | 0 o 1 | Pasa a 0 |
| 0 | 1 | Sube una unidad |
| 0 | 0 | Se queda igual |
| 0 | 1, con q en 15 | Vuelve a 0 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Por qué el 15 vuelve a 0
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.