Como se ve están agrupados de 16 en 16 (256 glifos) con lo que es más fácil seleccionarlos utilizando los códigos ASCII y dividendo el byte en dos nibbles. Los he pasado con Matlab a un fichero binario (*.list) mediante el mismo método que utilicé en "screen-logo".
La cuestión es que para acceder a los glifos y representarlos en pantalla se necesita "fijarlos" en la FPGA a modo de mapa de memoria, para esto se utilizan todos los recursos de la propia FPGA y es en el sintentizado cuando se decide cómo y dónde guardar esta memoria.
Al hacerlo en la iceZum Alhambra, únicamente he conseguido meter las seis primeras filas de glifos, pero a partir de ahí el integrado se queda sin recursos.
Como véis tenemos también como bloque el módulo UART de recepción de @Obijuan (Gracias como siempre... ;)) y en el ejemplo se trata de que el byte ASCII recibido por el puerto serie de la iceZum Alhambra se represente en pantalla mediante su glifo correspondiente.
El tamaño y el color de este glifo se puede cambiar mediante unos parámetros constantes del bloque "PxsCharacter". Con estas seis filas de glifos llegamos a los símbolos, los número y las mayúsculas, suficiente para unas pruebas rápidas.
Aquí podéis ver un vídeo del funcionamiento del ejemplo.
Os dejo abajo el código por si lo queréis probar. Para probarlo, descomprimir y abrir el fichero "iPxs-Text-icezum.ice", sintetizarlo y grabarlo en la iceZum Alhambra.
Una vez descargado se quedará la pantalla en negro (con un puntito rojo al final... Hay que corregir eso... ;-) ) y en cuanto reciba un byte desde el puerto serie mostrará el glifo en pantalla.
¿Cómo se envía el byte por el puerto serie? Con cualquier terminal que abra el puerto de comunicaciones (a 115200 baudios) de la iceZum Alhambra. Una vez abierto el puerto y desde la terminal, se pulsa el teclado y aparecerá el glifo representativo del código ASCII enviado. Muy chulo... :)))
La cuestión es que para probar he sintetizado el mismo ejemplo (un poco modificado) para la TinyFPGA-B2 incluyendo los 256 glifos completos y me lanza un total de 2167 LUT necesarios (lógico que no entre en la 1K).
En ambos casos, tanto para la iceZum Alhambra como para la TinyFPGA-B2, sobran FF y BRAM... La pregunta es fácil... ¿Por qué diablos el sintetizador no utiliza estos recursos y peta por falta de LUT en la iceZum Alhambra? :)))
Ahí dejo la pregunta... también es verdad que el código en sí del "PxsCharacter" consume muchos recursos... (está hecho a piñón repitiendo el código para cada línea del glifo), pero eso no es óbice (se me notan los años... :-D) para que no los aproveche mejor.
Ya me contáis si llegáis a alguna conclusión. :))))
Saludos
Juan Manuel Rico
--
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/flgb6Y64v3o/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/c8037741-6544-4c8f-b3c2-5f261250a9f8%40googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.
Hola,Lo puedes forzar tu utilizando primitivas de ice40 (busca por lattice ice technology library ), o puedes dejar que el sintetizador las genere por ti (verbo inglés infer, no se si sera inferir en castellano?).Sobre eso, ahora mismo no encuentro, si es que lo tenía, ningún documento específico de lattice ice40 sobre el tema, pero tengo uno llamado "xst user guide",https://www.xilinx.com/support/documentation/sw_manuals/xilinx11/xst.pdf, aunque sea de Xilinx es muy interesante ver las Coding Technics. Miralo. Hay una sección sobre Rom y Ram, con varios ejemplos single port. Dual port. Sincrono, asynchronous.. De hecho detallan patrones de código, verilog y vhdl, para cada tipo de bloque básicoby no tan básico. Lo encontré muy interesante como referencia. Creo que para bloques genéricos de tipo ram, rom, Mux... Aplicará igual en ice40.
El mar., 24 abr. 2018 20:07, Juanma Rico <juan...@gmail.com> escribió:
--
Buenas Alexandre,
gracias por tus felicitaciones, no hay que olvidar que todo empezó con el MonsterLED de Obijuan... :)))
La verdad es que esto de la VGA, cuando la controlas, es una maravilla, te engancha.
El pensar que con únicamente tres resistencias y un conector VGA reciclado dispones de toda una pantalla para hacer experimentos... te abre todo un mundo... Son 640x480 leds de ocho colores distintos...los LED integrados de la placa, los dispositivos OLED y demás para obtener información ya te saben a poco.
En este caso es donde se ve la verdadera potencia de las FPGA, una tarjeta gráfica integrada... donde a los microcontroladoes les cuesta mucho más llegar.
Además, al estar ya todo integrado en bloques y siguiendo la colección de Sergio, hace la cosa mucho más fácil para usar y probar, aunque no se tenga mucha idea de cómo funciona.
Yo animo a todo el mundo a que lo pruebe... que suelde tres resistencias a un conector VGA y lo conecten a un monitor... ya verán, ya... todos los LED del mundo les sabrá a poco. :)))
Y una vez realizada mi soflama para animar a la gente a usar la VGA.... jajajajajaja, vayamos al lío.
He mirado el ejemplo que me comentas de Obijuan. Lo hice en su tiempo y de hecho cojo muchos conceptos de él (como inicializar la memoria con un fichero externo), pero no veo en ningún momento del código en que se obligue a usar BRAM en lugar de registros o FF... se supone que es automático y el sintetizador utiliza los recursos como mejor cree... ¿o no?
Esa es mi duda...
Yo pensaba que era automático, pero por lo visto no... o al menos hay otras formas de pensar en la red...
Saludos
Juan Manuel Rico
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/flgb6Y64v3o/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-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.
reg [datawidth-1:0] mem [nwords-1:0];always @(posedge px_clk)
RGBStr_o[`RGB] <= font[pcy+0][pcx+7]&&....||font[pcy+1][]&&...||font[pcy+2][]&&...reg [0:0] fonts [n_char*width_char*height_char-1:0];assign addr=index_char*width_char*height_char+y_img*width_char+x_img;
// Task 2: Draw the pixel.
always @(posedge px_clk)
begin
// Clone VGA stream in a RGB stream.
RGBStr_o[`VGA] <= RGBStr_i[`VGA];
// Are we inside a character limit?
if (
(RGBStr_i[`XC] > pos_x) && (RGBStr_i[`XC] < (pos_x + psw*8)) &&
(RGBStr_i[`YC] > pos_y) && (RGBStr_i[`YC] < (pos_y + psh*8))
)
begin
// Ok, look for a pixel font.
if ( font[pcy+((RGBStr_i[`YC]-pos_y)>>5)][pcx + 7 - ((RGBStr_i[`XC]-pos_x)>>5)] )
begin
px_color <= color;
end
else
begin
px_color <= RGBStr_i[`RGB]; //TODO: Here you can define a background for a character.
end
end
else
begin
px_color <= RGBStr_i[`RGB];
end
// Update the pixel in stream output RGB.
RGBStr_o[`RGB] <= px_color;
end
font[pcy+((RGBStr_i[`YC]-pos_y)>>5)][pcx + 7 - ((RGBStr_i[`XC]-pos_x)>>5)] process(clk) begin if rising_edge(clk) then
if rst then
Q <= (others=>'0');
elsif RD then
Q <= font(address);
end if;
address <= pcy+((RGBStr_i[`YC]-pos_y)>>5);
pixel <= Q( pcx + 7 - ((RGBStr_i[`XC]-pos_x)>>5 );
process(clk) begin if rising_edge(clk) then
if rst then
rRD <= '0';
else
rRD <= RD;
end if;
process(clk) begin if rising_edge(clk) then
if rst then
px_color <= RGBStr_i[`RGB];
elsif rRD then
px_color <= color when pixel else RGBStr_i[`RGB];
end if;process(clk) begin if rising_edge(clk) then
if rst then
Q <= (others=>'0');
elsif RD then
Q <= font(address);
end if;
address <= pcy+((RGBStr_i[`YC]-pos_y)>>5);
pixel <= Q( pcx + 7 - ((RGBStr_i[`XC]-pos_x)>>5 );
px_color <= color when pixel else RGBStr_i[`RGB];
He mezclado Verilog y VHDL. Pero lo relevante es qué señales están dentro de procesos, y por lo tanto son registros, y cuáles están fuera y son combinacionales.Hola de nuevo,
Juanma, una BRAM es una array, es decir, una matriz unidimensional. La variable font que estás utilizando tiene dos índices. ¿Cómo se supone que tiene que mapear el sintetizador esa matriz a una array? ¿Por columnas? ¿Por filas? Cualquiera sirve, pero simplemente no sabe hacer la conversión y decide que no puede hacerlo con BRAM. Soluciones:
- Como sugiere Sergio, guarda cada caracter como un vector de 64 elementos. En un ciclo de reloj lees todo el caracter y en el siguiente decides en cual de las líneas fijarte, mediante un multiplexor 8:1.
reg [0:0] font [0:(fh*fw)-1];
- Utiliza ocho BRAM en paralelo, que cada una guarde una fila. Es equivalente al anterior, pero más explícito. Puedes decidir leer todas a la vez, o de forma secuencial, ya que no necesitas acceder a todas las filas de un caracter al mismo tiempo. Si lo secuencias, puedes hacer un pipeline o escalera: cuando estés leyendo la última fila de un caracter de la última BRAM, lees la cuarta del siguiente en la BRAM anterior, lees también el de dos caracteres después en la tercera BRAM, etc. Así, en cada ciclo estás leyendo cinco filas, pero cada una corresponde a un caracter diferente.
- Haz tu la conversión a row-major o column-major. Esto implica leer 8 palabras de la BRAM para tomar una sola decisión. Así, para no afectar al throughput, el reloj de lectura de la BRAM debe ser ocho veces más rápido que el del stream.
- Mezcla algunas de las soluciones anteriores. Por ejemplo: dos BRAM en paralelo, conteniendo cada una cuatro filas (medio caracter), y dos multiplexores 4:1 además de un multiplexor 2:1.
Dicho lo anterior, vuelvo a mi libro... Es muy difícil que te imagines un circuito que represente esta línea:font[pcy+((RGBStr_i[`YC]-pos_y)>>5)][pcx + 7 - ((RGBStr_i[`XC]-pos_x)>>5)]
Eso es indicativo de que "te has pasado". Frena un poco ;).
always @(posedge clk)
begin
(...task_1... );
end
always @(posedge clk)
begin
(...task_2... );
end
always @(posedge clk)
begin
(...task_1... );
(...task_2... );
end
No es el código más compacto, pero resulta muy evidente de qué componentes básicos se componen. El segundo, por ejemplo, de arriba abajo: una BRAM, dos sumadores/restadores, dos sumadores/restadores y un multiplexor 8:1, un multiplexor 2:1 (o una puertas and y or, ya que px_color es un solo pixel). Se ve también que la latencia es de un sólo ciclo. Y se puede intuir que la frecuencia de trabajo se puede ver limitada por que hay dos sumadores encadenados a un multiplexor, encadenado a otro multiplexor. De hecho, el primer ejemplo, aunque ocupe más código, permite frecuencias de operación mayores, porque hay un registro en medio de esa cadena.
Recuerda que en aplicaciones de tipo stream la latencia es tu amiga. No importa cuantos registros encadenes, siempre que una vez echado a andar todos ellos avancen al mismo ritmo. Puedes aprovechar esto para dividir tu circuito en etapas y simplificar cada una de ellas. ¡Divide y vencerás!
Saludos
// 2 stages pipeline
assign addr={VGAStr_i[`addy],VGAStr_i[`addx]};
// Stage0: read pixel
always @(posedge px_clk)
begin
AuxStr1[`HS]<=VGAStr_i[`HS]; AuxStr1[`VS]<=VGAStr_i[`VS];
AuxStr1[`XC]<=VGAStr_i[`XC]; AuxStr1[`YC]<=VGAStr_i[`YC];
AuxStr1[`Active]<=VGAStr_i[`Active];
pixel <= logo [addr];
end
// Stage1: draw Logo pattern
always @(posedge px_clk)
begin
RGBStr_o[`HS]<=AuxStr1[`HS]; RGBStr_o[`VS]<=AuxStr1[`VS];
RGBStr_o[`XC]<=AuxStr1[`XC]; RGBStr_o[`YC]<=AuxStr1[`YC];
RGBStr_o[`Active]<=AuxStr1[`Active];
if(AuxStr1[`Active])
RGBStr_o[`RGB]<= pixel? ink: background;
else
RGBStr_o[`RGB]<=black;
endalways @ //calculo dirección y la registro
reg addr <= ....
always @ // leo memoria
reg pixel<= fonts[addr]
always @ // dibujo pixel
RGBStr[] <= ....
--
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/flgb6Y64v3o/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/ccb99b88-8b77-494e-a8a7-fa1186f50949%40googlegroups.com.
--
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/flgb6Y64v3o/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 una entrada 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 este debate en la Web, visita https://groups.google.com/d/msgid/fpga-wars-explorando-el-lado-libre/6c1a8db2-fd60-4ed3-bbfd-446fe1292a5d%40googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/d/optout.
La explicación exacta del proceso está aquí.
Saludos
Juan Manuel Rico
Generé un módulo de prueba para el módulo de ROM, hice un copy-paste lo adapté un poco y efectivamente se lo tragó. :)))
Vemos como sintetiza finalmente usando la BRAM y el uso de 4 tiene su sentido. (Do the math!)
son 256 glifos de 8x8 bits... luego 256x8x8 = 16384Kb y si se usan 512x8x4 tenemos los mismos 16384Kb... Aprovechamiento máximo de la BRAM... :)))
Lo siguiente es ver si generando un nuevo bloque PxsCharacter la cosa mejora... el esquema que seguí es mantener, en la medida de lo posible, el fichero list tal y como estaba y tal y como se generaba desde Matlab, es decir 16 glifos de 8x8 por fila con 16 columnas de glifos, por tanto, la ROM nos devuelve por cada dirección una fila completa del glifo direccionado por pcx y pcy (8bits). Se complica un poco el cálculo de la dirección de la ROM, pero se gana en tiempo de edición del fichero list.
El bloque entonces se compone de otros dos bloques DynCharacter.ice (con su DynCharacter.v correspondiente) y fontROM.ice (con su código en verilog correspondiente), el primer bloque, según la posición indicada externamente y la obtenida del flujo RGB, pide a la ROM el valor de cada línea del glifo y así interpreta los píxeles a dibujar.
Me ha sido relativamente fácil echarlo a andar porque esto mismo hice hace muuucho tiempo con el logo de FPGAwars y más o menos me acordaba, pero claro, sin usar la BRAM, como todo... "a ciegas y a lo loco"... con lo que en el logo iba muy justito de LUTs y menos mal que sólo rebotaba por la pantalla... siempre se aprende algo en esto de las FPGA... ;))
En definitiva, este es el aspecto final del bloque PxsCharacter.ice
Como véis es una ROM porque no hay posibilidad de habilitar la escritura... un cero patatero a piñón fijo.... :)))
Una vez construido el PxsCharacter queda probarlo introduciéndolo en un stream RGB de prueba. Como el primero que hice sin BRAM, se utiliza el puerto serie para mostrar el código ASCII recibido en pantalla.
Y listo... ¡¡Funciona!! ¡¡Conseguidoooooo!! :))
Vemos como se utilizan 4 bloques BRAM y nos deja libre más de la mitad de los LUTs... Ahora a por la consola de texto... ¡Que ya cabe!... jejejejejeje :)))
Saludos
Juan Manuel Rico
Se complica un poco el cálculo de la dirección de la ROM, pero se gana en tiempo de edición del fichero list.
Saludos y Gracias
// Cálculo del direccionamiento en la ROM con 'font.list'
addr_rom <= pcy*fw + glyph_y*gc + pcx;
// Cálculo del direccionamiento en la ROM con 'BRAM_8.list'
addr_rom <= {character,glyph_y};
Tienes toda la razón del mundo... Vi tantos "for" anidados que me echó para atrás y pensé... "Este Unai... complicándome la cosa con lo sencillo que es,... y a mi sin funcionarme todavía lo de la BRAM, que es lo que necesito ahora mismo" jejejejejeje... Prepotencia de aprendiz... Lo siento Sensei, no volverá a ocurrir... ;))
Por cierto @Unai, ya he corregido el direccionamiento como me recomendaste, usando la BRAM_8.list que genera tu script de Matlab se hace todo mucho más sencillo. Para prueba un botón.La diferencia como véis es brutal, se eliminan dos multiplicaciones y dos sumas y se puede prescindir de la separación del byte "character" en "pcx" y "pcy".// Cálculo del direccionamiento en la ROM con 'font.list'
addr_rom <= pcy*fw + glyph_y*gc + pcx;
// Cálculo del direccionamiento en la ROM con 'BRAM_8.list'
addr_rom <= {character,glyph_y};
Gracias Unai... Ahora va mucho más rápido, ¿Qué no?... yo ya noto la diferencia de Megahercios... jejejejejejeje :))
There is subtle timing issue in this circuit. Because of the block RAM implementation,
the font ROM's output suffers a one-clock-cycle delay. However, since the p i x e l - t i c k
signal is asserted every two clock cycles, the p i x e l x signal remains unchanged within
this interval and the corresponding bit (i.e., f o n t - b i t ) can be retrieved properly.
--
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/flgb6Y64v3o/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/7c95b6a1-fef2-4064-8141-1200619ac4a9%40googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.
--
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/flgb6Y64v3o/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/2d5bbec4-c014-41e9-9ded-bb8e653b9d71%40googlegroups.com.
Con esta forma de resolver los problemas lo que hago es crear "realimentaciones de información", provocando un retraso en el pipeline (el propio flujo de la información, en este caso de la información del stream RGB). Al combinar bloques en icestudio con código puro y duro, estos retrasos son difíciles de detectar en el código Verilog si uno no lo tiene en cuenta cuando lo está escribiendo y, como pasa en las realimentaciones de control real, los retrasos en el lazo de control hace que las cosas sean inestables si no se tiene el suficiente cuidado.
Bueno, pues hay que resolver estas "realimentaciones de bloque internas", saber cuanto retrasa el flujo de información y, además, los distintos bloques que componen el PxsConsole, deben estar sincronizados para obtener un stream RGB coherente (hay bloques que retrasan un pixel, otros dos...etc).
Bueno pues a falta de un estudio más exhaustivo de todo los retrasos y realimentaciones de los bloques en su conjunto (utilizaré la técnica propuesta por Unai)... para apaciguar el SAV he estado toqueteando por aquí y por allá con un cálculo "intuitivo" de los retrasos y sincronías en el ejemplo de la consola (Test-PxsConsole.ice) y la cosa ha mejorado muchísimo, el logo se ve mucho más estable y lo mismo pasa con los caracteres: todo es más estable. Aún así hay un pixel que se me escapa en la sincronización, pero realmente no hay color en lo referente a la estabilidad. Imagino que cuando lo estudie todo con calma quedará listo, mostrando todos los píxeles de los glifos correctamente y preparado para ser integrado en la colección iPxs. :)))
--
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/flgb6Y64v3o/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/47f1aafb-5837-4f25-94c4-942d8bcc6e73%40googlegroups.com.
Seguramente al final acabe teniendo que aprender técnicas de simulación y optar por una simulación como dices (que no me apetece nada, la verdad... ), pero bueno... mientras tanto, como "Engué Endomo" de "Amanece que no es poco", voy haciendo eses por la calle porque así se difruta más del camino.... :)))
Saludos
--
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/flgb6Y64v3o/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/589d2a14-efa9-4251-9506-46bdef16ffdd%40googlegroups.com.
He estado probando añadir un bit más a la dirección de la vídeo RAM, pero no es posible... se intenta completar la memoria completa que pueden direccionar esos 13 bits de la dirección con BRAM... y claro, no tiene suficiente... así que lo dejaremos así, en 80x51 para 8 bits de tamaño (ya probaré con la TinyFPGA la pantalla completa).
@Unai cojo el guante de las issues de GitHub (primero tengo que ver que es eso.... ).
Cualquier código de pre/post procesamiento de los datos me parece muy útil, el único requisito que pondría es que no haya que instalarse más herramientas, por ejemplo se pueden crear plugins para Gimp2 pero eso supone instalarse el Gimp más un tutorial de como utilizar los plugins, lo mismo pasa con código matlab/octave. Lo ideal sería fuentes C/python y proporcionar también el ejecutable para no tener ni que compilarlo. Pero vamos que cualquier solución es bienvenida.
commit 272d71bd27c0d736e50fd263f2131b1a5c9ef61b (HEAD -> master)
Author: Juan Manuel Rico <juanmard@gmail.com>
Date: Fri May 4 08:58:05 2018 +0200
Repetición de memoria e integrado.
assign cursor = (
(RGBStr_i[`XC] >= abs_x) && (RGBStr_i[`XC] < (abs_x + size)) &&
(RGBStr_i[`YC] >= abs_y) && (RGBStr_i[`YC] < (abs_y + size))
) ? 1 : 0;
// Are we inside a character limit?
if (
(RGBStr_i[`XC] >= posx_i) && (RGBStr_i[`XC] < (posx_i + psw*gw)) &&
(RGBStr_i[`YC] >= posy_i) && (RGBStr_i[`YC] < (posy_i + psh*gh))
)
begin
RGBStr_o[`RGB] <= gline[glyph_x] ? color_fg : ( alpha ? RGBStr_i[`RGB] : color_bg);
end
| // Generate sync pulses (active low) and active video. | |
| assign hsync = (hc >= hfp && hc < hfp + hpulse) ? 0:1; | |
| assign vsync = (vc >= vfp && vc < vfp + vpulse) ? 0:1; | |
| assign activevideo = (hc >= blackH && vc >= blackV) ? 1:0; | |
| // Generate color. | |
| always @(posedge px_clk) | |
| begin | |
| // First check if we are within vertical active video range. | |
| if (activevideo) | |
| begin | |
| x_px <= hc - blackH; | |
| y_px <= vc - blackV; | |
| end | |
| else | |
| // We are outside active video range so display black. | |
| begin | |
| x_px <= 0; | |
| y_px <= 0; | |
| end | |
| end |
| always @(*) begin | |
| rgb <= 3'b000; | |
| if (activevideo3) begin | |
| if ( font_bit ) | |
| rgb <= 3'b010; | |
| else if (px_y3 == 0 || px_y3 == 479 || px_x3 == 0 || px_x3 == 639 ) | |
| rgb <= 3'b001; | |
| else | |
| rgb <= 3'b000; | |
| end | |
| else | |
| rgb <= 3'b000; | |
| end |
--
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/flgb6Y64v3o/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/8c6cc69a-0404-4edd-b12d-197eca71f1ee%40googlegroups.com.
Que guay!Creo que yo ese glitch no lo tenia, porque en a la hora de determinar el valor del RGB, por defecto lo pongo a un valor fijo (3'b 000). Y (redundante), si activevideo es 0, tambien lo fijo a 000:
always @(*) begin rgb <= 3'b000; if (activevideo3) begin if ( font_bit ) rgb <= 3'b010; else if (px_y3 == 0 || px_y3 == 479 || px_x3 == 0 || px_x3 == 639 ) rgb <= 3'b001; else rgb <= 3'b000; end else rgb <= 3'b000; end Ademas, al no usar iPxs, mi activevideo si era correcto.
Sobre lo que comentabas en el mail anterior, te recomiendo siempre instanciar los bloques indicando los nombres de los puertos. Asi evitaras ese problema / efecto segundario.
Sobre lo de que te quepa la tile mem de 80x60 (x8 bit), no te cabe?? 80x60x8 son 38400 bit, es menos que 10x4Kb. Son 10 bloques de BRAM.
En esta version mia, si que sintetiza en 10 bloques de BRAM (+4 para la Font), si quieres mirar (no la he probado en el VGA aun):After placement:PIOs 14 / 96PLBs 82 / 160BRAMs 14 / 16Happy #SAV
--
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/flgb6Y64v3o/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/5d1be0df-2087-4f9d-a8f7-a225a27e8e09%40googlegroups.com.
--
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/flgb6Y64v3o/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/560c9161-7822-48df-a700-dbba94d86f46%40googlegroups.com.