Escrito por Javier
Por revisar
Introducción
Entender la sincronización de datos es de vital importancia, ya que gracias a su implementación se pueden solucionar problemas tan graves como metaestabilidad, que puede representar la pérdida flancos (en caso de trabajar con una FSM)
(Qué es metaestabilidad - Link en español)
(Qué es la metaestabilidad - Link en inglés)
Objetivos
- Entender la importancia de la sincronización de datos.
- Implementar un sincronizador de datos.
- Comprender el funcionamiento de una trampa atrapa flancos.
- Entender la variación que presenta una FSM cuando se le aplica una trampa atrapa flancos.
Desarrollo
Nota 1: Cuando se dice que un sistema se encuentra en nivel alto o bajo se hace referencia a sus estados lógico (En sistemas digitales el nivel alto es un uno lógico y en nivel bajo es un cero lógico).
Nota 2: En los archivos que se descargan a lo largo de esta prueba es necesario inicializar los registros para que funcionen de forma adecuada.
Nota 3: A lo largo de la práctica se usan los términos "divisor de frecuencia" y "generador de frecuencias". En este caso tienen el mismo uso, es decir, son usados para referirse al mismo elemento.
En la Simulación hecha en la aplicación Modelsim, se puede observar que la señal de salida presenta un retraso respecto a la de entrada, es decir, cualquier cambio en la señal de entrada es detectado en un flanco de subida, pero este sólo se ve reflejado en la salida hasta después de transcurridos dos de estos flancos; siempre y cuando la señal reset se encuentre en nivel alto (En Modelsim se fuerza la señal a 1), de lo contrario, es decir, si se encuentra en nivel bajo, la salida del sistema será cero.
Representación de doublesync en la herramienta RTL.
Simulación hecha en Modelsim, de async_trap_and_reset, que representa una trampa atrapa flancos. Atrapa una señal asíncrona (señal de color rojo), la sincroniza utilizando dos flip-flops y la muestra en la salida (señal de color blanco). La señal de auto-reset le indica al sistema si debe estar nivel bajo después de dos ciclos de reloj (El reloj está representado por la señal de color verde).
Tanto el reset (señal de color amarillo), como el auto-reset (señal de color azul) se ponen en nivel alto (en Modelsim se fuerza la señal a 1) debido a que el primero funciona como activo bajo (Se activa cuando está en cero la señal de entrada) y el segundo es activo alto (funciona cuando su entrada es uno).
Nota: Las trampas atrapa flancos tienen como objetivo atrapar una señal de entrada y no permitir que la salida cambie de estados más veces que la señal de entrada.
Diseño de la trampa atrapa flancos, visto desde la herramienta RTL
2. Si los simulo bien y verifico se dio cuenta que el "async_trap_and_reset" es un sincronizador atrapa flancos y es bueno usarlo cuando queremos hacer cambios entre dominios de reloj.
2.1 Ejemplo: Suponga que usted esta trabajando con una maquina de estados que funciona a 50MHz y esta FSM se activa con una señal de "start", ahora suponga que esta entrada de "start" de la FSM esta conectada directo a un divisor de frecuencia que funciona con un reloj de entrada de 25MHz y genera una salida conectada al "start" de 100Hz(Descargue la plantilla para ver el ejemplo e implemente).
El primer paso es generar el código en Verilog y realizar las conexiones que se piden.
Para saber si el diseño quedó implementado de manera adecuada se recurre a la herramienta RTL
Analizando el diseño mostrado por la herramienta RTL se puede observar que las conexiones se realizan de forma adecuada, mostrando los CLK del Flip-Flop y de la FSM conectados a 50 MHz, el clock que genera la señal de 100 Hz conectado la señal de 25 MHz de la salida del Flip-Flop y su entrada al número decimal 249999 (En la imagen de este diseño en RTL se explica cómo se calcula este número) que es necesario para que a la salida de este dispositivo se genere la frecuencia requerida; y la señal "start" de la FSM se encuentra conectada a la salida del generador de frecuencias.
Una vez verificadas las conexiones mediante el diseño observado en RTL, se procede a generar la simulación en Moderlsim.
Nota: Para generar la simulación no se tomaron los 100 Hz que se piden, en su lugar se tomó una frecuencia de 892 KHz con el fin de ver los resultados de forma rápida, ya que si se toman los primeros, la cantidad de flancos necesarios para notar el cambio y el efecto que se busca entender sería alto y difícilmente se apreciaría.
En la simulación se puede observar que la salida de la FSM (representada por los leds) cambia en más de una ocasión en cada flanco de la señal de su entrada
2.1.1 Responder
- ¿Cuantas veces se activaría la FSM si se conecta directamente la salida del divisor de frecuencia con la entrada "start" de la FSM?
Respuesta: Como se puede observar en la simulación, la FSM conectada directamente a la salida del divisor de frecuencias con la señal de "start" se activa 14 veces.
- ¿Que pasa con los LEDs a la salida?
Respuesta: Los leds de la salida de la FSM cambian el mismo número de veces que se activa esta.
- ¿Usted puede asegurar que solo se activa una vez?
Respuesta: No se puede asegurar que sólo se activa una vez, ya que la simulación demuestra todo lo contrario.
- ¿Se puede asegurar que el sistema se activa en un flanco ascendente de esta FSM?
Respuesta: Se puede asegurar que el sistema se activa en el flanco de subida del CLK de la FSM (25 MHz).
Prueba de funcionamiento en la FPGA
2.2 Ahora suponga que la entrada "start" de la FSM no se conecta directamente al divisor de frecuencia, si no que antes se utiliza el modulo "async_trap_and_reset" para atrapar el flanco ascendente de la salida del divisor de frecuencia con el reloj con el cual trabaja la FSM, y esta señal sincronizada se envía a la entrada "start" de la FSM (modifique la plantilla para agregar el "async_trap_and_reset").
Tal y como se realizó en el punto anterior, se empieza por realizar las adaptaciones respectivas al código de Verilog
Después de procede a revisar las conexiones y el diseño, en el modelo proporcionado por la herramienta RTL
Una vez se haya verificado que toda conexión está correctamente hecha, se procede a realizar su simulación en Modelsim
Se observa un cambio muy notorio respecto a la simulación en la que no se implementa la trampa atrapa flancos. En lugar de activarse varias veces en el mismo flanco (como sucedía en la simulación anterior) los leds de salida de la FSM sólo se activan una vez por flanco.
Nota: Al igual que para la simulación realizada sin la trampa atrapa flancos, no se toman los 100 Hz y en su lugar se toman 892 KHz.
2.2 Responder
- ¿Cuantas veces se activaría la FSM si se conecta directamente la salida del divisor de frecuencia con la entrada "start" de la FSM?
Respuesta: Para este caso, donde la señal start se conecta a la salida de la trampa atrapa flancos, la FSM sólo se activa una vez en cada flanco ascendente de la salida del divisor de frecuencias de 100 Hz
- ¿Que pasa con los LEDs a la salida?
Respuesta: Los leds de la salida de la FSM cambian el mismo número de veces que se activa esta.
- ¿Usted puede asegurar que solo se activa una vez?
Respuesta: Se puede asegurar que sólo se activa una vez, ya que la trampa atrapa flancos se encarga de que esto suceda.
- ¿Se puede asegurar que el sistema se activa en un flanco ascendente de esta FSM?
Respuesta: Sí se puede asegurar que el sistema se activa en un flanco ascendente de la FSM.
Prueba de funcionamiento en la FPGA