CT13: Señales periódicas y temporización - Obijuan/Cuadernos-tecnicos-FPGAs-libres GitHub Wiki
Descripción
Estudio de las señales periódicas, clasificación y generación desde los componentes de más bajo nivel. Las señales periodicas son esenciales para la generación de temporizaciones
Historial
- 2022-Dic-27: Version inicial del cuaderno técnico
- 2024-Mayo-22: Ejemplos adaptados a la nueva toolchain: apio-0.9.4. Eliminado el error en la verificación. Probados con icestudio 0.12. Los pantallazos de los ejemplos no se han actualizado todavía
Icestudio
Todos los ejemplos se han probado con Icestudio 0.12. Usa esta versión o superior
Colecciones
- iceHearts: Generadores de señales periódicas, construidos en este cuaderno técnico
- iceSignals: Bloques de temporización usados para la construcción de los generadores periódicos (corazones)
Ejemplos
Todos los ejemplos de este cuaderno técnico están accesibles en su repositorio en github
Contenido
- Introducción
- Señales periódicas para temporización
- Generadores infinitos con arranque en Ciclo 0
- Ejemplo 7: Señal periódica de T=4
- Cambiando el periodo
- Ejemplo 8: LED a dos intensidades
- Ejemplo 9: Señal con dos periodos T=2 y 4
- Ejemplo 10: Cambio entre dos periodos sin transitorio (T=2, T=4)
- Ejemplo 11: Generar alternativamente señales de periodo T=2 y T=5
- Ejemplo 12: Señal con periodo T creciente
- Generadores infinitos con reset
- Ejemplo 13: Implementación del generador infinito con reset
- El bloque Heart-sys-zero-rst
- Ejemplo 14: Probando el bloque Heart-Sys-zero-rst
- Ejemplo 15: Generador pausado durante 5 ciclos
- Señales periódicas y FASE
- Ejemplo 16: Movimiento cíclico y manual de un LED a lo largo de 8 posiciones
- Ejemplo 17: Movimiento cíclico y automático de un LED
- Función de fase
- Ejemplo 18: Función de fase: pitidos periódicos
- Diferencia de fase
- Ejemplo 19: Dos LEDs moviendose en fase
- Ejemplo 20: Dos LEDs con diferencia de fase de 90 grados
- Ejemplo 21: Dos LEDs con diferencia de fase de 180 grados
- Ejemplo 22: Dos LEDs con diferencia de fase de 270 grados
- Ejemplo 23: Dos LEDs con diferencia de fase variable
- Generador infinito con reset y diferencias de fase
- Ejemplo 24: Dos señales en oposición de fase (180 grados) con T=2
- Ejemplo 25: Cuatro señales desfasadas, con T=4
- Ejemplo 26: Dos señales desfasadas 90 grados, con T=8
- Generadores finitos
- Bloques de tiempo
- Ecuaciones para el cálculo de los ciclos
- Frecuencias del reloj del sistema de las placas de prueba
- Ejemplo 32: Circuito de referencia: Señal de 1Mhz, en ciclos
- Ejemplo 33: Señal de 1Mhz: Usando bloques ns, µs y MHZ
- Ejemplo 34: Señal de 1Khz usando bloques ms y KHZ
- Ejemplo 35: Señal de 1Hz usando bloques Hz y Sec
- Transmitiendo energía
- Generadores simplificados
- Conclusiones
- Autor
- Licencia
- Créditos y agradecimientos
- Enlaces
Introducción
Las señales periódicas son muy importantes. Nos permite hacer cosas como generar tonos de sonido, crear señales de temporización para implementar cronómetros, relojes, alarmas, sistemas de vídeo y control de periféricos, controlar la potencia que enviamos a un actuador, posicionar servos...
Las señales periódicas están formadas por patrones de bits que se repiten cíclicamente. Todos los ciclos tienen la misma duración, que denominamos periodo, y que representamos mediante la letra T
Las señales periódicas básicas están formadas por un único pulso que se repite. Estas señales tiene sólo dos parámetros: El periodo de la señal (T) y la anchura del pulso (W)
El periodo es el que lleva la información de la temporización. La Anchura es el que permite controlar la cantidad de energía a transmitir
Hablamos se señales periódicas normalizadas cuando la anchura (W) es de 1 ciclo del reloj del sistema. En estos casos, la señal está formada por tics
que se repiten. Estas son las señales que usaremos para la temporización
En este figura se muestran dos señales periódicas con el mismo periodo T, pero la inferior está normalizada (W=1)
El periodo lo medimos entre dos flancos de subida consecutivos
Señales periódicas para temporización
En las aplicaciones de temporización necesitamos medir el tiempo. Para ello usamos circuitos que generan eventos periódicos. Es decir, circuitos que generan tics
transcurrido cierto tiempo
Las señales de temporización están formadas por un tic
que ocurre al cabo de N
ciclos. Inicialmente la señal está a 0, y en el último ciclo (N-1) se pone a 1
. Este comportamiento se repite periódicamente: Son señales periódicas básicas Normalizadas
En esta figura se muestra una señal de temporización de periodo T=3 ciclos. La señal comienza en el ciclo 0. Cada 3 ciclos vemos que el patrón se repite: 001
, 001
, ...
Generando señales de temporización
Las señales de temporización tiene un comienzo. Bien puede ser un tic
de start que venga de otro circuito (un pulsador, la señal done de otro circuito...). A partir del comienzo hay dos etapas. La primera es la generación de un retraso, que debe ser igual al periodo T. Al final del retraso es cuando se produce el tic
. Con esto obtenemos un periodo de la señal. La segunda etapa consiste en repetir este perido. La repetición puede ser indefinida o bien que sólo se generen un cierto número de periodos (señal periódica finita)
Señal de periodo 2
Vamos a comenzar por la señal más básica: la que tiene periodo 2 (T=2). En esta figura está dibujada:
Vamos a irla generando progresivamente, a partir de ejemplos sencillos que nos sirven para comprender mejor las ideas
Lo primero que necesitamos es generar un retraso de 2 ciclos. Esto ya lo sabemos hacer, basta con colocar dos biestables de tipo D en cascada. Uno de estos biestables estará inicializado 1
y el otro a 0. Con esto generamos el primer periodo
Ejemplo 1: Generando un único periodo de 2 ciclos
El patrón a generar es sólo el primer periodo, es decir: 01
. En el ciclo 0 la señal debe valer 0. En el ciclo 1 pasa a 1 y en el resto de ciclos permanecerá a 0
Como es una señal muy rápida, la veremos a través del LEDOscopio. Este es el circuito:
Y en esta figura se muestra el resultado obtenido
Hemos generado el primer periodo, usando lo que ya conocíamos. El siguiente paso es generar una repetición
Observando el desplazamiento de los bits
Antes de seguir avanzando, vamos a hacer un experimento en el que veremos cómo un bit a 1 se desplaza. Los bits en los circuitos digitales se mueven físicamente,como si fuesen fichas que avanzan por las casillas de un tablero de juego, o un tren que se desplaza por los diferentes tramos de una vía del tren. En todos estos casos usamos un pensamiento espacial
Este es un esquema de nuestra tablero de juego. Supondremos que hay un tren (círculo rojo) que está situado sobre un tramo de una vía
En este ejemplo tenemos una vía formada por 5 tramos (Del tramo 0 al tramo 4). El tren se desplaza hacia la derecha. Sólo hay un tren. Y supondremos que el movimiento es discreto: el tren pasa de un tramo a otro (no puede estar en 2 tramos a la vez)
En esta figura se muestra su recorrido desde que parte del tramo 0 hasta que finaliza saliendo por el tramo 4
Este juego lo implementamos directamente en hardware de la siguiente manera. La vía la forman una serie de Biestables D en cadena. Cada biestable representa un tramo de la vía. Si ponemos 5 biestables, tendremos por tanto una vía de 5 tramos. Cada biestable se conecta a un LED para conocer su estado: 0 si está vacío (no tiene tren encima), 1 si el tren está en ese tramo
Utilizaremos un botón para incrementar el tiempo. Cada vez que lo apretemos, el tren se mueve al siguiente tramo. O lo que es lo mismo, el bit a 1 de la izquierda se desplazará al biestable de la derecha
En este figura se muestra un esquema del circuito que implementa el tablero anterior. El tren está situado en el tramo inicial, por eso el Biestable de la izquierda está inicializado a 1, y todos los demás a 0
Ejemplo 2: Movimiento de un bit por los LEDs
En este circuito se implementa el movimiento de un bit a lo largo de 8 biestables. Cada biestable está conectado a un LED para poder ver su estado
En esta animación se muestra el funcionamiento
Bucles espaciales
Supongamos ahora que queremos que un tren se ponga a dar vueltas continuamente, pasando todo el rato por los mismos tramos. Esto lo podemos hacer creando una vía de tren cerrada sobre sí misma, de forma que el extremo final coincida con el inicial
En esta figura se muestra una vía circular, compuesta por 4 tramos
El tren comienza por el tramo 0, y luego sigue por los tramos 1, 2 y 3. Del tramo 3 otra vez vuelve al comienzo, repitiendo la secuencia en un bucle: 0,1,2,3,0,1,2,3,0,1,2,3...
Esta idea de repetición la podemos representar también mediante una vía recta, pero poniendo flechas del tramo final al inicial, para indicar que ambos tramos están en realidad unidos. Así, cuando el tren abandona el tramo 3, vuelve al tramo 0
Y así es como tenemos el tren en un bucle espacial, volviendo a su posición inicial al llegar al final
Esta idea de bucle espacial la aplicamos exactamente igual a los biestables. Si unimos el último biestable (el de la derecha) con el primero (el de la izquierda), establecemos un bucle espacial, en el que el bit a 1 se queda atrapado dando vueltas en los biestables
Ejemplo 3: Bucle espacial: Moviendo LEDs
Este circuito implementa el movimiento de un bit a 1 a lo largo de 4 biestables, conectados en bucle espacial de forma que al llegar al último vuelve a comenzar por el primero
Los Biestables están conectados a 4 LEDs, por lo que podemos ver la posición del Bit. Usando un pulsador el bit pasa a la siguiente posición
(03-moviendo-bit-LEDs-loop.ice)
En esta animación se muestra el funcionamiento. El LED se está moviendo en un bucle
Ejemplo 4: Generación de la señal de sincronización periódica con T=2
Ya tenemos todos los conocomientos necesarios para generar una señal peródica de sincronización con periodo de 2 ciclos. Primero hay que generar un único ciclo, como hicimos en el ejemplo 1, y luego hay que repetirlo usando un bucle espacial: Tiramos un cable que une el segundo biestable con el primero
Lo que ocurre es que ahora el bit se mueve automáticamente, a la velocidad del reloj del sistema. Esta velocidad es MUY ALTA: 12 millones de bits por segundo. Por eso ya no lo podemos ver con los ojos. Hay que utilizar instrumentos de medida: el LEDOscopio o el Analizador lógico
Este es el resultado obtenido en el LEDOscopio:
Sólo observamos 4 periodos de la señal, en los 8 LEDs, pero la señal es indefinida
Este es el resultado en el analizador lógico
En las mediciones el analizador nos indica la duración de cada periodo: 2 ciclos
¡Hemos generado nuestra primera señal periódica!
Señal de periodo 3
Aplicando las ideas anteriores ya sabemos cómo generar una señal de periodo 3: utilizamos 3 biestables D en cadena para generar un retraso de 3 ciclos y luego usamos un bucle espacial para repetir ese retraso y obtener la señal periódica
Ejemplo 5: Generación de la señal de sincronización periódica con T=3
Este es el circuito que genera una señal periódica de periodo igual a 3 ciclos:
Al cargarlo en la placa esto es lo que se observa en el LEDOscopio
Y esta es la señal medida con el Analizador lógico
Vemos que efectivamente es una señal de 3 ciclos de periodo
Señal de periodo N
Para generar una señal periódica de N ciclos de periodo, podríamos encadenar N Biestables. Sin embargo, para hacerlo más óptimo, utilizaremos el bloque Sys-Delay-xN, y conectamos su salida done
con la entrada, para realizar el bucle espacial
Con esto ya podemos generar señales periódicas de cualquier periodo
Ejemplo 6: Generando una señal de periodo 12
Este es el circuito. En el instante inicial se introduce un tic que activa el temporizador, con un retraso de 12 ciclos. Transcurrido ese tiempo el temporizador se vuelve a activar a través del bucle espacial. Así es como se genera la señal periódica
Ahora ya no podemos ver la señal con el LEDOscopio, hay que usar el Analizador lógico:
Tipos de generadores
Los generadores son los circuitos que producen las señales periódicas básicas normalizadas. Hay de diferentes tipos:
- Infinitos: Arrancan en el ciclo 0 y duran hasta el final
- Infinitos con arranque: Tienen una entrada de
start
para arrancarlos. Una vez que lo hacen ya no paran nunca - finitos: Inicialment están parados. Se pueden arrancar y parar
En las próximas secciones los estudiaremos en detalle
Generadores infinitos con arranque en ciclo 0
El generador más básico es el que arranca automáticamente al alimentar el circuito (arranca en el ciclo 0) y nunca para: Está todo el tiempo emitiendo una señal de periodo T. El periodo está dado en Ciclos del reloj del sistema
Es el componente Heart-sys-zero que se encuentra en la colección iceHearts. Como icono se utiliza un Corazón, para indicar que es un componente que Bombea tics (un tic cada periodo)
Por su entrada T se introduce el periodo (en ciclos) de la señal a generar. Al ser una entrada, podemos modificar su periodo. Esto nos permite emitir señales periódicas infinitas, con diferentes periodos.
Sin embargo, al cambiar el periodo se produce un transitorio que según la aplicación puede no ser deseable. Para que el cambio de periodo se efectúe correctamente, sólo se debe hacer cuando la señal out esté a 1 (es decir, cuando se ha completado un periodo)
La señal periódica normalizada sale por la salida out
: Se produce un tic al final del periodo. Además, por la salida n
se saca el número de ciclo actual, que va desde 0 (Comienzo del periodo) hasta T-1
(Final del periodo). Y por último tenemos la señal de busy
que indica que el generar está funcionando. En realidad, como se trata de un generador infinito está señal está siempre a '1' salvo en el ciclo 0, que es cuando se recibe el tic de arranque, y el generador no arranca hasta el ciclo 1. Pero esta señal se deja para que sea compatible con el resto de generadores (inifinitos o no)
En los ejemplos utilizaremos un Corazón de 32 bits, que nos permite representar un rango muy amplio de periodos. Si se quiere optimizar el tamaño del diseño, basta con usar un corazón con menos bits. Este número viene determiando por el periodo máximo (T) que se quiere generar
En esta figura se muestra el cronograma de un generador infinito de periodo 4 ciclos (T=4)
Vemos como NO arranca en el ciclo 0, sino en el 1 (Ya que en el 0 es donde se genera el pulso inicial de arranque). La señal de busy
se pone a 1 en el ciclo 1. La salida n
toma los valores 0,1,2 y 3 para cada periodo
Ejemplo 7: Señal periódica de T=4
En este ejemplo se usa el bloque Heart-sys-zero
para generar una señal periódica de T=4 ciclos. Las señales se miden con el analizador lógico y con el LEDOscopio
Estas son las medidas realizadas con el Osciloscopio de 16 bits, de las señales busy
y out
. Como es un LEDoscopio de 16 bits, los resultados se muestran en 8 leds en dos páginas. Mediante el pulsador SW1
se cambia de una página a la siguiente
En este dibujo se muestran las medidas con el Analizador lógico
Cambiando el periodo
En muchos circuitos necesitaremos generar una señal de frecuencia fija. En esos casos usamos una constante que introducimos por la entrada T del generador, como hemos visto en el Ejemplo 7. Esta operación es segura, porque es un número que nunca cambia
En otros circuitos nos puede interesar que se generen diferentes frecuencias. Esto lo logramos cambiando el valor T de la entrada del generar, pero NO SE PUEDE HACER en cualquier momento, o de lo contrario obtendremos transitorios y efectos no deseados
Ejemplo 8: LED a dos intensidades
Vamos a generar una señal periódica en la que haya dos periodos diferentes: uno de T=2
, y otro de T=4
. Para comprobar su funcioanndo conectamos la señal de salida al LED0. Cuando la señal es de periodo 2 ciclos, su ciclo de trabajo es del 50%: Es decir, durante la mitad del tiempo el LED está encendido y durante la otra mitad apagado. El resultado es que lo vemos lucir con la mitad de intensidad
Cuando se envía la señal T=4, ahora el ciclo de trabajo es del 25%. El led está encendido durante 1 ciclo, pero está apagado durante 3. Por ello la intesidad que se aprecia es menor
Al apretar y soltar el pulsador vemos cómo la intesidad del LED cambia. En esta animación se muestra su funcionamiento
Como el ejemplo funciona a "velocidad humana", efectivamente vemos que hay 2 intensidades diferentes, pero no sabemos si hay transitorios. La transición de una señal a otro no sabemos cómo se ha realizado, y si entre medias han aparecido señales de otros periodos diferents a 2 y 4
Ejemplo 9: Señal con periodos T=2 y 4
En este ejemplo vamos a ver lo que ourre al realizar la transición de T=4
a T=2
. Primero se emite un periodo con T=4. Dos ciclos después de haber terminado, cambiamos a T=2.
(09-senal-transitorio-T4-T2.ice)
En el cronograma sólo deberíamos ver dos periodos: inicialmente de 4 y luego a 2. Sin embargo vemos que hay un transitorio: aparece un periodo de 3
Según la aplicación, el transitorio puede molestar o no. Si queremos que la transisión sea limpia, sin transitorios, sólo se puede cambiar el periodo de la señal cuando haya finalizado el periodo actual: es decir, cuando la señal out
del generador esté a 1
Ejemplo 10: Cambio entre dos periodos sin transitorio (T=4, T=2)
En este circuito se ha solucionado el problema anterior del transitorio. Al terminar el periodo con T=4, se captura el siguiente periodo
Debido a ello, la transición de la señal con T=4 a la señal T=2 se hace limpiamente, sin transitorios. Sólo hay señales de periodos T=4 y T=2
Ejemplo 11: Generar alternativamente señales de periodo T=2 y T=5
En este ejemplo se generan dos señales alternativamente, de periodos T=2 y T=5. Sólo se saca un periodo de cada señal: Primero un periodo de 2 ciclos, luego de 5, luego otra vez de 2, luego de 5...
La clave para cambiar de un periodo a otro es usar la señal out del generador que indica que el periodo actual ha concluido. En ese momento es cuando se puede conmutar al siguiente periodo. Se utiliza un biestable T que conmuta entre los periodos de 2 y 5
(11-senal-cambio-alternante-T2-T5.ice)
Este es el resultado mostrado en el Analizador lógico:
Se comprueba cómo efectivamente se obtienen señales con periodos de 2 y 5 ciclos, alternativamente, y sin transitorios. El primer ciclo es de periodo 2, aunque el analizador no lo detecta (al ser el primero no tiene referencia para calcularlo). Pero vemos que tarda 2 ciclos desde que aparece la señal de arranque (start)
Ejemplo 12: Señal con periodo T creciente
En este ejemplo se genera una señal que empieza con periodo T=2
ciclos, luego cambia a T=3
, luego T=4
, etc... Cada nuevo periodo tiene un ciclo más de duración que el anterior, hasta llegar a T=10
, donde vuelve a comenzar
Se utiliza un contador que empieza en 2 y tiene un valor máximo de 10. La clave está en que este contador, que determina el periodo, sólo se puede incrementar cuándo haya terminado el periodo en curso. Es decir, se incrementa cuando llega un tic por la señal out
(12-senal-periodo-incremental.ice)
Este es el resultado observado en el analizador lógico:
Efectivamente se ve como cada periodo tiene los valores 2, 3, 4... hasta llegar a 10, y se vuelve a comenzar. La transición es limpia, y no hay transitorios
Generadores infinitos con reset
Los generadores infinitos arrancan en el ciclo 0. Si tenemos varios, siempre estarán en fase. La señal de reset nos permite inicializarlos, de manera que vuelven a su estado original y comienzan como si fuese el ciclo 0
Gracias a esto, podemos resincronizar los generadores en cualquier momento, y establecer diferencias de fase entre ellos
En importante recordar que la señal de reset provoca un cambio brusco: El generador abandona su estado actual y pasa de manera abrupta a su estado inicial. Por ello, en la salida out puede haber transitorios. Sin embargo, la idea de usar el reset es justo esa: Hacer un borrón y cuenta nueva. Da igual lo que haya pasado antes del reset. A todos los efectos será como si el circuito arrancase desde el principio
Ejemplo 13: Implementacion del generador infinito con reset
Implementamos el generador a partir de un contador con reset. Como es un generador infinito, arranca en el ciclo 0 y su estado es siempre encendido. La señal de reset lo lleva a su estado inicial, pero NO LO APAGA. Un generador infinito, por definición, siempre está funcionando
En este ejemplo se genera una señal periódico de T=5
. Al apretar el pulsador SW1
se reinicia el generador, con lo cual comienza de nuevo con el periodo 0
(13-Implementacion-generador-inf-rst.ice)
El contador es módulo 5. Cuando su cuenta llega a 4, se activa la señal max
para indicar que ha alcanzado su valor máximo, y esta señal es la que reinicia el contador. El estado del contador se pone a ON
en el ciclo inicial, y nunca se apaga
Cuando se activa la señal de rst
el contador se inicializa, y se vuelve a generar el periodo 0. En esta figura se muestra el resultado en el analizador lógico
Antes del reset el generador funcionaba, emitiendo periodos de 5 ciclos. Al recibir el reset el generador se reinicia, y comienza a generar el periodo 0. Sin embargo, como el reset se ha hecho antes de concluir el periodo, el resultado es que aparece un transitorio, que tiene un periodo de 9 ciclos
Esto NO es un problema, ya que es justo lo que se quiere. Nos olvidamos de la señal anterior al reset, y comenzamos de nuevo al recibir el reset
El bloque Heart-sys-zero-rst
El bloque Heart-sys-zero-rst es similar al Heart-sys-zero pero con la entrada de rst
. Es un generador infinito con reset
Mientras la señal de reset esté a 1, el generador permanece (encendido) en el estado inicial. Su salida será 0. Cuando rst
vuelve a 0, el generedor continúa su incremento de ciclos
Ejemplo 14: Probando el bloque Heart-sys-zero-rst
Es un ejemplo similar al 13. Se genera una señal de periodo T=7
. Al apretar el pulsador SW1
se reinicia el generador
(14-probando-bloque-heart-sys-zero-rst.ice)
Esto es lo que se captura en el analizador lógico
Ejemplo 15: Generador pausado durante 5 ciclos
Un tic por la señal de reset hace que el generador se reinicie. Pero si se introduce un pulso de N ciclos, el generador estará pausado durante N ciclos, y luego continua. En este ejemplo hay un generador de T=2
. Cuando se aprieta el pulsador SW1
se genera un pulso de reset de 5 ciclos, que hace que el generador esté parado durante eso ciclos, para comenzar con el periodo 0
(15-Generador-pausado-durante-5-ciclos.ice)
Esto es lo que se captura con el analizador lógico:
Señales periódicas y FASE
Antes de seguir con la construcción de nuestros generadores de señales periódicas, tenemos que entender este concepto fundamental: LA FASE de una señal periódica
La Fase es un concepto espacial, por ello vamos a volver a nuestro ejemplo de las vías del tren. Como estamos trabajando con señales periódicas, sabemos que esto se corresponde con vías circulares, en las que el tramo final está conectado con el tramo inicial, formando un bucle espacial
Supongamos que nuestro circuito ferrovial está formado por 8 tramos iguales, denominados desde el Tramo 0 hasta el Tramo 7, dispuestos según una trayectoria circular en sentido antihorario
En un instante determinado, el tren sólo puede estar en uno (y sólo uno) de los tramos (no puede estar entre dos tramos, ni en dos tramos diferentes). Es la fase (o tramo). En este ejemplo el tren sólo puede estar en 8 fases diferentes (o tramos), numeradas desde la fase 0 hasta la fase 8
La vía circular la podemos expresar como una circunferencia que está dividida en 8 sectores. Por ello la fase la expresamos en grados. Cada tramo ahora se corresponde con un ángulo (su fase)
El tren está en la fase 0 (0 grados), y se mueve hacia las fases de 45 grados, 90 grados, 135 grados... 315 grados que se corresponden con los tramos 0, 1, 2, 3.... hasta el 7
La fase se expresa en grados, y en ella está implícita la idea de algo circular, que gira volviendo siempre al mismo punto de comienzo. La fase en grados se calcula con la siguiente fórmula:
Aunque en muchas ocasiones, cuando estemos expresando ideas, utilizaremos como la fase el número que describe su posición (Ej. tramo). Así, a veces hablaremos de la fase 0, fase 1, fase 2... refiriéndolos a los distintos estados en los que puede estar mi sistema
Ahora bien, este concepto de fase es más profundo. La fase implica algo cíclico, que gira, pero no tiene necesariamente que ser algo periódico. El "tren" puede comenzar en la fase 0 (tramo 0) y permanecer ahí todo el tiempo necesario. La transición al resto de fases está determinado por eventos genéricos, que pueden ser no periódicos
En los siguientes apartados veremos algunos ejemplos
Ejemplo 16: Movimiento cíclico y manual de un LED a lo largo de 8 posiciones
Este es el mismo ejemplo 3 en el que un LED se desplaza cíclicamente cada vez que se aprieta el pulsador SW1
. Ahora utilizamos 8 LEDs. Y en realidad lo que está ocurriendo es que el pulsador es el evento que provoca el cambio de fase. Es un cambio de fase manual, y por tanto, no tiene por qué se periódico (no tiene por que tardar el mismo tiempo en dar las vueltas). Pero sí es cíclico (hay un bucle espacial)
(16-movimiento-ciclico-8-LEDs.ice)
La velocidad a la que se mueve el LED es externo a la fase. Depende del evento de transición, que en este ejemplo es el pulsador
Ejemplo 17: Movimiento cíclico y automático de un LED
En este ejemplo usamos un corazón para generar el evento de transición de la fase, lo que provoca que el LED se mueva a la velocidad de un bit cada medio segundo. El LED ahora sí que produce un movimiento periódico. Pasa por el mismo LED cada 1/2 s * 8 = 4 segundos
(17-movimiento-ciclico-automatico-8-LEDs.ice)
Función de fase
Sobre este espacio de la fase, definimos una función que vale 1 para una fase determinada, y 0 para el resto. Es la que denominamos función canónica de fase. En el ejemplo del tren, sería como si sonase un silbato corto (bip) cada vez que el tren pasase por uno de los tramos, y no sonase en el resto. Si el tren se mueve a velocidad constante, escucharíamos pitidos periódicos: bip, bip, bip...
Ejemplo 18: Función de fase: Pitidos periódicos
Este es un circuito ejemplo en el que se reproducen pitidos periódicos. El LED se mueve cíclicamente por las 8 posiciones. Al llegar a la posición 7, se emite un pitido
(18-Funcion-fase-pitido-8-posiciones.ice)
Diferencia de fase
Cuando tenemos dos funciones de fase diferentes, como por ejemplo dos trenes en dos vías independientes, usamos el concepto de diferencia de fase para expresar el movimiento relativo entre ambos. Con la diferencia de fase sabemos si los dos trenes se mueven exactamente por los mismos tramos (en fase) o si uno de ellos está adelantado o atrasado con respecto al otro
Supongamos que tenemos dos vías circulares de 4 tramos (T=4). Ambos trenes comienzan en el mismo tramo (0) y sus transiciones de fase se realizan a la vez. Entonces, ambos trenes se mueven igual. Diremos que están en fase. Esta idea se muestra en esta animación:
Uno de los trenes puede ir adelantado con respecto a otro, aunque se siguen moviendo a la misma velocidad. La cantidad de tramos de vía que los separa es la diferencia de fase. En esta animación vemos que el primer tren tiene una diferencia de fase de 90 grados. Está adelantado 90 grados con respecto al segundo tren
Cuando un tren está en el tramo 1, el otro está en el 0. Cuando el primero avanza al 2, el otro lo hace al 1... Siempre uno va un tramo más adelantado que otro
En esta animación se muestra un ejemplo de oposición de fase: que se produce cuando la diferencia de fase es de 180 grados
Un tren puede estar también retrasado con resto a otro. En esta animación el primero tiene una diferencia de fase de 270 grados (que es lo mismo que de -90 grados)
Ejemplo 19: Dos LEDs moviéndose en fase
La diferencia de fase se entiende muy bien haciendo ejemplos con sonidos y visualizando la fase en los LEDs. Utilizaremos dos vías de tren rectas, conectadas en bucle, con 4 tramos. Es decir, T=4
. La primera vía la conectamos a los LEDs 0,1,2 y 3. Y la segunda a LED4, LED5, LED6 y LED7
Cuando el tren (LED encendido) llegue al tramo 3 (LED3 de la vía y LED7 de la vía 2), se emitirá un pitido corto. Para distinguir las dos vías, usaremos las frecuencias de 1Khz y 2Khz. Necesitaremos, por tanto, conectar 2 zumbadores en paralelo
En este primer ejemplo, ambas señales están en fase. Es decir, que su diferencia de fase es 0. Esto significa que los dos LEDs se mueven en las mismas posiciones y ambos pitidos sonarán a la vez
(19-Dif-fase-0-sonidos-LEDs.ice)
Se utilizan 4 biestables D con reset para cada trayecto del tren-LED, conectados en cascada. El último está conectado mediante un bucle espacial al primero. Cuando se pone a 1 este último tramo, es cuando se emite el pitido correspondiente
Los trenes-LEDs se mueven cuando se produce un evento de cambio de fase, que en este caso se corresponde con un tiempo de medio segundo. Al utilizar la placa Alhambra II, sabemos que 12 millones de ciclos son iguales a 1 segundos, por tanto, su mitad (12000000/2) se corresponde con medio segundo
Al apretar el botón de SW1
ambas trenes-leds se llevan a su estado inicial (tramo 0)
El resultado se pueder ver y escuchar en este vídeo corto de Youtube:
En este dibujo se muestran las posiciones de ambos LEDs con el tiempo, para las dos vías. En la Alhamra II se ven ambos recorridos uno a continuación del otro, pero en este dibujo se muestran uno encima del otro para apreciar mejor su movimiento relativo
Ambas llegan a la vez al último tramo, que es donde emiten sus pitidos correspondientes, de 1Khz (pooo) y 2Khz (piii) respectivamente
Ejemplo 20: Dos LEDs con diferencia de fase de 90 grados
En este ejemplo partimos del circuito anterior, en el que los dos LEDs estaban en fase, y aplicamos un retraso para que el segundo tren vaya una unidad de tiempo por detrás. Como T=4
, cada unidad se corresponde con 90 grados de fase
Al arrancar (o al apretar el pulsador SW1
para hacer reset), se inicializan ambos trenes, llevándose al primer tramo. Pero la señal de reset del segundo tren se mantiene a 1 hasta que llegue el siguiente evento de cambio de fase ev
. Durante este tiempo el segundo tren-LED permanece en el tramo 0
Cuando llega el primer evento (t=1), el primer tren pasa al siguiente tramo, pero el segundo sigue en el inicial. Su señal de reset rst2
ahora ya está a 0, por lo que podrá avanzar en los siguientes cambios de fase
En resumen: Ahora los trenes-leds no arrancan en el mismo instante, sino que uno está retrasado una unidad de tiempo. El tren 2 Arranca una unidad de tiempo más tarde que el primero
(20-Dif-fase-90-sonidos-LEDs.ice)
El circuito es similar al anterior, pero ahora no se usa la misma señal de reset para iniciar las dos vías, sino que el rst2
está retrasado una unidad de tiempo. Eso se consigue conectando un Biestable D con entrada de Load, inicializado a 1. La salida de este biestable se conecta al reset de las vías del tren 2
De esta forma, al realizarse la inicialización (donde también se incluye el arranque del circuito), el cable rst1
arranca la vía 1, y una unidad de tiempo más tarde se arranca la vía 2
En este vídeo de Youtube se muestra el funcionamiento
Y en este dibujo se muestran las posiciones de los LEDs tras una inicialización
Al apretar el pulsador SW1
ambos LEDs-trenes se llevan al tramo 0. Este es un estado temporal, que se produce sólo en la inicialización, y que luego no forma parte de los estados que se repiten cíclicamente
En el siguiente instante (t=1), el LED de la vía 1 avanza una posición, PERO el LED de la vía 2 sigue todavía en estado de reset, por lo que permanece en el tramo 1. A partir de ahí, ya los dos LEDs avanzan a la misma velocidad
Ahora el primero en alcanzar el tramo 3 es el superior, y se emite un pitido grave (pooo). En el siguiente instante es el segundo LED el que llega a la derecha, emitiendo ahora un pitido agudo (piii)
Ejemplo 21: Dos LEDs con diferencia de fase de 180 grados
En este ejemplo hacemos que la diferencia de fase de las dos señales sea de 180 grados (lo que llamamos oposición de fase). Como T=4
, el desfase de 180 grados se obtiene en dos unidades de tiempo. Por ello, para desfasar 180 grados hay que retrasar la señal de reset 2 unidades de tiempo
El circuito es similar al anterior, pero añadiendo otro Biestable D en cascada con el anterior, logrando así que la señal rst2
se retrase las dos unidades necesarias
(21-Dif-fase-180-sonidos-LEDs.ice)
En este Vídeo de Youtube se muestra su funcionamiento
Este es el dibujo que muestra el movimiento de los LEDs
Al hacerse el reset se comienza en el mismo estado que el ejemplo anterior: los dos LEDs-trenes están en el tramo 0. A partir de ahí el primer LED comienza a desplazarse hacia la derecha, una posición por unidad de tiempo. Sin embargo, el segundo LED permanece en el tramo 0 (porque su señal de reset está a 1)
En el instante (t=2) el LED 1 ha avanzado dos posiciones, pero el LED 1 está todavía en el tramo 0. En el siguiente instante (t=3) los dos LEDs avanzan una posición (la señal de reset 2 está a 0). El primer LED ha llegado a la derecha, por lo que se emite un pitido grave (pooo). En el siguiente instante los LEDs siguen avanzando. Después el LED 2 llega a la derecha y se emite el otro pitido (piiii)
A continuación se vuelve al mismo patrón que había en t=2
y se repite el eiclo. El patrón es pooo, silencio, piii, silencio...
Ejemplo 22: Dos LEDs con diferencia de fase de 270 grados
Cuando la diferencia de fase es mayor de 180, el tren 2 va por delante del tren 1: Decimos que está adelantando. Una vez alcanzado el régimen permanente, primero se escuchará el pitido agudo (piii) y a continuación el pitido grave (poooo)
Estas diferencias de fase se suelen expresar como un número negativo. Así, el desfase de 270 grados es en realidad de -90 grados: El tren 2 va una unidad de tiempo por delante del primero, o el tren 1 está retrasado 90 grados con respecto al 2
Para crear este desfase podríamos añadir otro biestable D en cascada, sin embargo vamos a resolverlo en un caso más general: añadiendo un contador de 2 bits. Esta solución engloba a las anteriores. Ahora basta con indicar el desfase en unidades de tiempo: 0, 1, 2 ó 3
(22-Dif-fase-270-sonidos-LEDs.ice)
Cuando se realiza el reset, el contador se inicializa a cero, y empieza a contar unidades de tiempo. Además, se activa el Biestable RS para indicar que el tren 2 debe estar en reset. Ahora se cuentan el número de unidades de tiempo requeridas para establecer la diferencia de fase. En este ejemplo necesitamos 3 para generar el desfase de 270 grados (-90 grados)
Una vez que el contador alcanza el valor máximo, se poner a 0 el biestable RS y la etapa de reset termina: el tren 2 empieza a moverse
En este Vídeo de youtube se muestra el funcionamiento
En esta figura vemos lo que ocurre en los LEDs. En la primera etapa, el tren 1 se desplaza 3 posiciones a la derecha, mientras que el tren 2 permanece en el tramo 0. En t=3
el tren 1 alcanza al extremo derecho y emite un pitido grave: poooo. En el siguiente instante apreciamos que ahora el tren 1 está en el tramo 0, pero el tren 2 está en el siguiente: tramo 1. Hemos alcanzado el régimen permanente y el tren 2 va una unidad de tiempo adelantada
Cuando el tren 2 llega al extremo derecho, se emite un pitido agudo: piii. Y en el siguiente instante, se emite el grave: pooo
Ejemplo 23: Dos LEDs con diferencia de fase variable
Como último ejemplo de esta parte, vamos a unificar todos los ejemplos anteriores para hacer un circuito que mueva los LEDs con una diferencia de fase configurable mediante el pulsador SW2
Ahora la fase NO se establece con una constante, sino con un contador de 2 bits. Al apretar el pulsador SW2
se incrementa este contador, que indica la fase actual, y se realiza un reset para que el sistema comience con esta nueva fase
Con el pulsador SW1
se realiza un reset, manteniendo la diferencia de fase actual
(23-Dif-fase-variable-sonidos-LEDs.ice)
Además se ha disminuido el tiempo entre posiciones (los trenes se mueven más rápidos). En vez de medio segundo ahora es de 250ms (un cuarto de segundo). Así se puede apreciar mejor con el oido la diferencia de fase actual
En este Vídeo de Youtube se muestra el funcionamiento. Con el pulsador SW2
se va iterando por todas las fases
Generador infinito con reset y diferencias de fase
Ahora que ya entendemos el concepto de diferencia de fase, es el momento de aplicarlo con los generadores infinitos con reset. La idea es sencilla: hay que inicializarlos en instantes diferentes. Por eso necesitamos la entrada de reset
Si ambos generadores se reinician en el mismo instante, estarán en fase. Si primero inicializamos uno y transcurrido un tiempo inicializamos el siguiente, estableceremos una diferencia de fase entre ellos
El esquema, por tanto, es sencillo: usamos generadores inifitos con entrada de reset, y circuitos de retraso en sus señales de reset
En los siguientes apartados veremos ejemplos, y comprobaremos las direrencias de fase con el analizador lógico
Ejemplo 24: Dos señales en oposición de fase (180 grados) con T=2
Comenzamos con la señal periódica más rápida: la que tiene periodo igual a 2 ciclos. En la Alhambra II esta señal es de 6 Mhz. Como el periodo es de 2 ciclos, las dos señales sólo pueden estar en dos estados: Bien en fase, o bien desfasadas 180 grados. El desfase de 180 grados equivale a 1 ciclo
En este circuito se generan las dos señales: la original y la desfasada 180 grados. La captura se realiza al apretar el pulsador SW1
que provoca el reinicio de los generadores
(24-senales-T=2-desfase-180.ice)
Este es el resultado en el Analizador
En este caso particular, el desfase de 180 grados equivale a la señal negada
Ejemplo 25: Cuatro señales desfasadas, con T=4
Las señales de 4 ciclos de periodo, que en la Alhambra II tiene una frecuencia de 3Mhz, pueden estar en 4 fases diferentes: 0, 90, 180 y -90 grados. En este circuito se generan todas ellas, usándose el bloque Delay para determinar este desfase (Salvo en el caso de 90 grados, que se usa simplemente un biestable D del sistema)
(25-senales-T=4-desfases-todos.ice)
Este es el resultado en el Analizador lógico
Ejemplo 26: Dos señales desfasadas 90 grados, con T=8
En este ejemplo se generan dos señales de periodo 8 ciclos, desfasadas 90 grados. Ese desfase se corresponde con 2 ciclos, por lo que hay que aplicar un retraso de 2. Este es el circuito:
(26-senales-T=8-desfase-90.ice)
Esto es lo que se observa con el analizador lógico:
Generadores finitos
Estos generadores pueden estar en dos estados: Encendidos o apagados. Inicialmente, están apagados, sin producir ninguna señal de salida. Por medio de la señal start
arrancan y empiezan a producir la señal periódica
Hay dos tipos de generadores finitos, según la forma en la que vuelven al estado de apagado:
- Generadores start-stop: Tienen una señal de
stop
que al activarse hace que el generador se detenga - Generadores de N periodos: Emiten N periodos y luego se apagan
Generadores start-stop
Estos generadores son máquinas que arrancan con la señal de start
, y comienzan a producir una señal periódica normalizada. Cuando se activa la señal de stop
, el generador para, pero lo hace de una forma controlada. Se espera hasta que se termine de emitir el periodo actual (en el que se ha recibido la señal de stop)
Este es el aspecto del generador:
Las señales de salida son las siguientes:
busy
: Estado del generador: Funcionando o apagadodone
: Emite un tic cuando se apagaout
: Salida de la señal periódican
: Número de ciclo dentro del perido actual: 0 - T-1
Ejemplo 27: Implementación de un generador start-stop
Antes de usar el generador start-stop como un bloque, vamos a ver cómo se implementa usando los bloques delay
. Al apretar el pulsador SW1
se arranca el generador, que empieza a producir una señal periódica de T=8
. A la vez se arranca también un temporizador de 25 ciclos para emitir la señal de end
para detener el generador
Es decir, queremos que sólo esté activo durante 25 ciclos de reloj
(27-implementacion-generador-start-stop.ice)
Cada uno de los periodos se genera con el bloque delay. Cuando acaba un periodo, su señal de done (a través de la etiqueta loop
) se realimenta hacia su entrada start
para comenzar un nuevo periodo, pero SÓLO si la señal de stop
NO está activa
Cuando se recibe la señal de end
, se recuerda mediante la notificación de petición de stop. Es decir, que la señal de end
NO DETIENE inmediatamente el generador, sino que activa la petición de stop. Cuando se termina el periodo actual, se comprueba la notificación de stop y si está activa, se finaliza
Esta es la medición con el analizador lógico:
En total se emiten 4 periodos (desde el periodo 0 hasta el periodo 3). La señal de end
se emite en el ciclo 25, que pilla durante el periodo 3. Así que se espera hasta que este periodo termine, y se apaga el generador
Ejemplo 28: Probando el bloque Heart-sys-start-stop
Este ejemplo es similar al 27, pero usando el bloque Heart-sys-start-stop
. Ahora se genera una señal de periodo T=10
, y se quiere que el generador se apague al cabo de 35 ciclos
(28-probando-generador-start-stop.ice)
Este es el resultado medido en el analizador lógico:
La señal de stop
se genera en el ciclo 35, pero como en ese instante hay un periodo que está a la mitad, el generador NO termina, sino que se espera a generar el último periodo
Ejemplo 29: Probando el generador start-stop manualmente
Este ejemplo es similar a los anteriores, pero las señales de arranque y paradas se generan manualmente con la pulsación y liberación de un pulsador
Este circuito genera una señal periódica de 1Khz (1200 ciclos del sistema en la Alhambra II) al apretar el pulsador, y termina al soltar el botón
(29-generador-start-stop-manual.ice)
Este es el resultado. En este ejemplo se ha mantenido apretado el pulsador durante 128 ms. La señal periódica comienza y vemos cómo transcurrido este tipo la señal se apaga
Si nos fijamos en los instantes inciales vemos cómo se recibe el tic de start
y un ciclo depués la señal de busy
se pone a 1: El generador empieza a funcionar
En esta imagen se muestra la parte final. Primero vemos que efectivamente el periodo de la señal es de 1 ms (1Khz). La señal de stop
(end) llega en el último periodo, y unos ciclos después el generador termina (activando done
).
Generadores de N periodos
Estos generadores son máquinas que arrancan con la señal de start
, generan N periodos de T ciclos y terminan. Son especialmente útiles para generar las señales de reloj de las transmisiones síncronas, como por ejemplo en los buses SPI, I2C... y también para la temporización de las comunicaciones asíncronas
Este es el aspecto del generador:
Las señales de salida son las siguientes:
busy
: Estado del generador: Funcionando o apagadodone
: Emite un tic cuando se apagaout
: Salida de la señal periódican
: Número de ciclo dentro del perido actual: 0 - T-1N
: Número de periodo actual: 1 - N
Ejemplo 30: Implementación de un generador de N periodos
Antes de usar el generador de N periodos como un bloque, vamos a ver cómo se implementa usando los bloques delay
. Al apretar el pulsador SW1
se arranca el generador, que produce N=8
periodos de una señal con T=12
(Señal de frecuencia 1Khz, o periodo 1 ms)
(30-implementacion-generador-N.ice)
Este es el resultado, mostrado en el analizador lógico
Un periodo T de 12 ciclos se corresponde, en la tarjeta Alhambra II, con un periodo de 1µs (1Mhz). Como se emiten en total 8 periodos, la duración total es de 8µs
También se muestra el contador de periodos, que va desde 1 hasta N
Ejemplo 31: Probando el bloque Heart-sys-N
Este ejemplo es similar al 30, pero usando el bloque Heart-sys-N
. Ahora se generan N=8
periodos de una señal de periodo T=12
Este es el resultado medido en el analizador lógico:
Bloques de tiempo
Todos los generadores que hemos visto tienen una entrada T
para indicar el periodo en ciclos de reloj del sistema. Sin embargo, la mayoría de las veces queremos trabajar directamente con tiempo o frecuencia. En esos casos es necesario hacer un cálculo manual: Pasar de tiempo a ciclos
Para realizar este cálculo hay que conocer la frecuencia del sistema de la placa que estamos usando. Es nuestro parámetro Fsys
Esta es la misión de los bloques de tiempo: Calcular los ciclos a partir del tiempo y de la frecuencia de reloj del sistema:
Hay 4 bloques para cálculos de tiempo, en las unidades de segundos (sec), mili-segundos (ms), micro-segundos (µs) y nano-segundos (ns). También hay 4 para expresar frecuencias: Hercios (hz), Kilo-hercios (Khz) y Mega-hercios (Mhz)
Todos ellos tienen el parámetro de entrada F por donde se introduce la frecuencia del reloj del sistema en Hz. Si no se introduce esta frecuencia, se toma por defecto el valor de la placa Alhambra-II, que es de 12_000_000
Estos bloques NO GENERAN electrónica adicional, sino que funcionan como CONSTANTES. El sintentizador realiza los cálculos y genera una constante con el valor obtenido, en ciclos
Ecuaciones para el cálculo de los ciclos
Cuando necesitamos generar una señal periódica de un cierto tiempo medido en unidades distintas de ciclos: segundos, mili-segungos, etc... o bien generar un retraso de ese tiempo, necesitamos primero realizar la conversión de tiempo a ciclos. También nos interesa calcular el periodo en ciclos a partir de una frecuencia
El cálculo se realiza con estas ecuaciones:
Por ejemplo, si necesitamos generar un retardo de 1µs (o una señal periódica de periodo T=1µs), si estamos usando la placa Alhambra II que tiene un valor de Fsys=12_000_000
, entonces el número de ciclos a usar es de 12:
Ciclos = 1 µs * 12_000_000 = 10 ^ -6 (seg) * 12 * 10^6 (Hz) = 12
Si lo que queremos es generar una señal periódica de frecuencia 1Mhz, el número de ciclos también es de 12, y se calcula así:
Ciclos = 12_000_000 (hz) / 1Mhz = 12 Mhz / 1 Mhz = 12
Para generar tiempos exactos necesitamos conocer la frecuencia del sistema de la placa que estamos utilizando
Frecuencias del reloj del sistema de las placas de prueba
Para comprobar nuestros circuitos utilizaremos diferentes placas de referencia, que tienen las frecuencias del sistema (Fsys) indicadas en esta tabla
Placa | Frecuencia reloj del sistema | Fsys (Hz) |
---|---|---|
Alhambra-II | 12 Mhz | 12_000_000 |
IceBreaker | 12 Mhz | 12_000_000 |
IceSugar | 12 Mhz | 12_000_000 |
IceFun | 12 Mhz | 12_000_000 |
TinyFPGA Bx | 16 Mhz | 12_000_000 |
Radiona ULX3S-12f | 25 Mhz | 25_000_000 |
Go-Board | 25 Mhz | 25_000_000 |
BlackIce | 100 Mhz | 100_000_000 |
Estos serán los valores que se deberán configurar en nuestros circuitos para obtener tiempos exactos según las placas que estemos usando
Ejemplo 32: Circuito de referencia: Señal de 1Mhz, en ciclos
Antes de trabajar con los bloques de tiempo, vamos a utilizar este circuito de referencia, en ciclos, para generar una señal periódica y normalizada de 1Mhz (Periodo T de 1µs), para las diferentes placas
Para el caso de la Alhambra II (Y cualquier otra placa con frecuencia del sistema de 12Mhz), la señal de 1Mhz se genera, aplicando las ecuaciones anteriores, con un valor de 12 ciclos
El circuito de referencia es el siguiente:
(32-senal-1Mhz-Alhambra-II.ice)
Este es el escenario usado para realizar las mediciones con el analizador lógico. La señal se saca por el pin D0
y se mide a través del canal 0 (CH0) del analizador
Estos son los resultados de la medición. Efectivamente obtenemos una señal de 1Mhz (que tien eun periodo de 1µs)
Placa icebreaker
El circuito de referencia es el mismo. Sólo cambia el pin utilizado para generar la señal: P1-A1
. Los ciclos son también 12, porque tiene una frecuencia de 12Mhz, igual que la Alhambra II
(32-senal-1Mhz-ciclos-icebreaker.ice)
Los resultados son exactamente los mismos que con la Alhambra II: Se genera una señal de 1Mhz
Este es el escenario usado para las mediciones:
En esta figura se muestran los detalles de los pines donde está conectado el analizador lógico:
IceSugar
La frecuencia es la misma que la Alhambra II: 12Mhz. El pin utilizado es el P10
(Es el pin 1 del PMOD1)
(32-senal-1Mhz-ciclos-icesugar.ice)
Se obtiene una señal de 1Mhz, igual que en los ejemplos anteriores. Este es el escenario usado para las mediciones:
Y aquí se pueden ver más detalles de la conexión del analizador lógico:
IceFun
La frecuencia es la misma que la Alhambra II: 12Mhz. El pin utilizado es el P58
(Es el pin B14 en la serigrafía)
(32-senal-1Mhz-ciclos-icefun.ice)
Se obtiene una señal de 1Mhz, igual que en los ejemplos anteriores. Este es el escenario usado para las mediciones:
TinyFPGA-BX
Como la TinyFPGA-BX tiene una frecuencia de 16Mhz, para generar una señal de 1Mhz se necesitan 16 ciclos de reloj. El pin utilizado para sacar la señal es el Pin 1
El circuito de referencia es ahora ligeramente diferente. Dado que la frecuencia de la TinyFPGA es de 16Mhz, los tics ahora son más estrechos que los de las placas anteriores (de 12Mhz). Como el analizador lógico tiene una frecuencia de muestreo de 12Mhz, para poder capturar estos tics hay que hacerlos más anchos. Por ello se añade un bloque delay para que estos tics sean de una anchura de 2 ciclos
(33-senal-1Mhz-ns-us-mhz-TinyFPGA.ice)
Al realizar la captura con el analizador, se pueden ver bien los pulsos de 2 ciclos o de 1. Pero la frecuencia es de 1Mhz (y el periodo de 1µs)
Este es el escenario de las pruebas, para medir con el analizador lógico
En esta imagen se pueden ver más detalles:
Radiona ULX3S-12F
La placa Radiona ULX3S-12F tiene una frecuencia de 25Mhz. Para generar una señal de 1Mhz se necesitan 25 ciclos de reloj. El pin utilizado para sacar la señal es el Pin gp27
El circuito de referencia es también diferente ahora. Los tics son más estrechos que los de 12Mhz. Como el analizador lógico funciona a 12Mhz, los hacemos más anchos añadiendo un bloque delay de 4 ciclos
(32-senal-1Mhz-ciclos-radiona-ULX32-12F.ice)
Al realizar la captura con el analizador, se pueden ver bien los pulsos de 2 ciclos o de 1. Pero la frecuencia es de 1Mhz (y el periodo de 1µs)
Este es el escenario de las pruebas, para medir con el analizador lógico
En esta imagen se pueden ver más detalles:
NandLand Go-board
La placa NandLand Go-board tiene una frecuencia de 25Mhz. Para generar una señal de 1Mhz se necesitan 25 ciclos de reloj. El pin utilizado para sacar la señal es el PMOD-1
El circuito de referencia es también diferente ahora. Los tics son más estrechos que los de 12Mhz. Como el analizador lógico funciona a 12Mhz, los hacemos más anchos añadiendo un bloque delay de 4 ciclos
(32-senal-1Mhz-ciclos-go-board.ice)
Al realizar la captura con el analizador, se pueden ver bien los pulsos de 2 ciclos o de 1. Pero la frecuencia es de 1Mhz (y el periodo de 1µs)
Este es el escenario de las pruebas, para medir con el analizador lógico
En esta imagen se pueden ver más detalles:
BlackIce
La placa BlackIce tiene una frecuencia de 100Mhz. Para generar una señal de 1Mhz se necesitan 100 ciclos de reloj. El pin utilizado para sacar la señal es el P140
El circuito de referencia es también diferente ahora. Los tics son más estrechos que los de 12Mhz. Como el analizador lógico funciona a 12Mhz, los hacemos más anchos añadiendo un bloque delay de 12 ciclos
(32-senal-1Mhz-ciclos-blackice.ice)
Al realizar la captura con el analizador, se pueden ver bien los pulsos de 2 ciclos o de 1. Pero la frecuencia es de 1Mhz (y el periodo de 1µs)
Este es el escenario de las pruebas, para medir con el analizador lógico
En esta imagen se pueden ver más detalles:
Ejemplo 33: Señal de 1Mhz, usando bloques ns, µs y MHz
En este ejemplo se usan los bloques ns
, µs
y MHZ
para generar tres señales de 1Mhz. Las tres señales son iguales, pero se han generado usando unidades diferentes
(33-senal-1Mhz-ns-us-mhz-Alhambra-II.ice)
Esta es la medición con el analizador lógico:
Ejemplo 34: Señal de 1Khz, usando bloques ms y Khz
En este ejemplo se usan los bloques ms
y KHZ
para generar dos señales de 1Khz. Las dos señales son iguales, pero se han generado usando unidades diferentes
(34-senal-1Khz-khz-ms-Alhambra-II.ice)
Esta es la medición con el analizador lógico:
Ejemplo 35: Señal de Hz, usando bloques Hz y Sec
En este ejemplo se usan los bloques sec
y HZ
para generar dos señales de 1Hz. Las dos señales son iguales, pero se han generado usando unidades diferentes
(35-senal-1Hz-hz-sec-Alhambra-II.ice)
Esta es la medición con el analizador lógico:
Transmitiendo energía
En las señales periódicas nos centramos en dos aspectos: Su periodo y el ciclo de trabajo
El periodo es el que transmite la información sobre el tiempo, y es el que nos permite temporizar. Las señales periódicas normalizadas emiten tics para indicarnos cuándo estos periodos terminan y cuando empieza el siguiente ciclo. Con esta información podemos calcular el tiempo transcurrido
El ciclo de trabajo nos indica la cantidad de energía por periodo (potencia) que la señal contiene. Con una señal periódica normalizada no podríamos encender un led, ya que apenas transmitimos energía (veremos un ejemplo). Para que se pueda ver el LED la señal tiene que estar más tiempo encendido y no sólo un tic
Para transmitir más energía hay que incrementar la anchura del pulso: el tiempo que la señal periódica está a 1 durante cada periodo
Como siempre, veremos diferentes ejemplos para entender estos conceptos
Ejemplo 36: Segundero binario en los LEDs
En este ejemplo utilizamos una señal periódica normalizada, de 1 Hz (periodo de 1 segundo) para incrementar el contador binario. En este caso no hace falta modificar la anchura del pulso de la señal de temporización. Es el contador el que permite que se vea la cuenta binaria en los LEDs
(36-contador-binario-LEDs.ice)
En esta animación se muestra la evolución de los LEDs
Establecer la anchura del pulso
La forma de dar más energía es incrementando el ancho del pulso de la señal de temporización usando el bloque Delay (Esto lo hemos hecho en ya en varios ejemplos). La señal final hay que tomarla de la salida busy
. ¡¡CUIDADO!!: si por error se toma sa salida de done
se obtendrá un tic (anchura de 1 ciclo) y por tanto no se añadirá energía
En el siguiente circuito se muestra un ejemplo de uso de esta técnica
Ejemplo 37: LED pulsante a 1Hz
En este ejemplo el LED0 parpadea a la frecuencia de 1 Hz. La anchura del pulso es de 100ms. La señal out
del corazón se lleva al bloque delay
. Por su salida busy
se obtiene el pulso de 100ms que se muestra por el LED
En este Vídeo de youtube se muestra el funcionamiento:
Ciclo de trabajo del 50%
En muchas aplicaciones no nos interesa la anchura del pulso, sino simplemente aportar la suficiente energía. Típicamente usamos el 50%: de manera que la mitad del tiempo esté la señal activa y la mitad del tiempo apagada
Esto se consigue de una manera sencilla utilizando un biestable T conectado a la salida de un corazón. Sin embargo, los Biestables T actúan como divisores de frecuencia, por lo que a su salida obtenemos una señal de frecuencia f/2, siendo f la frecuencia del corazón
Para lograr una señal de frecuencia f con el ciclo de trabajo del 50% hacemos lo siguiente:
- Usarmos un corazón de frecuencia 2*f (el doble)
- Conectamos su salida out a un biestable T
- Obtenemos la señal final en la salida del biestable T
Ejemplo 38: LED parpadeante a 1Hz
En este ejemplo hacemos parpadear un LED a la frecuencia de 1Hz, con un ciclo de trabajo del 50%. Usamos la técnica del biestable T, por lo que empleamos un corazón de 2Hz
Comprobamos con el analizador lógico que el tiempo es exacto
Ejemplo 39: LED parpadeante a 1Hz. Implementación II
Este ejemplo es el mismo que el 38, pero la implementación es diferente. Se sigue usando un corazón de 2 Hz que al pasarlo por un biestable T genera una frecuencia de 1 Hz. Pero ahora se indica explícitamente una frecuencia de 1 Hz en el parámetro. Lo que se hace es dividir el periodo obtenido, en ciclos, entre 2, para multiplicar la frecuencia por 2
(39-LED-parpadeante-1Hz-impl2.ice)
La división entre 2 se logra mediante un despalzamiento de un bit a la derecha
Vemos que los recursos ocupados son los mismos, por lo que es mejor usar este segundo ejemplo, ya que es más cómodo: si ponemos 1 como parámetro, obtenemos la señal de 1Hz y 50% de ciclo de trabajo. Esta es, por tanto, la implementación que usaremos en los generadores simplificados
Generadores simplificados
En muchas aplicaciones sólo nos interesa generar una señal periódica, de unas unidades determinadas, pero no necesitamos usar el resto de entradas y salidas que tienen los generadores. En estos casos usamos los generadores simplificados. Funcionan igual que los que hemos visto hasta ahora, pero con menos pines y especificando las unidades de tiempo a través de un parámetro
Se usan mucho en las aplicaciones de docencia, para enseñar electrónica digital. En realidad, estos generadores ya los hemos utilizado en el Tutorial de Electrónica Digital para makers con FPGAs Libres. La diferencia es que ahora estos bloques están creados a partir de otros bloques de icestudio (los originales estaba directamente en Verilog), y sirven para placas de otras frecuencias (y no sólo para la Alhambra II)
El tenerlos como bloques de Icestudio permite que se puedan ver, modificar y entender fácilmente sin necesidad de conocer Verilog
Ejemplo 40: Cronómetro binario
En este ejemplo se rehace el circuito 36 pero usando el generador simplificado de Hz
Ejemplo 41: LED parpadeante
En este ejemplo se hace parpadear el LED a la frecuencia de 1Hz, utilizando un corazón simplificado
Ejemplo 42: Tocando un tono de 1Khz
Este es el clásico ejemplo del timbre, que hace sonar un tono de 1KHZ al apretar el pulsador SW1
. Se usa un corazón simplificado de 1Khz
Conclusiones
Hemos estudiado los principios de las señales periódicas, su naturaleza y las distintas formas de generarlas. Hemos construidos bloques para su generación. Con estos bloques ya podemos producir señales de sincronización de cualquier frecuencia. También hemos visto cómo modificar la anchura de los pulsos para que aumentar su ciclo de trabajo y transmitir más energía
Estas señales nos serán muy útiles para la implementación de sistemas de comunicaciones, sonidos y consolas en los próximos cuadernos técnicos, para placas de FPGAs de cualquier frecuencia de reloj
Autor
- Juan González-Gómez (Obijuan)