Cómo resolver problemas de velocidad en un sistema de doble superposición + video superpuesto

0

Decidí comenzar un pequeño proyecto durante este descanso para crear una GPU muy simple. En lo que respecta a la GPU, por ahora es simplemente recibir píxeles y emitir píxeles a SDRAM. Además, hay otra parte del circuito que obtendrá datos de píxeles de la SDRAM y los enviará a una pantalla LCD (ya he hecho el controlador de tiempo para la pantalla LCD, solo necesito una interfaz a la SDRAM que tenga sentido). La última parte de alguna manera hace una superposición de video con un flujo de algún tipo de sensor CCD / CMOS. En cuanto a la SDRAM, he hecho controladores antes y tengo suficiente conocimiento de VHDL para hacer esto, por lo que no es un problema. Mi principal problema viene con el tiempo.

Primero que nada, la pantalla LCD funciona a 9MHz, por lo que está bien, por lo que toma ~ 111 ns por píxel con un tiempo de configuración de 25 ns antes de la caída. Supongamos que estoy ejecutando el SDRAM a 100MHz. Después de una configuración de ráfaga, puedo obtener 10 ns por píxel, así que mientras estemos en una ráfaga, hay tiempo más que suficiente para obtener los datos. Pero esta velocidad es solo en una ráfaga. Si tuviera que cargar la fila cada vez, la estaría cerrando. Esto significa que durante el tiempo en el que necesito leer activamente los datos de la pantalla LCD, estoy completamente sujeto a ella. No escribe.

La única vez que puedo hacer las escrituras son durante las columnas (~ 480 col) ~ 4100ns de Hsync en cada línea (~ 280 líneas) y las ~ 525000ns durante Vsync. Supongamos que en el peor de los casos, mi GPU necesita escribir en cada píxel de la pantalla. Esto significa que puedo hacer ~ 410 píxeles por Hsync, lo que deja unos cien píxeles más o menos que necesito escribir durante el Vsync. Estos datos de escritura se escribirán en un área de segundo fotograma en la memoria (por lo tanto, doble búfer).

La sincronización funciona, ... asumiendo que mi GPU tiene su propio caché de píxeles (grande) durante sus tiempos de espera y así sucesivamente. Ese es un problema que voy a tratar más tarde. Mi principal problema en este momento es la superposición de video. Además de lo que está sucediendo actualmente, tengo mis datos de píxeles del CCD / CMOS. Después de mi peor uso de GPU, tengo menos de ~ 525000ns para escribir 480x280 (~ 1344400ns), lo que es definitivamente imposible en un orden de un poco menos de 3.

¿Estoy haciendo algo terriblemente mal? ¿Cómo hace esto la computadora que tengo delante de mí ahora? La pantalla es TAN mucho más grande y dudo que existan SDRAMS con una latencia MUCHO más corta (tal vez DDR). :(

    
pregunta Koma

2 respuestas

0

Veo dos preguntas aquí, cada una con su propia respuesta.

Primero cómo multiplexar la SDRAM. Mi sugerencia sería tomar un montón de píxeles de salida del SDRAM en una ráfaga, guardarlos en una memoria externa más pequeña o FIFO (fácil si su plataforma de implementación lógica es un FPGA) y luego enviarlos a la pantalla LCD a su velocidad más lenta. Durante ese tiempo, la GPU puede utilizar la SDRAM. Cuando te quedes sin píxeles en la cola, reclama la SDRAM de la GPU y obtén otro grupo.

En segundo lugar, cómo hacer la superposición. Sencillamente, para obtener el mejor rendimiento, no confirme los datos superpuestos en la SDRAM, en su lugar, póngalos en su propia memoria y multiplexéelos (o se mezclen de manera transparente con) la salida de la SDRAM bajo el control de una máquina de estados con parámetros de tamaño programables.

    
respondido por el Chris Stratton
0

Explicar exactamente qué hacer es mucho más que lo que podemos hacer en un foro como este. Dicho esto, necesitas buffers o FIFOs. Cada lectura y escritura en SDRAM debe ser una ráfaga en la que se utiliza cada palabra de la ráfaga. Los datos se almacenarán temporalmente en FIFO u otros tipos de búferes para acomodar las transferencias de ráfagas.

Los FIFO también ayudan a lidiar con los retrasos de arbitraje cuando varias cosas intentan acceder a SDRAM al mismo tiempo.

La otra forma de acelerar las cosas es usar un bus de datos más amplio para SDRAM.

    
respondido por el user3624

Lea otras preguntas en las etiquetas