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

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:

(01-senal-T2-un-periodo.ice)

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

(02-moviendo-bit-LEDs.ice)

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

(04-senal-periodica-T2.ice)

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:

(05-senal-periodica-T3.ice)

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

(06-senal-periodica-T12.ice)

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

(07-senal-periodica-T4.ice)

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

(08-LED-dos-intensidad.ice)

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

(10-senal-cambio-T4-T2.ice)

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:

Click to see the youtube video

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

Click to see the youtube video

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

Click to see the youtube video

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

Click to see the youtube video

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

Click to see the youtube video

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 SW1que 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 apagado
  • done: Emite un tic cuando se apaga
  • out: Salida de la señal periódica
  • n: 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 apagado
  • done: Emite un tic cuando se apaga
  • out: Salida de la señal periódica
  • n: Número de ciclo dentro del perido actual: 0 - T-1
  • N: 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

(31-Probando-generador-N.ice)

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

(37-LED-pulsante-1Hz.ice)

En este Vídeo de youtube se muestra el funcionamiento:

Click to see the youtube video

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

(38-LED-parpadeante-1Hz.ice)

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

(40-cronometro-binario.ice)

Ejemplo 41: LED parpadeante

En este ejemplo se hace parpadear el LED a la frecuencia de 1Hz, utilizando un corazón simplificado

(41-LED-parpadeante.ice)

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

(42-Tono-1Khz.ice)

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

Licencia

Créditos y agradecimientos

Enlaces