Skip to content

L7: Diseño digital (III): Señales y tiempo

Juan Gonzalez-Gomez edited this page Nov 14, 2022 · 132 revisions

Sesión Laboratorio 7

  • Tiempo: 2h
  • Fecha: Lunes, 14 de Nov de 2022
  • Objetivos de la sesión:
    • Aprender a diseñar e implementar generadores de frecuencia fija y variable en hardware
    • Estudiar los contadores y sus tipos
    • Revisar la terminología empleada con las señales periódicas
    • Realizar los cálculos necesarios

Contenido

Introducción

La noción de tiempo en los circuitos digitales nace a partir de una señal periódica fundamental: el reloj del sistema. Nuestras unidades de tiempo básicas son estos ciclos del relojs del sistema

Utilizando contadores, que ya sabemos cómo implementar (un registro para guardar el estado más un circuito combinacional para calcular el estado siguiente), vamos a usarlos para crear señales periódicas de las frecuencias que necesitemos. Estudiaremos sus propiedades y cómo crear generadores de frecuencias fijas ó variables

Reloj del sistema

Los circuitos digitales funcionan a ritmo de un reloj, conocido como reloj del sistema. Es el que define la velocidad máxima a la que ocurren las cosas dentro del circuito. También nos permite medir el tiempo.

En la placa Alhambra II el reloj del sistema es de 12Mhz (Periodo de 83.3ns). Se encuentra situado fuera de la FPGA y la señal de reloj se introduce en ella por uno de sus pines, denominado CLK, al que tenemos acceso desde Icestudio, como una entrada más

En icestudio, todos los componentes que tienen una entrada de reloj, se conectan automáticamente a este reloj del sistema. Esto se indica mediante un cuadrado amarillo conectado a su entrada de reloj

El reloj del sistema es un pin más de entrada de nuestra FPGA, y lo podemos usar como cualquier otro. También lo podemos conectar manualmente a las entradas de reloj de los componentes. Estos dos circuitos son equivalentes:

El reloj del sistema nos divide el tiempo de unidades discretas que llamamos ciclos. Un ciclo es el tiempo que hay desde un flanco de subida al siguiente. Para el caso de la placa Alhambra II los ciclos son de 83.3ns

Pulsos y tiempo

Definimos un pulso como una señal que está activa durante un tiempo, y luego se desactiva. Es decir, que inicialmente está en reposo (0), luego se activa (1), permanece activada durante un tiempo y finalmente se vuelve a desactivar, volviendo al estado inicial de reposo

Los pulsos tienen un flanco de subida inicial y un flanco de bajada final

El pulso más pequeño posible es el que tiene una anchura de 1 ciclo, y lo denominamos tic. Es la señal que usamos para comunicar que ha ocurrido un evento: pulsación de un botón, cambio en un sensor, comienzo de un periodo...

Muchos componentes generan a su salida un tic. Esto se indica mediante el símbolo de un pulso dentro de un círculo. Por ejemplo el componente Button-tic de la colección iceInputs. Por su salida press se emite un tic cada vez que se aprieta el pulsador

Contadores

Los contadores son circuitos digitales que incrementan su valor cuando ocurre un evento. Los utilizamos para contar eventos, como por ejemplo las veces que se ha apretado un pulsador, o los pulsos recibidos de un encoder, y también para medir el tiempo transcurrido o la duración de un pulso

Contadores de eventos

Estos contadores tienen una entrada cnt por la que llega un tic. Cada vez que se recibe un tic se incrementa el contador en una unidad. La salida max se pone a 1 cuando se ha alcanzado su valor máximo, y al recibir el siguiente tic volverá a comenzar desde 0

Ejemplo 1: Contador manual de 2 bits

El pulsador SW1 está conectado a la entrada. Cada vez que se aprieta el pulsador el contador se incrementa. La salida de 2 bits está conectada a los LEDs 0 y 1. Y la salida max está conectada al LED7

(01-contador-2bits-LEDs.ice)

Contadores módulo M

Un contador de n-bits pasa por un total de 2 elevado a N estados. Así, un contador de 2 bits produce 4 valores de salida, desde el 0 hasta el 3 (Nos permite contar hasta 4 eventos). Un contador de 3 bits produce 8 valores, desde el 0 hasta el 7... En general un contador de n bits cuenta desde el 0 hasta el número 2 elevado a n, menos 1

Un contador módulo M es el que cuenta desde 0 hasta M-1 y vuelve a comenzar. Por ejemplo, un contador módulo 5 realiza la cuenta: 0,1,2,3,4,0,1,2,3,4,0...

Los contadores módulo M tienen una entrada denominada max por donde se introduce el valor máximo que puede alcanzar el contador. Por ejemplo, si introducimos el valor 5, se trata de un contador módulo 6 (cuenta desde 0 hasta 5, un total de 6 valores)

Ejemplo 2: Contador manual módulo 3

Este es un ejemplo de un contador mánual que cuenta hasta 2 y vuelve a empezar: 0,1,2,0,1,2,0... Se introduce la constante 2 por su entrada max para establecer el valor máximo del contador

Cuando el contador alcanza el valor máximo 2, se enciende el LED 7

Contadores con Reset

Los contadores también tiene una entrada de reset opcional, que cuando se pone a 1 hace que el contador se inicialice a 0

Ejemplo 3: Contador módulo 6 con reset

Este es un contador que va desde 0 hasta 5 y vuelve a comenzar, contando cada pulsación del botón. Al apretar el pulsador SW2 (reset), se inicializa a 0

(03-contador-Modulo-6-rst.ice)

Contadores del sistema

Los contadores más básicos son los contadores del sistema. No tienen entrada de cnt, sino que se incrementan con cada ciclo de reloj del sistema. Al llegar al valor más alto vuelven a comenzar desde 0. Pueden tener también opcionalmente la entrada de reset

¿Qué ocurre si conectamos un contador del sistema directamente a los LEDs? El contador va tan rápido que no lo vemos parpadear. Simplemente veremos los LEDs encendidos

Ejemplo 4: Contador del sistema de 3 bits conectado a los LEDs

Los LEDs 0, 1 y 2 están encendidos, aunque con una intensidad menor que cuando se encienden directamente con la constante 1. El LED7 está también encendido pero con una intensidad menor. La señal max se enciende con menor intensidad (porque su ciclo de trabajo es 1/8, frente a 1/2 del resto de LEDs)

Señales del contador

Se trata de un contador de 3 bits, que sigue la siguiente tabla de verdad:

C2 C1 C0 Max
0 0 0 0
0 0 1 0
0 1 0 0
0 1 1 0
1 0 0 0
1 0 1 0
1 1 0 0
1 1 1 1

Si representamos la señales, siguen los siguientes patrones, que se repiten periódicamente cada 8 ciclos de reloj

Las señales del contador C0, C1 y C3 tienen frecuencias que son divisores de las frecuencia del reloj del sistema: F/2, F/4 y F/8 respectivamente

Se define el ciclo de trabajo de una señal periódica como el tiempo que la señal está activa dividido entre el periodo. Las señales C0, C1 y C2 tiene ciclos de trabajo de 1/2, mientras que la señal MAX lo tiene de 1/8

El ciclo de trabajo nos indica la cantidad de potencia por periodo que se transmite, o lo que es lo mismo, la potencia media que transporta. Por eso la señal MAX se ve más tenue en los LEDs, mientras que C0, C1 y C2 se ven todas iguales

Observando las señales

¿Cómo podemos saber que el contador del sistema está funcionando correctamente? Tenemos que observar las señales. En general, esto lo hacemos sacando las señales del contador por pines externos y realizando mediciones con un analizador lógico

Modificamos los pines del ejemplo 4 para sacar las señales del contador por los pines D0-D2,y la señal Max por D3:

Y ahora conectamos esos pines a los 4 canales de un analizador lógico. Este es el escenario

Y esta es la medición realizada. Vemos que efectivamente las señales tienen la forma que deberían tener. La frecuencia de la señal del bit bajo del contador (D0) es de 6Mhz

LEDoscopio

Sin embargo, no es necesario disponer de un analizador lógico externo para medir nuestro contador. Podemos crear nuestros propios circuitos de medición dentro de la FPGA. Uno de ellos es el LEDoscopio: un mini-analizador lógico de un canal que muestra el estado de la señal durante los 8 primeros ciclos de reloj

Cada uno de los LEDs muestra el estado de la señal en su ciclo correspondiente: el LED0 es el ciclo 0, el LED1 el ciclo 1... y el LED7 el ciclo 7

Ejemplo 6: Midiendo el contador del sistema

Para medir el contador del sistema basta con elegir la señal, como por ejemplo C0, introducirla por la entrada del LEDOscopio y ver el resultado en los LEDs

Esto es lo que obtenemos en los LEDs: el patrón 01010101 que se corresponde con la señal C0

Conectando la etiqueta ch a las otras señales podemos comprobar que se comportan como las teóricas

Ejemplo 7: Midiendo varios canales

Si queremos medir varios canales a la vez podemos colocar los LEDOscopios en paralelo. Como sólo tenemos 8 LEDs para visualizar un canal, usamos un multiplexor de 8 bits y un pulsador para seleccionar los canales

En este ejemplo medimos las 4 señales del contador del sistema de 3 bits. Con el pulsador SW1 seleccionamos el canal a visualizar

En los LEDs vemos las 4 señales

Generador de frecuencia fija

Para controlar nuestros circuitos es fundamental tener componentes que nos permitan obtener una señal digital de una frecuencia determinada. Los denominamos generadores de frecuencia. Algunas de las aplicaciones son:

  • Teporizaciones: Medir cuánto dura una acción o la implementación de relojes, alarmas o cronómetros
  • Señales de refresco: Ciertos dispositivos necesitan que se realice una acción a una frecuencia determinada, como por ejemplo la sincronización de los monitores para visualizar la información, o el refresco de los servos
  • Transisión de datos: Las transmisiones se realizan a velocidades específicas: 9600 baudios, 115200 bps, 1Mbps... Para realizarlas hay que generar señales a esas frecuencias
  • Tonos audibles: Por ejemplo para generar tonos de las notas musicales (para sintetizar música digital)

Señales normalizadas

Cuando hablamos de frecuencia de una señal nos estamos refiriendo a su frecuencia fundamental. Se trata de una señal que se repite con periodo T. En nuestro caso estamos trabajando con señales de 1 bit, por lo que serán siepre señales cuadradas. La anchura de los pulsos NO INFLUYE en la frecuencia fundamental. Así, las siguientes señales tienen todas la misma frecuencia (el mismo periodo T de repetición), aunque los pulsos tengan diferentes anchuras:

Dado que las anchuras pueden ser cualesquiera, en nuestros componenes utilizaremos señales normalizadas en las que los pulsos son tics. Es decir, son pulsos de longitud 1 ciclo

Si normalizamos las señales de la figura anterior, obtenemos la misma señal que contiene la esencia de la temporización. Su periodo es el mismo: Ts, pero ahora los pulsos son tics

La frecuencia también es la misma con independencia de la posición del tic (fase de la señal). El tic puede estar al comienzo, al final, o en cualquier otra parte. No afecta al periodo de la señal

Estructura del generador de frecuencia

Un generador de frecuencia F se implementa usando un contador módulo M del sistema, utilizando la salida max para obtener la señal. El módulo del contador (M) es el divisor. La señal de salida tiene una frecuencia dada por Fs = F/M, donde F es la frecuencia del reloj del sistema y M el módulo del

El valor máximo de entrada siempre es el módulo - 1: max = M - 1

La mayoría de las veces es más fácil pensar en periodos que en frecuencia. Visto de esta forma, el periodo de la señal de salida es igual al módulo multiplicado por T: Ts = T*M. Es decir, que el módulo M es el PERIODO EN CICLOS

La señal de salida siempre será una señal normalizada que tiene un periodo de M ciclos

Si por ejemplo utilizamos un contador módulo 3, obtenemos una señal de salida de frecuencia Fs = 12/3 = 4Mhz

Cálculos a realizar

Si queremos construir un generador de frecuencia dada Fs, necesitamos determinar sus dos parámetros:

  • El módulo del contador (M)
  • El número de bits del contador (N)

Los pasos a seguir son los siguientes:

  1. A partir de Fs obtenemos M mediante la ecuación: Fs = F/M, donde F es la frecuencia del sistema (12Mhz en nuestro caso). Despejando M tenemos que M = 12000000/Fs (Donde Fs está dada en Hz). El módulo M ES UN NUMERO ENTERO. Por lo que es necesario RENDONDEAR la operación. Esto introducirá errores (es decir, que no podremos generar siempre las señales de una frecuencia exacta)

  2. Obtener el valor máximo del contador: Siempre será M-1

  3. Obtener el número de bits del cotnador (N): Es el número de bits necesarios para poder almacenar el valor máximo. Esto se puede calcular por aproximación o bien utilizando la fórmula: N = ceil(log2(M-1)). Donde ceil es la función que devuelve el número entero mayor a la cantidad dada. (Ej. ceil(3.4)=4)

A partir de M y N ya podemos hacer nuestro circuito. Por la salida max del contador tendremos nuestra señal de frecuencia Fs

Ejemplo 8: Señal de 3Mhz

Diseñar un generador de señal de 3Mhz. Hacemos los cálculos:

  • M = 12/3 = 4. Módulo del contador: 4
  • Valor máximo: M-1 = 3
  • Número de bits para representar el número 3: 2 bits

Necesitamos un contador del sistema módulo 4, de 2 bits,inicializado con el valor máximo 3:

Para comprobar el resultado usamos el LEDoscopio

Ejemplo 9: Señal de 50Hz

Diseñar un generador de señal de 50Hz. Hacemos los cálculos:

  • M = 12000000 / 50 = 240000. Nuestra señal tiene un perido exacto de 240000 ciclos. Como nos ha salido que M es un número exacto, el cálculo será exacto y generaremos una señal exactamente de 50Hz

  • El valor máximo es de 240000 - 1 = 239999

  • Para Representar el número 239999 necesitamos: 18 bits. Desde python lo podemos calcular así:

import math
math.ceil(math.log2(239999))

Para nuestro circuito necesitamos un contador del sistema de al menos 18 bits inicializado con un valor máximo de 239999. En nuestro circuito hemos usado uno de 20 bits (Tiene que tener 18 ó más bits)

Este es el circuito:

Al probarlo vemos que NO SE ENCIENDE EL LED0. Tal vez esté mal el circuito.... Lo medimos con el Analizador Lógico externo:

Vemos que sí que hay señal de 50Hz (En realidad es de 20.002ms/49.995Hz, hay un error de 2ns. Es un error del 0.002%). También vemos que la señal apenas se ve. ¡Claro!. Es una señal de tics. La anchura del pulso es de 1 ciclo. NO le estamos comunicando sufiente energía para encender el LED. Esto lo solucionamos utilizando Biestables T (De cambio)

Biestables T

Los biestables de tipo T (Toggle), también llamados, biestables de cambio, cambian su estado con cada evento recibido. Tenemos de dos tipos:

  • Biestables T del sistema: Cambian con cada ciclo del reloj del sistema (son muy rápidos). En realidad se comportan como contadores del sistema de 1 bit. Su salida es el bit bajo del contador (sólo hay uno) y por tanto su frecuencia de salida es de Fsys/2, siendo Fsys la frecuencia del sistema

Su funcionamiento se puede ver en el Ejemplo 10. Al conectarse a un LEDOscopio vemos el patrón característico: 010101... un ciclo apagado, uno encencido, uno apagado, uno encendido...

  • Biestable T de eventos: Cambian su valor cuando se recibe un tic (evento) por su entrada. Nos permiten usarlos a baja velocidad. El uso típico se muestra en el Ejemplo 11: Se cambia el estado del LED cada vez que se aprieta el pulsador

Ejemplo 10: Funcionamiento del Biestable T del sistema

Para comprobar el funcionamiento colocamos un Biestable T del sistema y lo conectamos a un LEDOscopio. En los LEDs veremos la secuencia característica: 01010101...

Ejemplo 11: Funcionamiento del biestable T de eventos

En este circuito de ejemplo conectamos el pulsador SW1 a un biestable T. Al apretar el pulsador se genera un evento (tic) que hace que el biestable T cambie de estado y lo haga a su vez el LED7 al que está conectado. La primera que lo apretamos se enciende el LED (y se mantiene encendido). La segunda vez lo apaga (y lo mantiene apagado). Este ciclo se repite

Ciclo de trabajo del 50% con Biestables T

El biestable T es un divisor de frecuencia, o lo que es lo mismo, un multiplicador del periodo por 2. Como cambia de estado con cada tic, lo podemos usar para generar una señal de frecuencia mitad PERO con pulsos más grandes. En concreto con pulsos del 50%: la mitad de periodo está la señal a 0 y la otra mitad está a 1

Si por su entrada introducimos una señal de frecuencia 50Hz (cuyos pulsos son de 1 ciclo), por la salida obtenemos una señal CUADRADA de 25Hz. Esta señal, al tener un ciclo de trabajo del 50%, tiene suficiente energía para verse en los LEDs. Esto se muestra en el ejemplo 12

Ejemplo 12: Señal de 50Hz a la entrada de un biestable T

En este circuito usamos el generador de 50Hz del ejemplo 9 para introducirlo por un Biestable T y medir su señal de salida. Por un lado se envía al LED7 para comprobar si se ve o no, y por otro lado se lleva al analizador. La señal de 50Hz se lleva al canal 0 (C0) del analizador, y la salida al canal 1 (C1)

Este es el resultado que obtenemos en el analizador. Vemos la señal de 50Hz, con pulsos de 1 ciclo y cómo a la salida se obteiene la señal de 25Hz pero con pulsos de 20ms. Estos pulsos tiene mucha energía, por lo que vemos el LED7 parpadeando muy rápido

El parpadeo es apreciable porque es de una señal menor a 50Hz

Ejemplo 13: Señal de 50Hz "visible" en el LED0

¿Y cómo podemos hacer para generar una señal de 50Hz (Y no 25HZ) que sea visible en los LEDS?. Basta con utilizar una señal de entrada de 100Hz y pasarla por un biestable T. Obtendremos una señal de 50Hz a la salida (100/2) con un ciclo de trabajo del 50%

Estas son las mediciones en el Analizador. Efectivamente ahora la señal ya cumple con los requisitos: Es de 50Hz y tiene un ciclo de trabajo alto. La señal la vemos en el LED7

El LED7 sí que lo vemos, pero está todo el rato encendido. NO HAY PARPADEO. Es debido a que al ser una frecuencia de 50Hz, nuestro ojo no es capaz de percibirlo. PERO sí que es una frecuencia AUDIBLE. Si conectamos un zumbador la escucharemos

Generando tonos audibles

Los tonos audibles están en el rango de frecuencias 20Hz-20Khz. Para poder escucharlo en un zumbador hay que generar la frecuencia correspondiente con un ciclo de trabajo suficientemente alto como para que se transita la potencia necesaria para escucharlo. Si lo conectamos directamente a las señales de tics, no se escuchará nada, aunque la frecuencia sea audible

Para las pruebas utilizaremos un ciclo de trabajo del 50% y generaremos una nota con el doble de frecuencia, para que al atravesar el Biestable T se divida y se obtenga la frecuencia correcta

Así, para generar una nota de frecuencia Fn, usaremos un generador de frecuencia 2*Fn y su salida la pasaremos por un biestable T, para obtener un tono de frecuencia 2*Fn/2 con ciclo de trabajo del 50%. Esa es la señal que luego enviamos al zumbador

Ejemplo 14: Señal audible de 440Hz (LA)

Es el mismo circuito de los circuitos anteriores, pero con los cálculos rehechos para obtener la señal de 440Hz. Hay que conectar un zumbador (o altavoz) al pin D0

Generadores de frecuencia variable

Ya sabemos cómo generar señales con un periodo determinado, calculado en ciclos del sistema. No hay más que utilizar un contador del sistema módulo M e introducir por su entrada el número que nos determina por cuánto hay que dividir el reloj del sistema, como hemos hecho en los apartados anteriores

Por tanto, para tener un generador capaz de sacar varias frecuencias a su salida, sólo hay que tener precalculados estos valores de los divisores e introducirlos por la entrada max del contador

Ejemplo 15: Contador a dos frecuencias

En este ejemplo se tiene un contador que funciona a dos velocidades diferentes (dos frecuencias) precalculadas a priori. Se conmuta entre ellas apretando el pulsador SW1

Ejemplo 16: Usando tablas para almacenar los divisores

Si se necesitan utilizar más frecuencias, es más cómodo colocar los valores de los divisores en una tabla. Usamos un contador para indicar la fila de la tabla que contiene el divisor a usar

En este ejemplo se utilizan 8 frecuencias: desde 1 hasta 8Hz. Los valores de los divisores se han precalculado y están guardados en la tabla. Con el pulsador seleccionamos la siguiente frecuencia

¡A practicar!

Reto 1: Generar notas musicales

Haz los cálculos necesarios para implementar 8 generadores de las frecuencias correspondientes a las notas do-re-mi-fa. Prueba los generadores de manera independiente

Reto 2: Tocar la escala musical

¿Serías capaz de hacer un circuito que toque las 4 notas musicales anteriores una a continuación de la otra? Cada nota debe durar 1 segundo y luego pasar a la siguiente.

Pista: Pon los 4 generadores en paralelo y usa un multiplexor de 4 a 1 para seleccionar entre ellos

Autores

Licencia

Créditos

TODO

Enlaces

Clone this wiki locally