cálculo de temporización de la señal VGA utilizando MCU

5

Quiero generar señal VGA con microcontrolador. Pero me cuesta mucho encontrar una solución en línea para generarlos en el software. Por ejemplo Por lo general, toda la generación de señales VGA en línea simplemente explica los requisitos de temporización para HSYNC y VSYNC junto con la temporización del porche trasero y frontal con algunos valores fijos como 640x480 a 60Hz o 1024x786 a 70Hz, etc. otras cosas. Entonces, cómo calcular el tiempo para VSYNC y HSYNC junto con el porche delantero y trasero para cualquier resolución aleatoria con alguna frecuencia de actualización aleatoria, por ejemplo. 480x240 @ 60Hz?

Gracias por las respuestas. Ashutosh

    
pregunta Ashutosh

3 respuestas

3

Es bastante fácil calcular todo lo que necesita solo a partir de la información básica provista.

Por ejemplo, el sitio que más utilizo para una referencia es este: enlace y lo tiene todo. se necesita 640x480 @ 60Hz (especifica las resoluciones más comunes, pero es la más sencilla de usar).

Especifica todo en píxeles y líneas, y proporciona una frecuencia de reloj de píxeles, así como frecuencias de actualización. Sin embargo, todo lo que necesitas es el reloj de píxeles y la cantidad de píxeles para cada cosa.

Por ejemplo, da un reloj de píxeles de 25.175 MHz. No es fácil para la mayoría de los microcontroladores generar, ya que es de alta frecuencia y alta resolución; en general, puede tener uno de esos dos: alta frecuencia o alta resolución. Sin embargo, 25MHz suele ser lo suficientemente fácil de generar y está "lo suficientemente cerca" para que la mayoría de los monitores puedan lidiar con él.

Así que tenemos un reloj de píxeles de 25MHz. También tenemos un tamaño de "línea completa" de 800 píxeles. Ese tamaño incluye los porches, la sincronización y el área visible. Por lo tanto, una línea de 800 píxeles, a un reloj de 25MHz, se ejecutaría a (25,000,000 / 800) 31250 Hz, o una línea cada 32µS.

El pulso de sincronización horizontal (96 píxeles) sería (96 / 25,000,000) = 3.84µS de largo.

Sabemos que una línea toma 32µS, y hay 525 líneas en un "cuadro completo", por lo que 0.000032 × 525 = 0.0168s para un cuadro, o 59.524Hz. Eso está bastante cerca de los 60Hz para la especificación.

Por lo tanto, dado un reloj de píxeles y un conjunto de períodos de píxeles, puede calcular cualquier cosa. Por supuesto, también puedes ir hacia atrás. Dada una velocidad de fotogramas y una resolución que puedes calcular:

$$ 60Hz × 525 = 31500Hz $$

$$ 31500Hz × 800px = 25.2MHz $$ Eso demuestra que incluso las especificaciones dadas no son 100% exactas, pero hay un poco de flexibilidad en los tiempos VGA para que pueda doblar su reloj para que se adapte a usted dentro de ciertos límites.

Y mientras estamos en ello, generar VGA puramente con software requiere mucho procesamiento y, a menudo, te deja sin ciclos de CPU para hacer cualquier cosa. Uno de los "trucos" más comunes para hacer una señal VGA en una CPU es usar SPI para generar el flujo de datos de píxeles. Aún mejor si tiene DMA en su microcontrolador para generar una línea completa de datos sin que la CPU tenga que hacer nada. La CPU es la única responsable de generar los pulsos de sincronización y de cargar el sistema DMA con las direcciones correctas; el resto se realiza en segundo plano. Por supuesto, eso te deja con solo una pantalla monocromática de 1 bit. Si tiene una interfaz SQI y suficiente RAM, podría hacer que una pantalla de 4 bits (16 colores) sea lo suficientemente fácil.

    
respondido por el Majenko
1

Aunque no proporciona las fórmulas, esta página tiene una calculadora que le permite seleccionar de una lista de VGA o SVGA (hasta 1920 x 1080), y muestra una docena o más de parámetros diferentes. Luego, puede modificar cualquiera de estos parámetros manualmente, y volverá a calcular elementos como las frecuencias de sincronización, la duración de los pulsos, etc.

Esta página es otra que solo tiene tablas de parámetros para varias resoluciones, en cuatro tablas con más de cien entradas diferentes en total.

    
respondido por el tcrosley
0

Esta es una pregunta difícil porque está muy estrechamente relacionada con la arquitectura de MCU y los circuitos generadores de imágenes que estás usando. Lo he hecho al comenzar a definir macros que me permiten calcular varias cosas útiles, como ciclos de reloj por línea, etc., y luego adaptarlas al hardware que estoy usando.

Aquí hay un fragmento de código que he escrito para este propósito. Con toda probabilidad, no será útil para usted como tal, pero podría mostrar un posible enfoque del problema.

/// Crystal frequency in MHZ (float, observe accuracy)
#define XTAL_MHZ 3.579545
/// Line length in microseconds (float, observe accuracy)
#define LINE_LENGTH_US 31.777557 
/// Frame length in lines (visible lines + nonvisible lines)
#define TOTAL_LINES 525
/// Number of visible lines in frame (excluding any border areas)
#define VISIBLE_LINES 480
/// Number of lines used for VSYNC
#define SYNC_LINES 2
/// Number of lines used after the VSYNC but before visible area
#define FRONT_PORCH_LINES 10

#define HSYNC_WIDTH_XTALCLKS 14
#define BACKPORCH_BORDER_XTALCLKS 14

#define FRONTPORCH_BORDER_XTALCLKS 12
/// Number of visible pixels (excluding any border areas)
#define VISIBLE_PIXELS 100
/// Width, in PLL clocks, of each pixel
#define PLLCLKS_PER_PIXEL 8
/// How many bits per pixel - this must match with the pattern generator microcode
#define BITS_PER_PIXEL 16

#define WORDS_PER_LINE ((VISIBLE_PIXELS * BITS_PER_PIXEL + 15) / 16)
#define FIRST_LINE (SYNC_LINES + FRONT_PORCH_LINES)
#define PLL_MHZ (XTAL_MHZ * 8.0)
#define PLLCLKS_PER_LINE ((u_int16)((LINE_LENGTH_US * PLL_MHZ)+0.5))
#define COLORCLKS_PER_LINE ((u_int16)((LINE_LENGTH_US * XTAL_MHZ)+0.5))
...and so on...
    
respondido por el PkP

Lea otras preguntas en las etiquetas