Esta es más una pregunta de aprendizaje, puedo resolver el problema, pero sería bueno saber cómo hacerlo: ¿se puede reconstruir un reloj a partir de una señal y es más fácil cuando se conoce básicamente la frecuencia del reloj?
Estoy usando una placa Terasic DE10 Lite, reflejando video de una Mac SE/30 (512x342x1bpp) en una pantalla VGA. Las conexiones de Mac son vsync, hsync y pixel desde la placa analógica, el nivel se convierte a 3,3 V y luego se conecta a los GPIO de la placa FPGA. A 1024x768 es un ajuste bastante bueno si se duplica el píxel. Obtener VGA a 60 Hz no es difícil, un bloque de IP ALTPLL a 65 Mhz hace que solo sea cuestión de contar el porche delantero/trasero y los pulsos de sincronización.
Copiar la señal de Mac es un poco más difícil. Terminé con un @always en un reloj ALTPLL funcionando a 15,67 MHz (y experimenté con números mult/div para tratar de acercarme lo más posible), la tasa de salida de píxeles de la Mac. No puedo igualar exactamente la velocidad del reloj de esta manera . Esto cuenta el período en blanco vertical y luego para cada línea cuenta hasta que comienzan los píxeles y muestrea cada píxel. Los píxeles se escriben en una losa de RAM de doble puerto hecha a partir de otro bloque de IP y se emiten mediante la rutina VGA.
Esto funciona y es perfectamente legible. Pero es feo ya que hay errores de muestreo debido a los relojes que no coinciden ligeramente. Si en lugar del reloj ALTPLL tomo CPUCLK del conector PDS de Mac y lo uso para registrar los píxeles, todo es lo más estable posible. Usando el reloj FPGA, los píxeles son inestables y cambian aleatoriamente donde no deberían.
La pregunta es, ¿qué haces si no puedes tomar el reloj del sistema? Creo que debe haber alguna forma de ajustar dinámicamente la frecuencia y el cambio de fase según la entrada, pero no sé dónde buscar.
(esta pregunta no obtuvo respuesta en Stack Overflow, tal vez encaje mejor aquí)
No hay dos relojes que coincidan perfectamente. El método para determinar la verdadera frecuencia del reloj a partir de los datos se denomina "recuperación del reloj".
Si conoce la tasa de bits nominal, entonces un método sencillo que no requiere el uso de un bloque PLL/DCM es sobremuestrear los datos y buscar bordes. Normalmente, necesitaría sobremuestrear al menos 4 veces la tasa de bits. Así es como funciona...
Cree un reloj en su parte que sea 4X la tasa de bits. En el caso de una tasa de bits de 65 MHz, este es un reloj de 260 MHz.
El uso del reloj de 260 MHz registra el doble o el triple de los bits entrantes para evitar problemas de metaestabilidad. Estos tipos de problemas pueden ocurrir si una señal de entrada cambia muy cerca de un borde de reloj. Es casi seguro que esto suceda cuando se toman muestras de datos utilizando un reloj diferente del que se generaron los datos.
Opcionalmente, haga dos etapas adicionales de registro y haga un voto mayoritario de 2 de 3 en las últimas tres etapas. Esto reducirá la detección falsa de bordes debido al ruido, lo que se vuelve importante en el siguiente paso, ya que está utilizando bordes en los datos para encontrar la frecuencia del reloj.
Cree un contador de ejecución libre de dos bits que cuente de 0 a 3 y luego regrese a 0. El contador está cronometrado por el reloj de 260 MHz.
Cada vez que vea una transición de 0 a 1 o de 1 a 0 en los datos de entrada, suponga que se encuentra en el borde del reloj y restablezca el contador a 1 (cnt <= "01").
Siempre que el contador tenga un valor de 2 (cnt = "10"), use la salida de su voto mayoritario como su muestra de entrada. Y si mantiene un recuento de píxeles, también increméntelo.
Personalmente, he usado el método anterior para recuperar con éxito el reloj en datos en serie de hasta 100 Mbps.
Dependiendo de si los datos entrantes son un poco más rápidos o más lentos que su reloj, el contador omitirá un tic o mantendrá un tic adicional para ajustar la tasa de conteo para que coincida con los datos.
Para una velocidad de datos más lenta, verá algo como...
...0,1,2,3,0,1,2,3, 0,1,1,2,3,0,1,2,3 , 0,1,2,3...
Para una velocidad de datos más rápida , verá algo como...
...0,1,2,3,0,1,2,3, 1,2,3,0,1,2,3,0,1, 2,3...
Hay otro método en el que puede hacer el sobremuestreo 4X utilizando dos relojes que tienen la misma velocidad que su reloj de píxeles pero 90 grados desfasados. Al muestrear en cuatro registros (uno al subir y otro al bajar para cada reloj) puede lograr el mismo efecto que con la configuración anterior basada en contadores. Las tasas de píxeles máximas posibles son más altas para ese método, pero la lógica es un poco más compleja.
Sería útil pensar un poco en cómo una tarjeta de video produce realmente sus señales de salida.
Véase, por ejemplo, una línea de modelos XFree86. Aquí hay uno para 1024x768 @ 60 Hz (no entrelazado) de una herramienta generadora en línea , los detalles son específicos de la implementación, pero la idea se mantiene esencialmente en todas las computadoras y modos de video.
Dot Clock Frequency: 60.80 MHz
Modeline "1024x768" 60.80 1024 1056 1128 1272 768 768 770 796
Tiene un reloj de píxeles, una región de video activo, una señal de sincronización definida como su inicio y final, y un número total de relojes en un período de línea, en este ejemplo 1272. Todo esto se expresa en unidades de relojes de píxeles, que es decir que todo se remonta al reloj de píxeles y lo hace de una manera digitalmente consistente.
Entonces, para un modo de video dado en una computadora dada, las proporciones son estables, es solo la velocidad del reloj de píxeles la que tiene una ligera desviación con la temperatura, el envejecimiento, etc.
Básicamente, si pudiera conocer los números del modelo, entonces podría dividir su propio oscilador de reloj de píxeles por el número correcto de relojes para que coincida la señal de sincronización (1272 en el ejemplo anterior), y así tener un PLL que bloquea su reloj de píxeles a la tarjeta de vídeo fuente. Todo lo que tiene que hacer es contar el número correcto de píxeles hasta el borde izquierdo de la región activa.
¿Cómo podrías encontrar los números de modelo? Bueno, usted personalmente probablemente podría buscarlos.
Lo que sospecho que hace un monitor moderno pixelado (LCD, etc.) impulsado por una fuente analógica es hacer algo así como una "búsqueda" cuando presiona el botón de sintonización de imagen. Probablemente no sea difícil adivinar la resolución horizontal y puede medir la duración del video activo. Luego, puede medir la relación entre el período horizontal general y el video activo y, a partir de eso, sabe el número total aproximado de relojes de píxeles en una línea de modelo; por ejemplo, en mi ejemplo, 1272 determinado en proporción de tiempo a 1024. PLL en la conjetura de 1272 (o por ahí).
Luego prueba varios números en torno a eso y hace algún tipo de comparación para ver en qué datos de muestra parecen "mejores", donde "mejor" puede definirse como algo así como mostrar el promedio más alto de diferencia de nivel de píxel a píxel consecutivo cerca de ambos lados de la pantalla, lo que indica que el muestreo está bien alineado con la mitad de los períodos de píxeles y no captura las transiciones intermedias entre ellos, y lo hace en toda la pantalla de manera que coincida tanto en fase como en frecuencia. O tal vez solo verifica que la región activa tenga exactamente el número correcto de relojes de píxeles de ancho. Pero si puede permitirse generar un reloj que sea algo así como 3x-6x el reloj de píxeles real,
Probablemente, este análisis es algo que haría con el software en un núcleo de procesador (interno o externo a la FPGA) que puede introducir registros que controlan su máquina de estado de captura y ejecutar estadísticas que no son en tiempo real en un búfer de línea congelado; por ejemplo, básicamente trata el hardware de captura como un alcance digital.
chris stratton
chris stratton
usuario4574
chris stratton
usuario4574
chris stratton
usuario4574