--
Has recibido este mensaje porque estás suscrito al grupo "FPGAwars: explorando el lado libre" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a fpga-wars-explorando-el-lado-libre+unsubscribe@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a fpga-wars-explorando-el-lado-li...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/fpga-wars-explorando-el-lado-libre.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/fpga-wars-explorando-el-lado-libre/d64a5db0-7309-4699-8a69-d36ef8c56ca5%40googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.
Hola Juanma y Jose!
Efectivamente, hay algún problema con este grupo y es que hay mensajes que aparecen como borrados sin razón evidente. Me ha pasado anteriormente tanto con mensajes que he enviado yo, como al visitar hilos y ver que en una conversación de 10-15 mensajes faltaban 2-3. Supongo que hay algún filtro que actúa después de que el email se haya reenviado a la lista pero antes de visualizarlo en la web. Y es especialmente curioso, porque el mensaje lo escribí desde groups.google.com (no desde gmail, ni desde un cliente de correo), lo cual quiere decir que el mismo sistema que aceptó enviarlo después decide ocultarlo/borrarlo. Estaría bien saber/conocer si hay algún tipo de filtro de spam que podamos estar haciendo saltar de alguna manera.
Sobre la VGA en si, por no desviar el hilo más de la cuenta, yo en su día implemente un módulo en VHDL para graficar las entradas/salidas de un PID y para dibujar "patrones de ajuste":
https://a.fsdn.com/con/app/proj/ohkis/screenshots/anie_infografia.png (pare superior derecha)
https://vimeo.com/64035600 (min 0:20 y 2:24, respectivamente)
http://sourceforge.net/projects/ohkis/files/anie/doc/Karrera%20Amaierako%20Proiektua.pdf/download (Figuras 1.33 en la página 1-61 (78/259) y 1.35 en la página 1-63 (80/259)).
La cuestión es que utilicé un reloj de 25 MHz para generar una resolución de 640x480 y todos los "cálculos" para decidir el color se hacían al vuelo. Puedes ver en la Figura 1.35 que hay varios bloques de comparación y puertas lógicas entre los registros y la salida, que es la señal "v" de la parte inferior. Esto provocaba que a veces las líneas aparecieran "corridas" en la pantalla, fruto de la latencia/retardo de la señal a través de esas puertas y la consiguiente descompensación con respecto a las señales de sincronía. Hoy en día sé que eso se resolvería simplemente registrando "v" a la salida. Pero me sirve como excusa para plantearte las siguientes dudas:
- ¿Qué resolución estáis generando y qué reloj estáis utilizando para ello?
¿Qué otras resoluciones tenéis pensado utilizar (si es que lo habéis planteado)?
- ¿Generáis las señales de "color" directamente a partir de los contadores de fila/columna o utilizáis algún buffer intermedio? En la Figura 1.35 puedes ver que utilicé un buffer (un bloque RAM) para separar funcionalmente la parte del circuito que generaba qué había que dibujar, y por otro lado la parte que se encargaba de generar las señales de color VGA. Pero en lugar de hacer un buffer de 640x480, lo hice de 640x6 (una fila por cada línea a dibujar), porque en la FPGA que utilicé no había BRAM sufficiente para mantener un buffer de toda la pantalla. Supongo que las ICE estarán justitas también en este sentido.
- ¿Habéis tenido problemas con algún monitor quisquilloso al que no le gusten las señales de sincronía que estáis generando o las resistencias que estáis utilizando para convertir las señales digitales en "analógicas"?
Como bonus, me quedó por probar la generación de más de ocho colores. Utilizando una señal de reloj de 50MHz se podría generar una paleta de 8*8=64 colores. Pero para eso es necesario que el circuito sintetizado sea capaz de ejecutarse a esa frecuencia. ¿Qué frecuencia máxima de ejecución estás obteniendo en la síntesis de vuestros circuitos?
Sobre los contadores y la dificultad para plasmar en hardware algunos algoritmos "secuenciales", si te atascas mucho con algún caso, déjate un mensaje por aquí y vemos si podemos repensarlo de manera más "hardware-friendly".
Con respecto al SAV y las otras fieras, a partir del ejemplo InBit con Vue.js y golang que estuvimos comentando, tengo en el cajón el experimento adjunto. Básicamente, el objetivo de excusa es poder leer un VCD/GHW/FST/CSV y convertirlo a WaveJSON o tikz-timing, para generar SVGs o PDFs, respectivamente. Es una librería con los algoritmos de conversión, una aplicación CLI que utiliza la librería, y un app+backend que utiliza la misma librería. Por el momento en lo que respecta a la GUI, es como el editor de WaveDrom (basado en nodejs), pero en versión cliente-servidor siendo el backend golang, y permitiendo la edición de múltiples waveforms al mismo tiempo (como se ve en el GIF dtd). De hecho, el experimento principal es proveer una "experiencia de escritorio" en la web. Por "experiencia de escritorio" me refiero a tener múltiples "ventanas" y poder moverlas/redimensionarlas como ventanas (ver GIF dtd_windows); o mostrarlas como pestañas (mostrado en el GIF dtd); o usar una librería de "tiling". Y hacerlo recursivo (escritorio "virtual" dentro de una ventana, dentro de otra ventana... hasta que casque). Después añadir la librería xterm (como filemanager) y poder: editar verilog con codemirror (una ventana), ejecutar yosys e iverilog (en otra ventana), y ver el resultado de la simulación en SVG (en una tercera ventana). Idealmente, icestudio podría ser una ventana más, de forma que arrancando una sola imagen docker en segundo plano y accediendo a través de una web (sea de forma local o remota) se tenga acceso a las últimas versiones actualizadas y probadas de icestudio, apio, terminales, visualización de las simulaciones, etc. Algún día ;). Espero que te sea inspirador, mientras tanto.
Un saludo y muchos ánimos con ese Pong!
--
Has recibido este mensaje porque estás suscrito a un tema del grupo "FPGAwars: explorando el lado libre" de Grupos de Google.
Para cancelar la suscripción a este tema, visita https://groups.google.com/d/topic/fpga-wars-explorando-el-lado-libre/DOEzwX4x5aY/unsubscribe.
Para cancelar la suscripción a este grupo y a todos sus temas, envía un correo electrónico a fpga-wars-explorando-el...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a fpga-wars-explora...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/fpga-wars-explorando-el-lado-libre.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/fpga-wars-explorando-el-lado-libre/da56349e-8f88-4eb5-aea1-799ca7269e49%40googlegroups.com.
SB_PLL40_CORE #(.FEEDBACK_PATH("SIMPLE"),
.PLLOUT_SELECT("GENCLK"),
.DIVR(4'b0000),
.DIVF(7'b0111110), //16Mhz
// .DIVF(7'b1010011), //12Mhz
.DIVQ(3'b101),
.FILTER_RANGE(3'b001)
Hola Juanma!
Vamos allá, a ver si puedo responderte... Que sean fáciles... :)
Sólo es comentar qué has hecho y qué no. No puede ser difícil :P
Esa me la sé... :))
A ver,... el primer controlador VGA que hice fue basándome en el de Roland. Me lo tuve que trabajar (no fue un simple copy-paste sin entender) porque Roland usaba una frecuencia de 85Hz de cuadro, pero mi monitor cutre de pruebas no daba para esa frecuencia, así que tuve que modificar y modificar hasta que di con una frecuencia apropiada (la resolución siempre ha sido 640x480). Los parámetros de las frecuencias que encontraba por Internet eran basándose en, precisamente, un reloj de 25Mhz, pero la icezum Alhambra dispone de un reloj del sistema de 12Mhz, con estos 12Mhz al introducirlos en el PLL para obtener una frecuencia de reloj más alta para los sincronismos, unas veces no daba una frecuencia exacta y otras veces no era la estándar que "entendía" mi monitor, hasta que descubrí que los 72Hz de cuadro también estaban dentro del estándar, con 12Mhz se obtenía la frecuencia de pixel exacta (31.5Mhz) para esa resolución y mi monitor se los comía con papas y funcionaba (y parece que en muchos más monitores por las pruebas que se han estado haciendo, con lo que realmente era un estándar, perdido y desconocido por la mayoría pero un estándar).
Supongo que en algún momento habrás dado con ello, pero por si acaso:
http://martin.hinner.info/vga/timing.html
http://tinyvga.com/vga-timing/640x480@73Hz
¿Son esos lo valores de porche que estás utilizando? Pregunto porque como has indicado que te pegaste con ello, igual al final lo dejaste "a mano".
El problema me surge con la TinyFPGA, usa un reloj de 16Mhz pero afortunadamente el PLL de la iCE40 también da una frecuencia exacta de pixel para este reloj, con lo que únicamente se necesita cambiar un parámetro en la definición del módulo del PLL... no sé como lo haré con el Pong porque me gustaría que al menos funcionara en ambas placas con distintos relojes... aún estoy pensando.
¿Un pin externo que seleccione un multiplexor, que a su vez escoja dos (o más) constantes, que sean entradas al IP de configuración del PLL?
Bueno me enrollo.. se me está pegando de ti... eso es que cada vez sé más de estos temas... jajajajajaja
Y yo agradecido. Es el detalle lo que quería :D
La respuesta simple y concreta es: Una controladora VGA de 640x480@72Hz con 3 bits de profundidad de color, usando el PLL a 12Mhz y 16Mhz para ambas placas. :))
Me intriga lo de los bits de profundidad de color. Más abajo lo comento.
¿Qué otras resoluciones tenéis pensado utilizar (si es que lo habéis planteado)?
Pues me dio tanta batalla encontrar una resolución y una frecuencia que funcionara en mi monitor que no me he planteado volver a esa guerra, para mis pruebas, que es lo que más me gusta, me vale con esta resolución, además, aumentar la resolución es aumentar los recursos necesarios... y de LUTs andamos excasos. Lo que sí me he planteado es aumentar la profundidad de color (unas cuantas resistencias más en el conector VGA o un DAC en condiciones), pero por ahora no lo veo esencial (el Pong usa dos colores).
En realidad el consumo de LUTs no es muy diferente. Contar hasta 800 o 1024 requiere tantos bits como contar hasta 640. De 480 a 600 o 768 hay un bit. Pero entiendo que. habiéndote peleado con una, no te interese mirar esa parte y prefieras otras más creativas :D.
En las referencias anteriores, se indica que son necesarios relojes de entre 40 y 50 MHz para 800x600, y entre 65 y 75 MHz para 1024x768. ¿Cuánto es lo máximo a lo que has configurado un PLL? Entiendo que, de alguna forma estás haciendo la siguiente operación 12 * 84/32 = 31'5 y 16 * 63/32 = 31'5. ¿Has probado 16*84/32=42MHz? Aunque la VGA no funcionara, me interesa saber si tuviste algún problema de alimentación/potencia. Si no, ¡16*80/32=40MHz merece una prueba!
Directamente, nada de buffer. Mi planteamiento original era un bloque monolítico de controladora, entregaba una posición x, y del pixel actual que estaba escaneando en pantalla y según esta posición del punto, otro bloque se encargaba de "realimentar" el color en la propia controladora para que, finalmente, lo mostrara por el conector VGA y así se "hiciera realidad" en forma de color.
Así es como funcionaba mi implementación.
La estructura de Sergio Cuenca (a la que me estoy adaptando ahora) es distinta, usa un stream de señales VGA (VGAStr), un registro donde está la posición del pixel y las señales de sincronismo, este stream pasa por un bloque que genera el vídeo, éste se encarga de añadirle, según la posición marcada en el stream ,el color RGB (RGBStr) y es este stream RGB modificado el que se inyecta a otro bloque para generar las señales de salida al conector. Esta estructura es más lineal, más fácil de entender y sincronizar y permite cosas muy interesantes como multiplexar y superponer señales de vídeo (espero el concepto se vea claro en los ejemplos que estoy haciendo para la colección del Pong).
Sea como fuere la estructura que se utilice, actualmente no existe ningún tipo de buffer. Yo me lo planteé en su momento porque tenía problemas en los tiempos de realimentación, pero en la nueva estructura de Sergio no estoy teniendo estos tipos de problemas y por ahora funciona a las mil maravillas. :)
Entiendo, por lo tanto, que sí hay una especie de buffer. Es decir hay un registro de desplazamiento (el stream) de longitud n, donde se almacena la información que va a ser mostrada a continuación. El último componente lee el stream como si fuera una FIFO, decidiendo cuándo parar (porches) y cuándo leer. Pero el buffer no almacena toda la pantalla, ni por asomo.
Debe funcionar bien porque la salida del stream está registrada y prácticamente no hay ninguna lógica entre ésta y el conector VGA. Que es el error que mencioné en mi implementación.
Tengo la duda sobre "el ritmo" al que se trabaja. ¿El stream se va rellenando a un ritmo independiente del de consumo? ¿O el stream entero se para cuando hay porches y todo vuelve a moverse en cuanto llega el primer pixel de la siguiente línea?
Como dices, tiene una muy muy buena pinta de cara a poder hacer "efectos" más complejos y versátiles.
Por lo que yo sé ninguno... yo uso siempre el mismo, pero hay pruebas que ha hecho Obijuan y Sergio por ahí en sus charlas y por ahora ha funcionado siempre... no me ha llegado feedback negativo en ese sentido (si alguien tiene algo que declarar, que lo haga ahora o calle para siempre...). De hecho yo uso unas resistencias mayores de las que propuso Obijuan en su MosterLED y los colores parecen iguales... imagino que no seguirá el estándar Pantone de la colorimetría... pero bueno, para pruebas en plan "maker" sirven. :))
Estandar Pantoqué? XD Todavía vamos a necesitar un Macbook Air Exclusive Pro...
Aquí no te llego a entender... Si no estoy equivocado y me extrañaría que tú lo estuvieras (imagino ha sido un lapsus) el número de colores no depende de la frecuencia de reloj, solo depende de la tensión de entrada a cada pin RGB, con tres resistencias consigues dos tensiones fijas según le pongas un uno o un cero en el pin de salida de la FPGA, por lo tanto son 2^3 = 8 colores distintos. Si necesitas más colores únicamente necesitas más bits de salida, realmente lo ideal es un convertidor digital-analógico que te de un rango de tensiones en los distintos pines, pero esto mismo se puede hacer con un divisor de tensión y una escalera de resistencias... no tiene nada que ver con la frecuencia ni con los sincronismos, que yo sepa... Con lo que no tienes que aumentar al doble la señal de reloj para obtener una paleta mayor.
Como dices, el color depende de la tensión de entrada a cada pin, es una señal analógica. Así, con una escalera de resistencias y 3 pines, tenemos 8 colores. Con una escalera y 6 pines, 64 colores. Con una escalera y 9 pines, 512, etc. Pero, puedes aplicar los principios del Pulse-Width-Modulation. Si utilizando un reloj dado a cada pixel le corresponden 20ns, con un reloj el doble de rápido podrás introducir dos bits (10ns cada uno). Es una PWM de 3 niveles: 0%, 50%, 100%. Si el reloj es cuatro veces más rápido, hay 5 niveles.
Curioso, que yo estaba pensando en multiplexar los bits en el tiempo (PWM), para no modificar el hardware. Por lo que ni se me había ocurrido utilizar varios pines de salida para cada color. Por contra, tú estás pensando en una conversión DAC paralela, y no se te ha ocurrido utilizar PWM. Es gracioso XD
Un saludo
Hola de nuevo Juanma!
Un apunte sobre el PLL y la configuración para diferentes relojes de entrada. Parece ser que las constantes DIVR y DIVF son eso, constantes; por lo que no puedes cambiarlas sin cargar otro bitstream. Lo que puedes hacer es utilizar dos PLL, una detrás de la otra, ya que éstas tienen la opción de BYPASS. Así, si estás en la Alhambra, activas la primera y desactivas la segunda, y viceversa en la TinyFPGA. Esto permite cambiar la frecuencia "en tiempo real", es decir, mediante una señal GPIO; sin necesidad de cargar un bitstream diferente.
Un saludo
El problema de lo que propones (si no entiendo mal es activar y desactivar dos PLL en cascada) es que solo hay una PLL en la 1K (que yo sepa), así que lo puedes hacer quizás con la TinyFPGA (tendría que confirmar que tiene más de un PLL) pero no con la icezum Alhambra... así que estamos en la misma historia... si quieres que funcione para ambas, hay que cargar un bitstream distinto, quieras o no... :(((Y ya que lo cargas... lo cargas con la constante cambiada. :)))
Hola Juanma y Jose!
Efectivamente, hay algún problema con este grupo y es que hay mensajes que aparecen como borrados sin razón evidente. Me ha pasado anteriormente tanto con mensajes que he enviado yo, como al visitar hilos y ver que en una conversación de 10-15 mensajes faltaban 2-3. Supongo que hay algún filtro que actúa después de que el email se haya reenviado a la lista pero antes de visualizarlo en la web. Y es especialmente curioso, porque el mensaje lo escribí desde groups.google.com (no desde gmail, ni desde un cliente de correo), lo cual quiere decir que el mismo sistema que aceptó enviarlo después decide ocultarlo/borrarlo. Estaría bien saber/conocer si hay algún tipo de filtro de spam que podamos estar haciendo saltar de alguna manera.
Sobre la VGA en si, por no desviar el hilo más de la cuenta, yo en su día implemente un módulo en VHDL para graficar las entradas/salidas de un PID y para dibujar "patrones de ajuste":
https://a.fsdn.com/con/app/proj/ohkis/screenshots/anie_infografia.png (pare superior derecha)
https://vimeo.com/64035600 (min 0:20 y 2:24, respectivamente)
http://sourceforge.net/projects/ohkis/files/anie/doc/Karrera%20Amaierako%20Proiektua.pdf/download (Figuras 1.33 en la página 1-61 (78/259) y 1.35 en la página 1-63 (80/259)).
La cuestión es que utilicé un reloj de 25 MHz para generar una resolución de 640x480 y todos los "cálculos" para decidir el color se hacían al vuelo. Puedes ver en la Figura 1.35 que hay varios bloques de comparación y puertas lógicas entre los registros y la salida, que es la señal "v" de la parte inferior. Esto provocaba que a veces las líneas aparecieran "corridas" en la pantalla, fruto de la latencia/retardo de la señal a través de esas puertas y la consiguiente descompensación con respecto a las señales de sincronía. Hoy en día sé que eso se resolvería simplemente registrando "v" a la salida. Pero me sirve como excusa para plantearte las siguientes dudas:
- ¿Qué resolución estáis generando y qué reloj estáis utilizando para ello? ¿Qué otras resoluciones tenéis pensado utilizar (si es que lo habéis planteado)?
- ¿Generáis las señales de "color" directamente a partir de los contadores de fila/columna o utilizáis algún buffer intermedio? En la Figura 1.35 puedes ver que utilicé un buffer (un bloque RAM) para separar funcionalmente la parte del circuito que generaba qué había que dibujar, y por otro lado la parte que se encargaba de generar las señales de color VGA. Pero en lugar de hacer un buffer de 640x480, lo hice de 640x6 (una fila por cada línea a dibujar), porque en la FPGA que utilicé no había BRAM sufficiente para mantener un buffer de toda la pantalla. Supongo que las ICE estarán justitas también en este sentido.
- ¿Habéis tenido problemas con algún monitor quisquilloso al que no le gusten las señales de sincronía que estáis generando o las resistencias que estáis utilizando para convertir las señales digitales en "analógicas"?
Como bonus, me quedó por probar la generación de más de ocho colores. Utilizando una señal de reloj de 50MHz se podría generar una paleta de 8*8=64 colores. Pero para eso es necesario que el circuito sintetizado sea capaz de ejecutarse a esa frecuencia. ¿Qué frecuencia máxima de ejecución estás obteniendo en la síntesis de vuestros circuitos?