Reconstruyendo el reloj para la señal serial

6

Supongamos que tengo una señal en serie (ejemplo a continuación), que se transmite sin una señal de reloj acompañante, me gustaría encontrar un circuito (usando componentes discretos / IC, posiblemente un FPGA, pero no un microcontrolador) para reconstruir el reloj para esta señal.

El principal desafío es que la frecuencia de esta señal serial varía con el tiempo. La señal se recibe desde un ASIC inalámbrico. Cuando el transmisor ASIC está encendido, el receptor produce una señal, como la que se muestra a continuación.

Además, el ASIC puede cortarse de forma intermitente (y asíncrona) después de unos segundos, y un transmisor diferente se pondrá en línea. La frecuencia nominal de cualquier transmisor puede ser de 35 a 65 KHz debido a problemas de diseño.

Dependiendo de cuánta potencia tenga el transmisor, he visto cómo un solo ASIC se desplaza hasta en 2 KHz desde un valor nominal de 50 khz durante la operación continua. Nunca he medido un cambio de frecuencia notable en menos de 20 cuadros de datos, pero no tengo una cifra real para la tasa de cambio en la frecuencia de reloj ...

Hay un bit de inicio por trama, y un bit de paridad y un bit de parada al final. Puede haber hasta 13 ceros consecutivos en el cuadro. Siempre hay 4 ciclos cero entre tramas que provienen de un solo transmisor de ASIC. Las tramas consecutivas provienen de un solo transmisor, pero como mencioné, el transmisor puede interrumpirse periódicamente y otro puede conectarse en línea a una frecuencia de reloj diferente.

Lo que estoy buscando es un circuito para recuperar el reloj, usando una combinación de lógica digital y componentes analógicos discretos (¡no un microcontrolador!) que es muy robusto, que se puede adaptar a un reloj a la deriva y se puede bloquear. a las frecuencias en ese amplio rango. También me gustaría encontrar un diseño que se adapte bien a frecuencias más altas, porque los futuros ASIC tendrán un reloj transmisor que es mucho más rápido (he escuchado hasta 20 veces más rápido).

Se utilizará un FPGA para decodificar el flujo de datos (y usar el reloj recuperado, de hecho, esto ya se ha implementado antes de asumir la disponibilidad del reloj), y como tal se puede usar como parte del circuito de recuperación del reloj si eso ayuda.

Lamento la confusión, espero que todo haya sido aclarado.

    
pregunta Jay Keegan

4 respuestas

6

Recuperar un reloj de un flujo de pulsos intermitente es un ejercicio de diseño no trivial. Generalmente trato de centrar el borde del reloj en los pulsos, luego el borde del reloj se puede usar para capturar la presencia / ausencia del pulso en un flip-flop. Un circuito digital / analógico híbrido demuestra el concepto más claramente:

simular este circuito : esquema creado usando CircuitLab

La idea general es usar un par de compuertas para generar un pulso de "bombeo" y un pulso de "bombear" para cada pulso de entrada. Mientras estos dos pulsos tengan la misma duración (el borde del reloj se produjo exactamente en el medio del pulso de entrada), no habrá cambio neto de la frecuencia VCO. Pero si el pulso llega un poco antes con respecto al reloj (lo que significa que el reloj es lento), el pulso de "bombeo" será más amplio que el pulso de "bombeo hacia abajo", aumentando la tensión de control del VCO. Ocurre lo contrario si el pulso de entrada se retrasa, disminuyendo la tensión de control. El VCO debe configurarse de modo que el rango de frecuencias que pueda producir en el rango del voltaje de control coincida con el rango esperado de las tasas de datos.

Ya que estás trabajando con un FPGA, se puede hacer algo muy similar en el dominio digital. Asumiremos que tiene un reloj de alta velocidad (por ejemplo, 10 - 50 MHz) disponible. Reemplazamos la bomba de carga con un contador binario ascendente / descendente, reemplazamos el VCO con un DDS y, en lugar de confiar en el ancho de pulso analógico, muestreamos la fase del DDS en los bordes ascendente y descendente de los pulsos de entrada.

En el siguiente diagrama, todas las entradas de reloj "colgantes" están conectadas al reloj interno de alta velocidad del FPGA. Todos los pines con [] al final de sus nombres representan buses de cables múltiples.

simular este circuito

La entrada RZ asíncrona se pasa a través de un sincronizador de 2 etapas y luego un detector de bordes. Los registros U3 y U4 capturan los bits de fase superior del DDS (U2) en los bordes ascendente y descendente del pulso RZ, respectivamente. Si tratamos el valor de la fase como un número binario firmado, el flanco ascendente capturará un valor negativo, mientras que el flanco descendente capturará un número positivo. Sumamos estos dos números, y si estamos perfectamente sincronizados, se cancelarán y el resultado será cero. Sin embargo, si el reloj llega tarde, el número negativo será mayor y la suma será negativa. Por lo tanto, simplemente tomamos el bit de signo en la salida del sumador (U5), y usamos puertas para incrementar o disminuir el valor en nuestro contador (U1) para acelerar o ralentizar el reloj. Tenga en cuenta que querrá configurar este contador para que solo cubra el rango de frecuencia de interés. En otras palabras, tendrá un valor mínimo y un valor máximo que no contará más allá.

El "carry out" de la DDS es un pulso de un solo reloj (reloj del sistema) que se produce a la velocidad de los datos RZ, alineado con los centros de los bits.

    
respondido por el Dave Tweed
3

Si el reloj puede variar, y necesita recuperarlo, definitivamente debe construir un circuito de recuperación de reloj.

Con la señal RZ, puede ser bastante fácil ya que, como usted dice, el reloj está presente en la señal todo el tiempo. Si está recibiendo todos, en realidad está recibiendo la señal del reloj ... Pero cuando se recibe un cero, está recibiendo el reloj negado. En primer lugar, sugiero un detector de bordes, que es un circuito que emite un pulso cada vez que la señal de entrada cambia la polaridad. Un ejemplo trivial es un filtro de paso alto, que es un condensador en serie con una resistencia a tierra. Sus pulsos aún son de polaridad mixta, pero puede usar un rectificador de onda completa para obtener un pulso positivo cada vez que su señal haga una transición. Ahora que es casi un reloj, solo necesitas dividirlo entre dos con un par de chanclas y listo.

Para detectar todos los bordes, también puede usar una puerta XOR: una entrada a la señal RZ, la otra a la misma señal retrasada "un bit". Cuando y solo cuando las entradas son diferentes, eso sucede cuando está teniendo una transición, la salida será alta. Aún necesitas dividir por dos.

Sé que no he propuesto una solución práctica, pero espero que mis aportaciones puedan ayudarlo.

    
respondido por el Vladimir Cravero
2

Dadas las frecuencias que está viendo, sugeriría intentar resolver el problema en el dominio digital. Si hay alguna forma "agradable" de identificar dos impulsos que se supone que están separados por un cierto número de intervalos de tiempo (por ejemplo, se supone que el espacio entre cuadros es más largo que cualquier espacio dentro de un cuadro, y el tiempo desde el inicio de un cuadro) al comienzo del siguiente, siempre se supone que son exactamente veinte intervalos de tiempo), entonces, si muestrea sus datos entrantes con un reloj que es al menos el doble de rápido que la velocidad de datos, debería poder averiguar dónde están los límites del marco. A partir de eso, debería poder averiguar la ubicación de los intervalos de tiempo individuales dentro de un marco.

Una de las principales ventajas de trasladar este tipo de cosas al dominio digital es que los datos se pueden analizar de forma retrospectiva. Por ejemplo, si cada cuadro es de veinte intervalos de tiempo, el primero y el decimosexto siempre tienen pulsos, y no hay un intervalo de cuatro o más intervalos de tiempo sin pulso, entonces puede usar hardware para registrar cada 15 aumentos si hubo pulso o no. Observe un tiempo sin pulsos que sea lo suficientemente largo como para ser un espacio entre cuadros, y haga un seguimiento de la última vez que se ha observado. Cuando se observa un espacio entre cuadros (distinto del primero), asegure el número de relojes entre este y el anterior, y luego tome los datos de los puntos adecuadamente espaciados en el búfer.

Podría ser posible usar un microcontrolador para hacer gran parte del análisis; 50khz es un poco rápido, pero tal vez sea factible si el controlador tiene alguna asistencia de hardware para capturar los datos o no tiene que hacer nada más. Las probabilidades de éxito de un microcontrolador podrían ser especialmente buenas si, por ejemplo, siempre hay nueve pulsos por fotograma (si el hardware almacena un byte por pulso con su longitud aproximada, si el intervalo actual y los nueve anteriores son más largos que cualquiera de los intermedios, entonces los ocho intervinientes probablemente forman un fotograma de datos, y la velocidad de reloj debe ser 1/20 de su suma). La selección del mejor enfoque requeriría un poco más de conocimiento de lo que representa el flujo de datos entrantes, qué partes de él son fijas o variables, qué tan limpio o nervioso es, etc.

    
respondido por el supercat
1

Prueba esto. Suponiendo que los datos tienen una amplitud de +/- Vl. Use dos comparadores, uno para disparar en Vl / 2, el otro en -Vl / 2. Invierta el segundo y luego O las dos señales. Puede hacerlo con la mitad de un comparador cuádruple y la mitad de una compuerta NOR cuádruple. (Esto supone que el período de los datos es mucho mayor que el tiempo de propagación de la lógica, y que la relación señal / ruido de los datos es razonablemente alta).

    
respondido por el WhatRoughBeast

Lea otras preguntas en las etiquetas