La idea es sencilla, se descargan en la flash cuatro bitstream distintos pertenecientes a cuatro cirtuitos sintetizados distintos y mediante dos pines externos a la FPGA (IO) y tras un reset, ésta pasa a comportarse de cuatro maneras distintas según los bitstream cargados. Todo esto sin necesidad de descargar por USB y mediante el PC el nuevo bitstream que refleja dicho comportamiento.
Para investigar esta posibilidad, lo primero era ver la disposición de los pines que se ven involucrados en este proceso y su disposición en la placa, no me ha sido fácil y me ha costado cierto trabajo encontrar la numeración de los pines entre tanta documentación sobre iCE40 pero finalmente, en la página web de Lattice, encontré uno entre tantos otros documentos excel donde aparece la numeración adecuada al modelo y empaquetado del chip que usa la iceZUM Alhambra.
En él podemos comprobar que el encapsulado en el que hay que fijarse es el TQ144 y los pines los enmarcados en rojo.
Los primeros son los más interesantes puesto que, como bien dice Unai, los de SPI son un bus y se pueden "pinchar" en cualquier punto que interese. Se localiza la numeración de los pines en el esquemático y aparecen sin conectar (buena señal).
Así que visto lo visto, al menos se puede intentar una prueba de "Cold Boot" con nuestra iceZUM Alhambra. De todas formas me surgen dudas por no saber si no influirán más de la cuenta las conexiones existentes a los pines CDONE y CRESET_B, e incluso es posible que se necesite algún "truco" para descargar cuatro bitstream distintos en la misma flash y por el USB conectado al FTDI... pero ya iremos informando.
De momento, el que se encuentre interesado por esta posibilidad y quiera investigarla dispone del documento de Lattice TN1248 (Página 14) donde se describe el proceso, si se consigue algún progreso o se llega a un callejón sin salida, siempre dispondremos de este hilo para ir comentándolo. Quién sabe... igual en un futuro Icestudio debe disponer para nuestra placa de cuatro pestañas distintas con los cuatro distintos esquemas que se podrían activar con un par de "switchs" en la propia placa... jejejejejeje :)
Saludos.
Saludos
- Usage: icemulti [options] input-files\n");
- -c
- coldboot mode, power on reset image is selected by CBSEL0/CBSEL1
- -p0, -p1, -p2, -p3
- select power on reset image when not using coldboot mode
- -a<n>, -A<n>
- align images at 2^<n> bytes. -A also aligns image 0.
- -o filename
- write output image to file instead of stdout
--
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 una entrada 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 este debate en la Web, visita https://groups.google.com/d/msgid/fpga-wars-explorando-el-lado-libre/e5cac79a-e704-41cd-a965-7e664d6cdfc6%40googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/d/optout.
--
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.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/fpga-wars-explorando-el-lado-libre/4c3db4d5-30ba-4515-bc6e-330b44731736%40googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.
$ icemulti -p0 -o coldboot.bin counter8.bin blink.bin pushbutton_and.bin led_on.bin
$ iceprog coldboot.bin
init..
cdone: high
reset..
cdone: low
flash ID: 0x20 0xBA 0x16 0x10 0x00 0x00 0x23 0x54 0x82 0x46 0x06 0x00 0x56 0x00 0x29 0x19 0x01 0x16 0xA4 0xB5
file size: 130524
erase 64kB sector at 0x000000..
erase 64kB sector at 0x010000..
programming..
reading..
VERIFY OK
cdone: high
Bye.
Donde "coldboot.bin" es la imagen final a grabar en la iceZUM Alhambra (o iCEstick) que se genera a partir de las otras cuatro imágenes sintetizadas (counter8.bin, blink.bin, pushbutton_and.bin y led_on.bin). Tras estos comandos, efectivamente la imagen se ha cargado y se ha puesto en funcionamiento el primer bloque sintetizado (el contador de 8 bits), cambiando -p0 por -p1 al terminar la carga se utiliza la síntesis del "blink.bin"... y así con el resto, con lo que se confirma que la imagen se genera correctamente y se carga la adecuada.
Por ahora queda probar la opción "-c" para elegir la imagen mediante los pines CBSELx, pero eso requiere intentar soldar a los pines 64 y 65 de la iCE40HX "algo" para tenerlos accesibles. y se puedan manipular... aún tengo que pensar como hacerlo.
Aún así he hecho la prueba con "-c" y parece que la iCE40HX toma los pines al aire como HIGH, porque por más que pulso el reset (yo esperaba fuera aleatorio) siempre carga la imagen cuatro (led_on.bin).
Y esas son las pruebas que he podido hacer para calmar el SAV. Lo siguiente será imaginar cómo hacer para imponer en los pines un valor concreto y elegir la imagen adecuada intentando no dañar la iceZUM Alhambra. Si alguien tiene alguna idea estoy abierto a sugerencias... :)
Seguiré informando (muchísimas gracias Unai).
Saludos.
¡Y ha funcionado! Se cargan las imágenes tal cual... con un simple reset tenemos el contador y tras soltar el cable y hacer un reset tenemos el led encendido... así que con una selección adecuada en los pines 63 y 64 y un reset... ¡¡podemos seleccionar entre cuatro circuitos hardware distintos sin tener que sintetizar de nuevo!! jejejejejeje
La posibilidades de tener cuatro circuitos distintos para ser usados con un solo reset aún ni me las puedo imaginar...
Ahora queda tomar las señales de esos pines, hacerlos accesibles sin riesgos y con alguna shield que lo controle, elegir entre una u otra... incluso intentar que desde la propia FPGA se mantengan los niveles con algún circuito tipo "memoria" para hacer una "FPGA autoreconfigurable". La imaginación se me dispara... :)
--
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/e6a1384b-b6d6-44c8-95a9-10d9cb7791d6%40googlegroups.com.
Felicidades!!! Es genial poder hacer eso!!!
--
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 una entrada 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 este debate en la Web, visita https://groups.google.com/d/msgid/fpga-wars-explorando-el-lado-libre/317ee104-7bb2-4e3d-b8fa-126c0a644c86%40googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/d/optout.
Así que arriesgándome mucho he puesto un cablecillo en equilibrio entre los dos pines, con lo que ambos (63 y 64) están a GND y debería, sin volver a programar la iceZUM Alhambra, cargar la imagen primera (el contador de 8 bits) y si suelto el cable, la última (la del led_on)...
Ahora queda tomar las señales de esos pines, hacerlos accesibles sin riesgos y con alguna shield que lo controle, elegir entre una u otra... incluso intentar que desde la propia FPGA se mantengan los niveles con algún circuito tipo "memoria" para hacer una "FPGA autoreconfigurable". La imaginación se me dispara... :)
Esta es la posible implementación en la Alhambra que sólo requeriría un punto de soldadura al reset (más accesible que las patillas 63 y 64, creo).
NOTA: todos los diseños sintetizados deberán incluir una pequeña parte lógica para guardar los valores de los vectores asociados a cada posición de los pulsadores. Si alguno no lo incluye, se podrá cambiar de otro a este, pero no volver a cambiar después.
NOTA2: si la FPGA no puede usar el hard-core SPI (que debería poder hacerlo) habría que implementar en la lógica un pequeño maestro. El código está hecho, sólo sería utilizarlo.
Saludos!
$ apio build
$ icemulti -p0 -o warmboot.bin hardware.bin counter8.bin led_on.bin blink.bin
$ iceprog warmboot.bin
Muchas felicidades Juanma! Me alegra ver que todo funciona según lo esperado.
Con respecto a hacer alguna otra prueba "sin tocar nada del hardware", ¿podríamos hacer un 'mapa' de coldboot.bin?Algo así:
- Sabemos que tiene cinco bloques diferenciados: el applet y los cuatro bitstream.
- Podemos hacer un hexdump de cada uno de los cuatro bistream, y de cooldboot.bin.
- Podemos localizar la primera y última línea de cada bitstream en coldboot. El espacio restante por delante es el applet.
0x0000 > applet (empieza)
0xXXX1 < applet (termina)
0xXXX2 > counter8.bin
0xXXX3 < counter8.bin
0xXXX4 > blink.bin
0xXXX5 < blink.bin
0xXXX6 > pushbuttton_and.bin
0xXXX7 < pushbuttton_and.bin
0xXXX8 > led_on.bin
0xXXX9 < led_on.bin
0xXXXa fin de la memoria
¿Me ayudas a rellenar las direcciones 0xXXX con los datos de tu coldboot.bin? Si es tal como supongo:
- 0xXXX1 y 0xXXX2 serán consecutivas. Los mismo que 3 y 4, 5 y 6, 7 y 8. Por lo que basta con un valor de cada pareja.
- El contenido de los bitstream no nos interesa, porque ya los tenemos por separado.
- ¿Podrías copiar aquí el hexdump del applet íntegro?
- Si puedieras hacerlo para los dos casos (-p0 y -p1), nos ayudaría a entender si lo que hace es cambiar los punteros, o si guarda los bitstream en diferente orden físicamente.
$ icemulti -p0 -o coldboot_p0.bin counter8.bin blink.bin pushbutton_and.bin led_on.bin
$ icemulti -p1 -o coldboot_p1.bin counter8.bin blink.bin pushbutton_and.bin led_on.bin
$ iceprog coldboot_p0.bin
init..
cdone: low
reset..
cdone: low
flash ID: 0x20 0xBA 0x16 0x10 0x00 0x00 0x23 0x54 0x82 0x46 0x06 0x00 0x56 0x00 0x29 0x19 0x01 0x16 0xA4 0xB5
file size: 130524
erase 64kB sector at 0x000000..
erase 64kB sector at 0x010000..
programming..
reading..
VERIFY OK
cdone: high
Bye.
Intentaremos encontrar las direcciones en el applet, para pogramar sólo el puntero de inicialización por defecto. Así se podrá cambiar la imagen desde Apio, aunque las dos patillas de selección estén sin conectar (Alhambra 1.1).
También permitirá cambiar la imagen utilizando cualquier patilla de la FPGA, y no exclusivamente las dos explícitamente indicadas para ello.
Al mismo tiempo, podremos comprobar cuál es el efecto de la opción de alineación al llamar a icemulti. No la has utilizado, pero es muy interesante, y su función resultará evidente una vez hayamos resuelto el mapa anterior. Especialmente si los bitstream tienen diferentes tamaños (deberían).
Un saludo!
para volver a hacer una prueba se hace un reset general y se vuelve a la imagen inicial de selección. :)
El problema de la prueba es que se pierde una imagen al tener que sintetizar el "seleccionador de imágenes", por eso mejor usar el "cold boot"... pero bueno, para probar sin tener que soldar nada... vale... :D
Ahora solo queda dejar todo esto ordenadito y a disposición de todos. Si alguien (Obijuan?) me indica en qué proyecto de GitHub lo debo incluir, en un rato mañana lo hago y así queda como un ejemplo más para las posibilidades de nuestra iceZUM Alhambra. :)
Estudiaré todas vuestras propuestas de hardware (el de la aguja hipodérmica sospecho que lo voy a terminar usando... :D) y muy posiblemente sean necesarias en otras FPGAs que no dispongan del "warm boot", pero nuestra iceZUM Alhambra... afortunadamente la tiene, lo que nos permite probar y experimentar sin peligro.
--
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/a65fc775-83b7-4931-8d47-c9d27c3c4054%40googlegroups.com.
Por lo tanto, el applet ocupa los primeros 256 bytes. Después, aunque es ineficiente, cada imagen ocupa un bloque de 32KB. No existen los 'punteros', hay un único puntero:
'0001' p0 1
'0080' p1 128
'0100' p2 256
'0180' p3 384
'0200' p4 512
'0280' p5 640
'0300' p6 768
'0380' p7 896
'0400' p8 1024
'0480' p9 1152
...
'0980' -p19 2432
NOTA: es cierto que el primer bloque es de 32K-256 bytes. Pero no es problema porque eso son 32512 bytes, que es más que 32220.
La conclusión es que en la Alhambra, que si no me equivoco tiene una flash de 32Mb/4MB (@Obijuan?), entran 128 diseños, estando el último situado en 127*128=16256, '0x3F80'. El icestick otro tanto de lo mismo.
¿Hay ánimos para hacer una 'biblioteca' en formato BIN? Una sola programación que permita elegir cualquiera de los hasta 128 diseños y cambiar de uno a otro con el sistema de pulsadores que ha comentado Juanma. Tareas necesarias:
- Empaquetador alternativo a icemulti. Posible contribución a icestorm.
- CLI para cambiar la imagen activa por USB.
- LUT y FSM en Verilog/VHDL para cambiar la imagen activa desde la FPGA por SPI.
Saludos
Es decir, existen dos modos que funcionan prácticamente igual, pero uno se activa externamente (cold boot) y otro internamente (warn boot).
La confusión quizás venga por el título del hilo... pero es que se empezó a investigar el modo "cold boot" pensando que era el fácil y hemos terminado descubriendo el modo "warn boot" que resulta ser más "cómodo" para experimentar y cacharrear... y claro, el título ya no corresponde... :)
Espero tus pruebas en la iCEStick. :)
Saludos.
Saludos y gracias por la ayuda :D
--
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/aN_vYtDCEyo/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.
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/85259365-2509-456b-b9e4-25cbff79b4af%40googlegroups.com.
Qué tema más interesante! Enhorabuena por los experimentos!
En la última release de la toolchain de icestorm he incluido el binario de icemulti. Si véis que puede simplificar el proceso podemos crear un nuevo comando en apio que encapsule esta funcionalidad y así esté disponible en todas las plataformas, lo dejo a vuestra elección ;)
Un saludo.
El jueves, 9 de marzo de 2017, 9:50:26 (UTC+1), Juanma Rico escribió:
No, no hice nada diferente, simplemente no activé la opción "-c".No me hagas mucho caso, pero creo que icestorm o icemulti (no sé exactamente cual ni en qué punto) detecta de alguna manera que está instanciado el módulo top de sb_warmboot y coloca un valor especial en la cabecera de la flash (lo que llaman 'applet') que hace activar uno u otro modo.No investigué mucho el código de icemulti porque todo tan rodado y funcionó tan rápido que no tuve que investigar mucho más allá. ;)Pero si descubres algo interesante... ¡no dejes de avisar! 😊Saludos
El 09/03/2017 09:10, <una...@gmail.com> escribió:
Hola Juanma,--
Revisando tus pasos, me parece que no has hecho nada diferente en icemulti al crear las imágenes para cold boot y warm boot. Es decir, el diseño es lógico es diferente, pero ¿has indicado en algún sitio que querías activar el warm boot? En el manual TN1248 se explica que hay que activar una pestaña para ello.
Un saludo
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/aN_vYtDCEyo/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-lib...@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/85259365-2509-456b-b9e4-25cbff79b4af%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/aN_vYtDCEyo/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.
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/14715962-18fa-4320-889d-f23421845029%40googlegroups.com.
No, no hice nada diferente, simplemente no activé la opción "-c".
No me hagas mucho caso, pero creo que icestorm o icemulti (no sé exactamente cual ni en qué punto) detecta de alguna manera que está instanciando el módulo top de sb_warmboot y coloca un valor especial en la cabecera de la flash (lo que llaman 'applet') que hace activar uno u otro modo.
No investigué mucho el código de icemulti porque todo tan rodado y funcionó tan rápido que no tuve que investigar mucho más allá. ;)Pero si descubres algo interesante... ¡no dejes de avisar! 😊
Aupa Juanma,
2017-03-09, 9:50:26 (UTC+1), Juanma Rico:No, no hice nada diferente, simplemente no activé la opción "-c".No me hagas mucho caso, pero creo que icestorm o icemulti (no sé exactamente cual ni en qué punto) detecta de alguna manera que está instanciando el módulo top de sb_warmboot y coloca un valor especial en la cabecera de la flash (lo que llaman 'applet') que hace activar uno u otro modo.
El applet no es 'un valor', son 256 bytes. Estos incluyen, entre otra información:
- Puntero a la imagen por defecto si -c no se usa.
- Los cuatro punteros a cada una de las cuatro imágenes. Esto último se me había pasado por alto, pero también está en el dump.
- Des/activación del coldboot.
- Des/activación del warmboot.
void Header::write(std::ostream &ofs, uint32_t &file_offset)
{
// ...
// Boot mode
write_byte(ofs, file_offset, 0x92);
write_byte(ofs, file_offset, 0x00);
write_byte(ofs, file_offset, (coldboot_flag? 0x10: 0x00));
¿Podrías pasarme los binarios 'warmboot' y 'hardware', además de uno de los 'coldboot' usando '-c'? El caso es que en los dos ejemplos que me pasaste, sólo cambia el quinto puntero, el default, por lo que me faltan datos para comparar.
Tengo la sensación de que la (des)activación del coldboot y warmboot es la misma, y que el icemulti tiene hardcodeado ese parámetro. Al fin y al cabo, si activas siempre el warmboot, pero el diseño lógico no está conectado a los pines internos, no pasa nada. Me gustaría confirmarlo.
Otro aspecto sobre el que estoy dudando es si, en caso de escribir una sola imagen, se escribe algún applet o la imagen empieza en la posición 0 de la flash. En principio no lleva nada, pero en ese caso me falta entender qué diferencia hay entre eso y grabar un coldboot. Puesto que el primero se supone que no tiene que hacer ningún salto, y el segundo sí.
No investigué mucho el código de icemulti porque todo tan rodado y funcionó tan rápido que no tuve que investigar mucho más allá. ;)Pero si descubres algo interesante... ¡no dejes de avisar! 😊
Por el momento estoy acumulando las referencias en https://github.com/1138-4EB/go/tree/master/elide/dynreconfig
He corregido los cálculos, y entran 127 diseños, no 128. Si se sustituye/modifica icemulti para generar binarios más compactos, 130. Pero el iCE40 en sí, puede direccionar hasta 511 o 520.
Por eso, me he calentado un poco y me he pillado un par de icestick, además de una flash de 64Mb (1€), otra de 128Mb (2,25€). La idea es sustituir la memoria en una de ellas, y si no explota nada, la otra en la segunda. Como necesitaba un par de euros para completar el pedido, he cogido también una iCEHX4K-TQ144. Me ha parecido que es pin-compatible con la de 1K, y la diferencia es de 5,25€ a 6,15€. En este caso veo jodido (que no imposible) sustituir el chip que ya está soldado, por lo que se quedará en el cajón hasta que me anime a pedir un PCB.
Saludos!
/// static const int NUM_IMAGES = 4;
static const int NUM_IMAGES = 8;
static const int NUM_HEADERS = NUM_IMAGES + 1;
static const int HEADER_SIZE = 32;
$ ./icemulti -p0 -o multiimage.bin hardware.bin coldboot.bin blink.bin coldboot_p0.bin coldboot_p1.bin counter8.bin led_on.bin pushbutton_and.bin
$ iceprog multiimage.bin
init..
cdone: low
reset..
cdone: low
flash ID: 0x20 0xBA 0x16 0x10 0x00 0x00 0x23 0x54 0x82 0x46 0x06 0x00 0x56 0x00 0x29 0x19 0x01 0x16 0xA4 0xB5
file size: 552960
erase 64kB sector at 0x000000..
erase 64kB sector at 0x010000..
erase 64kB sector at 0x020000..
erase 64kB sector at 0x030000..
erase 64kB sector at 0x040000..
erase 64kB sector at 0x050000..
erase 64kB sector at 0x060000..
erase 64kB sector at 0x070000..
erase 64kB sector at 0x080000..
programming..
reading..
VERIFY OK
cdone: high
Bye.
$ ./icemulti -p7 -o multiimage.bin counter8.bin led_on.bin blink.bin pushbutton_and.bin counter8.bin led_on.bin pushbutton_and.bin hardware.bin
$ iceprog multiimage.bin
como este fin de semana no voy a disponer de la iceZUM alhambra, me he puesto a mirar y hacer pruebas con el icemulti y dejar el github para el finde...
Sí, con applet me refería a esos 256 bytes... En el documento he creído entender que siempre tiene que estar y siempre lo lee empezando por la dirección cero de la PROM, por eso hablaba de la "cabecera de la flash" como applet. Corrígeme si estoy equivocado.
Ok, lo he mirado en icemulti y efectivamente lo que hace es sustituir en la cabecera un 0x10 por un 0x00 si se activa o no el modo "cold boot" con "-c".
Me asustas con esos nuevos datos... si se eligen bien las síntesis de circuitos... ¡igual solo hay que programar la flash una vez en la vida! :)
jajajajaja ¿Y tú eras el que me decía que no me calentara demasiado? :D
TODO: CLI to rearrange pointers. measure and compare reconfiguration time.
- Write pack_cp0.bin to flash.
- Change default pointer only, through FTDI.
- Rearrange the pointers, through FTDI.
- Pack more than four images and write the binary to flash.
- Set a fifth image as default (which is not referred by any of the four pointers).
- Rearrange the poiners, through FTDI.
--
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/aN_vYtDCEyo/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.
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/c8f4c80b-a0c3-49b2-bcf8-9fdd44d05585%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/aN_vYtDCEyo/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.
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/c8f4c80b-a0c3-49b2-bcf8-9fdd44d05585%40googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a fpga-wars-explorando-el-lado-lib...@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/c8f4c80b-a0c3-49b2-bcf8-9fdd44d05585%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/aN_vYtDCEyo/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.
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/CAOpm3532g%2Byr53hxiynge_L-YNw%3DPhe2v7nJ2stubzumy6GNcg%40mail.gmail.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/fpga-wars-explorando-el-lado-libre/CAOpm3532g%2Byr53hxiynge_L-YNw%3DPhe2v7nJ2stubzumy6GNcg%40mail.gmail.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/aN_vYtDCEyo/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.
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/CAGZZdDGXUaLZjZG30wCpp_zTsQgbYFwtw-TBumU-_xwayaCccQ%40mail.gmail.com.
$ time ./icemulti -p7 -o multiimage.bin counter8.bin led_on.bin blink.bin pushbutton_and.bin counter8.bin led_on.bin pushbutton_and.bin hardware.bin
real 0m0,056s
user 0m0,004s
sys 0m0,004s
$ time iceprog multiimage.bin
init..
cdone: high
reset..
cdone: low
flash ID: 0x20 0xBA 0x16 0x10 0x00 0x00 0x23 0x54 0x82 0x46 0x06 0x00 0x56 0x00 0x29 0x19 0x01 0x16 0xA4 0xB5
file size: 258048
erase 64kB sector at 0x000000..
erase 64kB sector at 0x010000..
erase 64kB sector at 0x020000..
erase 64kB sector at 0x030000..
programming..
reading..
VERIFY OK
cdone: high
Bye.
real 0m52,058s
user 0m0,144s
sys 0m0,632s
$
$ time iceprog counter8.bin
init..
cdone: high
reset..
cdone: low
flash ID: 0x20 0xBA 0x16 0x10 0x00 0x00 0x23 0x54 0x82 0x46 0x06 0x00 0x56 0x00 0x29 0x19 0x01 0x16 0xA4 0xB5
file size: 32220
erase 64kB sector at 0x000000..
programming..
reading..
VERIFY OK
cdone: high
Bye.
real 0m7,452s
user 0m0,020s
sys 0m0,140s
$
--
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/7e73620e-b2e3-47b0-ab0a-783c75703d0b%40googlegroups.com.
$ ./icemulti -p7 -o pack.bin counter8.bin led_on.bin pushbutton_and.bin counter.bin shift4.bin blink.bin tones.bin hardware.bin
0x000120 - counter8.bin
0x007EFC - led_on.bin
0x00FCD8 - pushbutton_and.bin
0x017AB4 - counter.bin
0x01F88C - shift4.bin
0x027664 - blink.bin
0x02F440 - tones.bin
0x037218 - hardware.bin
$ cmp -l pack.bin pack_mod.bin | gawk '{printf "%08X %02X %02X\n", $1, strtonum(0$2), strtonum(0$3)}'
0000004A 00 02
0000004B 7E 76
0000004C FC 64
000000CA 02 00
000000CB 76 7E
000000CC 64 FC
$ iceprog pack_mod.bin
init..
cdone: high
reset..
cdone: low
flash ID: 0x20 0xBA 0x16 0x10 0x00 0x00 0x23 0x54 0x82 0x46 0x06 0x00 0x56 0x00 0x29 0x19 0x01 0x16 0xA4 0xB5
file size: 258036
erase 64kB sector at 0x000000..
erase 64kB sector at 0x010000..
erase 64kB sector at 0x020000..
erase 64kB sector at 0x030000..
programming..
reading..
VERIFY OK
cdone: high
Bye.
$ ./iceprog -mv dummy.txt
init..
cdone: high
reset..
cdone: low
flash ID: 0x20 0xBA 0x16 0x10 0x00 0x00 0x23 0x54 0x82 0x46 0x06 0x00 0x56 0x00 0x29 0x19 0x01 0x16 0xA4 0xB5
Programming test multi...
write enable..
prog 0x000029 +0x001..
00
prog 0x00002A +0x001..
7e
prog 0x00002B +0x001..
fc
waiting..
cdone: high
Bye.
token del applet con puntero a imagen default
token del applet con puntero a imagen A
token del applet con puntero a imagen B
token del applet con puntero a imagen C
token del applet con puntero a imagen D
puntero imagen 1, puntero imagen 2, puntero imagen 3, puntero imagen 4, puntero imagen 5...
...
puntero imagen 127
token inicio imagen 1
...
token inicio imagen 2
...
El algoritmo es leer de una posición y escribir en otra.
Es más, si en lugar de 3 bytes por imagen utilizamos seis o los que sean, se puede escribir un UID relacionado con un repositorio de bitstreams. De forma que el usuario indique el UID del bitstream que quiere, y si no sabe en que posición está escrito, se puede buscar en el índice cuál le corresponde. Aunque es cierto que esa equivalencia podría ser un fichero auxiliar al bistream del pack, el hecho de que esté en la flash dá más versatibilidad para hacer programaciones parciales de la memoria de forma dinámica.
¡Vaya ritmo que llevas! Casi no me da tiempo a procesar y actualizar las notas :D
Como observación los 'tokens' nos los he 'descubierto' yo. Están en la página de clifford, donde se explica el formato del bitstream. Igual está enlazado un poco antes en las notas y no se entiende claramente que sólo he copiado y pegado.
Es muy interesante lo de que escriba todas las cabeceras y no sólo cuatro, pero yo diría que es 'culpa' tuya. Al modificar icemulti a huevo, repite el mismo proceso para cualquier número de imágenes. Lo suyo sería que en el applet se escribieran sólo cuatro, que son las esperadas por el cold/warm boot.
De todas formas, como ha funcionado, sabemos que podemos meter cualquier contenido después de los cuatro punteros. Y no tenemos que respetar el límite de 256 bytes, ya que eso es una decisión de clifford. Conocemos lo suficiente sobre el funcionamiento ahora, para saber que las imágenes pueden ir donde nos plazca.
Es más, creo que el siguiente esquema tiene bastante sentido:token del applet con puntero a imagen default
token del applet con puntero a imagen A
token del applet con puntero a imagen B
token del applet con puntero a imagen C
token del applet con puntero a imagen D
puntero imagen 1, puntero imagen 2, puntero imagen 3, puntero imagen 4, puntero imagen 5...
...
puntero imagen 127
token inicio imagen 1
...
token inicio imagen 2
...
Donde cada puntero de imagen >4 son sólo tres bytes. De esta forma en la flash tenemos todas las imágenes y un índice completo compactado. Da igual que utilicemos el FTDI o la FPGA, no hay que guardar los punteros en ningún sitio. Sólo tenemos que saber:
- Qué imagen queremos poner.
- En cuál de las cinco posiciones queremos ponerla.
El algoritmo es leer de una posición y escribir en otra.
Es más, si en lugar de 3 bytes por imagen utilizamos seis o los que sean, se puede escribir un UID relacionado con un repositorio de bitstreams. De forma que el usuario indique el UID del bitstream que quiere, y si no sabe en que posición está escrito, se puede buscar en el índice cuál le corresponde. Aunque es cierto que esa equivalencia podría ser un fichero auxiliar al bistream del pack, el hecho de que esté en la flash dá más versatibilidad para hacer programaciones parciales de la memoria de forma dinámica.
Por último, lo que comentas de iceprog, creo que lo suyo es empezar al revés: intenta leer todo el applet. Después, intenta leer sólo una línea del applet. Por último, intenta escribir. Igual ya lo has hecho, y estoy escribiendo por escribir.
Un saludo y felicidades!
Gracias Eladio, cada día es un orgullo y un placer poder trabajar con tu "criatura", todo lo que hagamos para ella es poco. :)
--
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/aN_vYtDCEyo/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.
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/55a05942-da2c-4249-b8ee-6ea31142e7ee%40googlegroups.com.
Le he echado un vistazo rápido a los enlaces y sí, es prácticamente una traducción de la programación que hace iceprog al Arduino (quitando las funciones del FTDI, claro). Ha confirmado lo que me tiene bloqueado y no me deja avanzar (además de que aún no he tenido tiempo de sentarme esta semana en el laboratorio), la flash se programa al parecer por bloques (¿64kb?) y no me deja cambiar únicamente un byte de una dirección concreta, así que imagino que habrá que leer un bloque, modificar el byte de dicha dirección y volver a grabarlo (¿antes hay que borrar el bloque completo?).
Each page of memory can be individually programmed. Bits are programmed from one
through zero. The device is subsector, sector, or bulk-erasable, but not page-erasable.
Bits are erased from zero through one. The memory is configured as 4,194,304 bytes (8
bits each); 64 sectors (64KB each); 1024 subsectors (4KB each); and 16,384 pages (256
bytes each); and 64 OTP bytes are located outside the main memory array.
Mi falta de experiencia en este tipo de memorias me tiene sin poder hacer una prueba rápida (me he bajado muchos documentos y datasheet de este tipo de memorias pero en un vistazo rápido no me lo aclaran y tengo que poder sentarme a "estudiar" el tema).
La idea en mi cabeza para completar el hilo es la siguiente: primero controlarlo todo usando el FTDI (el PC con su USB) para escribir el menor número de bytes posible en la flash para cambiar los vectores (esto permitirá que todos los que tengan una Alhambra puedan usar el programa para aprovechar al máximo la flash y cambiar de una a otra imagen sintetizada, en esta fase ya se podria pensar en integrar en icestudio el icemulti), luego usar directamente el SPI con el Arduino (tu enlace viene genial) para cambiar los vectores (ya no necesitaríamos el PC) y en una fase posterior cambiar directamente la configuración de la FPGA por SPI aunque dicha configuración se vaya al perder la alimentación (imagino que es más rápido que cambiar la flash, resetear y leer de la flash la configuración completa de nuevo) y como fase final que desde la propia FPGA se puedan cambiar estos vectores y saltar de una a otra imagen sin intervención externa de un micro o similar.
No obstante, por el momento estoy limitándome al comando go-icemulti pack, que es prácticamente lo mismo que el icemulti original, pero admite más de cuatro imágenes y genera un índice compacto con metainformación (además de los punteros en sí). Este hilo lo he abierto justamente por esa metainformación. En principio voy a identificar cada imagen con una cadena "vendor:library:image:version:revision", de la que seguramente obtendré un hash.
Le he echado un vistazo rápido a los enlaces y sí, es prácticamente una traducción de la programación que hace iceprog al Arduino (quitando las funciones del FTDI, claro). Ha confirmado lo que me tiene bloqueado y no me deja avanzar (además de que aún no he tenido tiempo de sentarme esta semana en el laboratorio), la flash se programa al parecer por bloques (¿64kb?) y no me deja cambiar únicamente un byte de una dirección concreta, así que imagino que habrá que leer un bloque, modificar el byte de dicha dirección y volver a grabarlo (¿antes hay que borrar el bloque completo?).
Por lo que estuve mirando la semana pasada, sí, las flash pueden exigir que se borre un sector entero antes de escribir. Borrar es poner todos los valores a 1. Digo 'pueden' porque la clave está en que las operaciones de escritura sólo son capaces de cambiar unos a ceros.
Por lo tanto, si la modificación que queremos hacer implica sólo quitar unos, no es necesario el borrado. Si intentas cambiar un cero a un uno, no pasa nada. Por eso tú no viste diferencias en las pruebas que hiciste. ¿Probaste a activar el coldboot por defecto y después intentar desactivarlo con una sola escritura?
No obstante, la solución más general es que se requiera también cambiar ceros a unos. Por lo que, como comentas, la estrategia sería leer el sector más pequeño posible, modificar el contenido, hacer un borrado y reescribir el nuevo contenido. Entendiendo un poco cómo funcionan tiene sentido: tú escribes a un buffer (de 256 bytes en este caso) y cuando terminas se hace una copia instantánea de ese buffer a la página correspondiente. Al leer es lo mismo: se copian 256 bytes de golpe y luego tú los lees en serie. Puedes verlo en la página 12 de la datasheet.
Icemulti (y creo que iceprog también) borran la memoria en sectores de 64KB (fíjate en las mayúsculas, son bytes). Pero el modelo concreto que lleva la Alhambra soporta los siguientes modos (primera página de la datasheet):
• Erase capability
– Subsector erase 4KB uniform granularity blocks
– Sector erase 64KB uniform granularity blocks
– Full-chip erase
Explicado en más detalle en la página 12 de la datasheet:Each page of memory can be individually programmed. Bits are programmed from one
through zero. The device is subsector, sector, or bulk-erasable, but not page-erasable.
Bits are erased from zero through one. The memory is configured as 4,194,304 bytes (8
bits each); 64 sectors (64KB each); 1024 subsectors (4KB each); and 16,384 pages (256
bytes each); and 64 OTP bytes are located outside the main memory array.
Por lo tanto, este modelo en concreto sólo tiene granularidad de borrado hasta el nivel de subsector. Desconozco si otros modelos permiten hacerlo a nivel de página.
Como conclusión:
- Para escribir el pack: borrar en sectores de 64KB.
- Para cambiar una sola imagen, borrar 8 sectores de 4KB. O bien, uno de 64KB guardando previamente la otra imagen que este en el sector.
- Para cambiar el applet y activar el coldboot, borrar el primer subsector de 4KB. Para desactivarlo, no es necesario borrar.
Mi falta de experiencia en este tipo de memorias me tiene sin poder hacer una prueba rápida (me he bajado muchos documentos y datasheet de este tipo de memorias pero en un vistazo rápido no me lo aclaran y tengo que poder sentarme a "estudiar" el tema).
Espero que estas pistas anteriores te ayuden ;)
La idea en mi cabeza para completar el hilo es la siguiente: primero controlarlo todo usando el FTDI (el PC con su USB) para escribir el menor número de bytes posible en la flash para cambiar los vectores (esto permitirá que todos los que tengan una Alhambra puedan usar el programa para aprovechar al máximo la flash y cambiar de una a otra imagen sintetizada, en esta fase ya se podria pensar en integrar en icestudio el icemulti), luego usar directamente el SPI con el Arduino (tu enlace viene genial) para cambiar los vectores (ya no necesitaríamos el PC) y en una fase posterior cambiar directamente la configuración de la FPGA por SPI aunque dicha configuración se vaya al perder la alimentación (imagino que es más rápido que cambiar la flash, resetear y leer de la flash la configuración completa de nuevo) y como fase final que desde la propia FPGA se puedan cambiar estos vectores y saltar de una a otra imagen sin intervención externa de un micro o similar.
Esa es exactamente la hoja de ruta. Lo de escribir desde Arduino directamente en la FPGA es exactamente lo mismo que escribir en la Flash, por lo que es una prueba, más que un paso adicional.
Yo ahora mismo estoy peleándome para echar a andar el icestick con las herramientas de Lattice en Windows 10. Icecube2 funciona perfectamente, y he podido sintetizar, analizar el floorplan, hacer estimaciones de consumo de potencia, simulación post-síntesis... Pero no hay manera de que el programador se conecte a la placa. El driver lo reconoce, pero al escanear da error.
He probado con Zadig, que es lo que utiliza apio/icestudio, y no hay problema. Pero quiero echar a andar el toolchain del fabricante, para asegurarme de no hacer alguna burrada.
go-icemulti lo estoy haciendo con Cobra, de forma que cuando se implemente todo, la API quede algo así como:lzp2 es un algoritmo de compresión basado en tokens bastante sencillo, con el que he podido comprimir cada bistream de 32KB a 1KB. Naturalmente, utilizarlo implica un cambio de estrategia, en el siguiente sentido: en la flash sólo están descomprimidas las cinco imágenes iniciables por hardware. Por lo tanto, los punteros son siempre los mismos y la operación "cambio de puntero" lo que hace es descomprimir una imagen y guardarla en la posición correspondiente al puntero indicado.
- go-icemulti pack -m -o mypack.bin -b 0 -p 1,2,3,4 -v -c lzp2
- go-icemulti read all
- go-icemulti read pack
- go-icemulti read image 12
- go-icemulti write pack myback.bin
- go-icemulti write index
- go-icemulti write refs -b 5 -p 6,7,8,9
- Si se ejecuta desde el Arduino, como has comentado, se puede leer la imagen, descomprimirla y configurar la FPGA directamente. En este caso la flash es sólo un almacenamiento de alta capacidad para el Arduino.
- Si se ejecuta desde la FPGA, hay que leer la imagen, descomprimirla, escribirla y después resetearse (volviendo a leerla). Es más lento, pero tiene el potencial de disponer de miles de circuitos sin necesidad de ninguna CPU externa.
No obstante, por el momento estoy limitándome al comando go-icemulti pack, que es prácticamente lo mismo que el icemulti original, pero admite más de cuatro imágenes y genera un índice compacto con metainformación (además de los punteros en sí). Este hilo lo he abierto justamente por esa metainformación. En principio voy a identificar cada imagen con una cadena "vendor:library:image:version:revision", de la que seguramente obtendré un hash.
Saludos
La última pregunta no la entiendo bien... imagino que por "coldboot" te refieres a "warnboot" (decidí usar esta característica del iCE40HX por no tener que andar con cables), pero aún así no entiendo... ¿Por "coolboot por defecto" te refieres al bitstream tal y como te lo entrega icemulti con los cinco vectores en el sitio indicado por el orden de empaquetamiento y el parámetro "-px" para el vector de reset? Si te refieres a esto... la respuesta es afirmativa, con el iceprog modificado (que está adjunto en uno de los mensajes) y la opción "-m" escribo "a piñón fijo" en una dirección de memoria de la flash correspondiente a uno de los vectores (la 0x29 creo recordar) un valor de prueba... pero claro, sin borrar el bloque... y es ahí donde al leer la flash (con iceprog) se ven ceros y algunos bytes con otros valores.
No sé a qué datasheet te refieres... ¿el de la memoria flash N25Q032A? Me he bajado como tres distintos de distintos fabricantes de esa misma memoria flash y claro, no me coinciden las páginas... :(
No, creo que no. Icemulti no usa nada la comunicación serie con la flash, no tiene parámetros para borrar ni programar ni nada... únicamente se encarga de empaquetar los distintos ficheros "bin" de distintas síntesis en uno solo que es el que luego se graba con iceprog... (seguro que ha sido un lapsus tuyo). Respecto iceprog y a los 64KB, eso sí... además te avisa con un mensaje cada vez que borra un sector.
Perfecto, entonces lo único que hay que hacer es leer el primer subsector (4KB,... muchos me parecen), borrarlo (llenarlo de unos), modificar los vectores y volver a grabar esos 4KB con los vectores ya modificados. En cuanto pueda sentarme en el laboratorio lo pruebo en la iceZUM Alhambra (desgraciadamente tengo por delante otro fin de semana en que no voy a poder). De todas formas me parecen muchos 4KB para cambiar solo tres bytes de un vector de dirección... pero bueno. :(
- Para cambiar el applet y activar el coldboot, borrar el primer subsector de 4KB. Para desactivarlo, no es necesario borrar.
Esto no lo entiendo... cambiar el applet sí (realmente yo cambiaría solo los cinco vectores que apuntan a las imágenes) y tal como yo había pensado... pero no entiendo lo de "Para desactivarlo, no es necesario borrar" ¿Por qué no es necesario borrrar?
Tienes razón... pero eso de quitarte de en medio el FTDI y no tener que depender del PC... para mi es un avance, un logro :)Incluso si funciona estoy pensando en soldar un Arduino Nano a una shield protoboard y conectarla directamente a la iceZUM Alhambra mediante el SPI... así ya tenemos el uC que pedías para controlar la FPGA... :)
¿No va a enlentecer la compresión demasiado el cambio de imágenes?¿No complicará este cambio cuando se quiera hacer desde la propia FPGA sin intervención de un uC externo? ¿Con la de sitio que hay en la memoria es necesario?¿Conveniente crear una fuente de posibles errores?
- Si se ejecuta desde la FPGA, hay que leer la imagen, descomprimirla, escribirla y después resetearse (volviendo a leerla). Es más lento, pero tiene el potencial de disponer de miles de circuitos sin necesidad de ninguna CPU externa.
¿Quién descomprimiría?¿La propia FPGA?¿No consumiría muchos recursos? Mira que hablamos de la 1K... :)
¡Perfecto! Pero el icemulti ya guarda más de una imagen y únicamente hay que cambiar una constante... lo hace (muy ineficientemente, pero lo hace...)
¿Cómo tienes pensado acceder a esa metainformación?¿Desde la propia FPGA?¿Desde el PC?
El proyecto es estupendo... ¿Pero crees que es necesario acceder a esos bitstream comprimidos cuando ya disponemos de las fuentes Verilog y del software libre necesario para que cualquiera pueda generarlos?¿La idea sería conectar la placa con la FPGA a un puerto ethernet sin necesidad del PC ni de la toolchain de icestorm? ¿Para qué?
Ya me dices cuales son tus ideas al respecto... :)
La última pregunta no la entiendo bien... imagino que por "coldboot" te refieres a "warnboot" (decidí usar esta característica del iCE40HX por no tener que andar con cables), pero aún así no entiendo... ¿Por "coolboot por defecto" te refieres al bitstream tal y como te lo entrega icemulti con los cinco vectores en el sitio indicado por el orden de empaquetamiento y el parámetro "-px" para el vector de reset? Si te refieres a esto... la respuesta es afirmativa, con el iceprog modificado (que está adjunto en uno de los mensajes) y la opción "-m" escribo "a piñón fijo" en una dirección de memoria de la flash correspondiente a uno de los vectores (la 0x29 creo recordar) un valor de prueba... pero claro, sin borrar el bloque... y es ahí donde al leer la flash (con iceprog) se ven ceros y algunos bytes con otros valores.
Utilizo los términos cold/warm indistintamente, ya que a efectos de sistema hacen exatamente lo mismo. Me refiero a programar el bistream tal como te lo entre icemulti con el parámetro -c. Y, después, sin borrar nada, grabar el mismo pack pero generado sin el parámetro -c. En ese caso la reprogramación debería ser efectiva. Este es el experimento mínimo para comprobar que puedes hacer cambios de un solo bit, si es para pasar a cero.
No sé a qué datasheet te refieres... ¿el de la memoria flash N25Q032A? Me he bajado como tres distintos de distintos fabricantes de esa misma memoria flash y claro, no me coinciden las páginas... :(
La que estoy mirando es la de Micron: https://www.micron.com/~/media/documents/products/data-sheet/nor-flash/serial-nor/n25q/n25q_32mb_3v_65nm.pdf
Yo no he encontrado ningún otro fabricante con esa misma referencia. ¿Cuáles estás manejando?
No, creo que no. Icemulti no usa nada la comunicación serie con la flash, no tiene parámetros para borrar ni programar ni nada... únicamente se encarga de empaquetar los distintos ficheros "bin" de distintas síntesis en uno solo que es el que luego se graba con iceprog... (seguro que ha sido un lapsus tuyo). Respecto iceprog y a los 64KB, eso sí... además te avisa con un mensaje cada vez que borra un sector.
Efectivamente, ha sido un lapsus mío. Me refería que en los los que pusiste se veía lo de los 64KB que comentas. Pero es por lo que dices, que con icemulti o sin él, siempre utilizas iceprog. Fallo de mi memoria, por haber visto el resultado de tus comandos en lugar de ejecutarlos yo ;).
Perfecto, entonces lo único que hay que hacer es leer el primer subsector (4KB,... muchos me parecen), borrarlo (llenarlo de unos), modificar los vectores y volver a grabar esos 4KB con los vectores ya modificados. En cuanto pueda sentarme en el laboratorio lo pruebo en la iceZUM Alhambra (desgraciadamente tengo por delante otro fin de semana en que no voy a poder). De todas formas me parecen muchos 4KB para cambiar solo tres bytes de un vector de dirección... pero bueno. :(
Bueno, a 33MHz lees esos 4KB en 2ms (suponiendo que por cada bit de información necesites enviar otro adicional). Aún así, no hay que leerlo entero. Si utilizas la opción `A` de icemulti, alineará también p0, por lo que la colocará en 32KB, en lugar de en la posición 256. Así, sólo tienes que leer 256 bytes, borrar el subsector de 4KB, y reescribir sólo los 256.
Siguen siendo 512 lecturas/escrituras para cambiar 3 bytes. Pero trantándose de memoria Flash y como estamos obligados a mantenernos en las primeras posiciones, poco más podemos hacer.
- Para cambiar el applet y activar el coldboot, borrar el primer subsector de 4KB. Para desactivarlo, no es necesario borrar.
Esto no lo entiendo... cambiar el applet sí (realmente yo cambiaría solo los cinco vectores que apuntan a las imágenes) y tal como yo había pensado... pero no entiendo lo de "Para desactivarlo, no es necesario borrar" ¿Por qué no es necesario borrrar?
Desactivar el cold/warm boot implica cambiar un bit de un uno a un cero. Por eso no hay que borrar el sector.
Para hacer cualquier cambio adicional, hay que borrar.
Tienes razón... pero eso de quitarte de en medio el FTDI y no tener que depender del PC... para mi es un avance, un logro :)Incluso si funciona estoy pensando en soldar un Arduino Nano a una shield protoboard y conectarla directamente a la iceZUM Alhambra mediante el SPI... así ya tenemos el uC que pedías para controlar la FPGA... :)
Casualmente, mira lo que estuve bocetando el finde pasado...
¿No va a enlentecer la compresión demasiado el cambio de imágenes?¿No complicará este cambio cuando se quiera hacer desde la propia FPGA sin intervención de un uC externo? ¿Con la de sitio que hay en la memoria es necesario?¿Conveniente crear una fuente de posibles errores?
El tiempo de descompresión de un algoritmo basado de tokens es menor incluso que el de lectura del mismo contenido. Lo primero que lees es una tabla de una columna y después una cadena de índices. Por cada índice escribes la línea correspondiente de la tabla. Una vez cargado el diccionario dentro de la FPGA, consultar y leer en paralelo cada línea de la tabla es más rápido que leer equivalente en serie de la flash.
En cuanto a la complejidad, la compresión si tiene un requerimiento de memoria mayor. Posiblemente difícil de implementar en la FPGA, pero posible en Arduino: http://www.cbloom.com/src/index_lz.html En cualquier caso, ni siquiera es necesario comprimir en el Arduino, ya que en principio lo hará go-icemulti.
Mi interés principal es probar a implementar un algoritmo de descompresión lossless en la FPGA. Aunque los de este tipo no son útiles para otro tipo de aplicaciones que desarrollo, en este caso parece que funcionan muy bien (3% del tamaño original es brutal). Por ello, me sirve como excusa para i) ver qué limitaciones tiene el toolchain libre en un diseño que no sea un toy-example ii) estudiar cómo de compacto puede ser un bloque de decompresión hardware, y iii) disponer de un módulo que pueda adaptar/reutilizar.
A mayores, aunque utilicemos la flash por ser lo que tenemos disponible, no es el dispositivo más adecuado para andar reescribiendo casi continuamente (tiene un límite de 100.000 borrados por subsector). No es grave, porque cuesta menos de un euro y es un chip de ocho patas muy fácil de cambiar. Pero lo suyo sería utilizar una SRAM, que también las hay disponibles por SPI. Lo que pasa es que son más caras y no están disponibles en tamaños tan grandes. En este contexto sí que la complejidad adicional se ve compensada por la funcionalidad añadida.
- Si se ejecuta desde la FPGA, hay que leer la imagen, descomprimirla, escribirla y después resetearse (volviendo a leerla). Es más lento, pero tiene el potencial de disponer de miles de circuitos sin necesidad de ninguna CPU externa.
¿Quién descomprimiría?¿La propia FPGA?¿No consumiría muchos recursos? Mira que hablamos de la 1K... :)
Como he comentado, ahí está el reto. Todo lo anterior son los preparativos :D
¡Perfecto! Pero el icemulti ya guarda más de una imagen y únicamente hay que cambiar una constante... lo hace (muy ineficientemente, pero lo hace...)
¿Cómo tienes pensado acceder a esa metainformación?¿Desde la propia FPGA?¿Desde el PC?
Es cierto que lo hace en tu versión modificada (no en la distribución binaria, o la que podría incluir apio). Pero, al no estar pensada para ello, no es capaz de diferenciar entre imágenes direccionables y las de reserva. Eso es lo que considero la contribución. La implementación concreta puede variar.
Por el momento no he profundizado. En principio, no es para utilizarse en tiempo de ejecución, sino para poder relacionar un bitstream con sus fuentes:
Si yo te paso un pack con cincuenta imágenes y un manual de usuario, es posible que en algún momento quieras ver las fuentes y puede que hacer alguna modificación. Te puedo dar una lista ordenada de las imágenes, y decirte donde encontrar las fuentes. Hasta aquí no hay problema.
Ahora, tú reempaquetas todas las imagenes y la que has modificado en un nuevo pack, y los distribuyes. Si un usuario se descarga el mío original y el tuyo, ¿cómo puede compararlos? No es razonable que tenga que andar com hexdumps para ver las diferencias. Además, si por error se baja mi documentación y no la tuya, las fuentes que mire no se corresponderán con el bitstream.
Por otro lado, un tercero puede coger sólo la mitad del pack y juntarlo con otro que tenga, reordenando las imágenes además. Cómo ves, se complica. Sin embargo, si cada imagen tiene asociada una cadena única como la propuesta, se pueden distribuir los bitstream por un lado (empaquetados o de forma individual), las fuentes por otro, y la documentación aparte.
Esto no es nuevo. Así funciona el mercado de IP-cores. El estándar que se utiliza es IP-XACT, un mastodonte basado en XML. La idea es desplegar una estructura mínima y funcional, pero que respete la esencia de IP-XACT. De forma que, conforme crezca en complejidad, los cambios requieran añadir información, campos, parámetros, etc. pero que no sea necesario cambiar la arquitectura del sistema (léase, evitar reescribir las herramientas).
El proyecto es estupendo... ¿Pero crees que es necesario acceder a esos bitstream comprimidos cuando ya disponemos de las fuentes Verilog y del software libre necesario para que cualquiera pueda generarlos?¿La idea sería conectar la placa con la FPGA a un puerto ethernet sin necesidad del PC ni de la toolchain de icestorm? ¿Para qué?
Deducirás de la explicación anterior que la idea es más como los binarios en software. ¿Por qué utilizar apio en lugar de compilar el toolchain en tu ordenador? Principalmente, por tiempo. Si yo sólo quiero probar un circuito y ya está sintetizado para mi placa, me lo bajo, miro en la documentación cómo tengo que conectarla, y listo. Si después quiero modificar algo, ya iré a las fuentes.
En cuanto a Ethernet, personalmente no creo que las FPGAs se lleven bien con ello. Se puede hacer, pero es un tipo de código que no es adecuado para implementarlo en hardware, por su irregularidad. En todo caso, incluir una CPU blanda, eso sí es habitual y útil. Pero yo no estaba pensando en nada de eso. Metainformación, la parte importante es "meta".
Ya me dices cuales son tus ideas al respecto... :)
Espero haberme explicado un poco mejor ;)
Saludos
Sí, la de Micron es la más completita... pero hay algún otro... ahora no recuerdo los otros... pero lo tengo en el git del equipo, lo miro, te lo digo y lo subiré al github para que sirva de documentación (por cierto, ya creé el proyecto en mi github, pero no le he dado mucha publicidad porque aún no hay mucho que contar y está un poco desordenado. Si por casualidad en el README.md o en cualquier otro fichero cometo alguna barrabasada o imprecisión encantado de corregir (un pull-request y listo... :-D).
¡Otra prueba que no se me había ocurrido! Me incrementas el SAV por momentos, no sé si aguantaré todo el fin de semana... ¡¡Hay que ponerlo a funcionar con el Arduino y hacer la iceZUM Alhambra independiente ya!! jajajaja
jajajajajajaja, ¿No puedes esperar a la ICEStick que compraste en Mouser? jajajajajaja
Distingo la iCE40HK... ¿Lo otro es un micro? ¿haciendo de Arduino? jajajaja
¿La piensas construir de verdad? ¡Avísame que yo quiero una! :)
Sí, pero nada más la tabla consume recursos de la FPGA...¿los LUTs de cada CBL?¿o quizás otros bloques de RAM? Ya por curiosidad... ¿Sabes si se puede elegir al sintetizar dónde poner dicha tabla? Lo que es seguro es que con la iCE40 andamos faltos de todo... :(
¡Sería genial disponer de esa herramienta de forma libre!
Si esa es tu idea me apunto... aunque no se me ocurre en qué podría ayudar...
ya me está costando grabar una simple flash... jajajajajaja :)
Me gusta la idea... si lo asocio con mi experiencia en el software libre (GNU/Linux)... nunca me pareció ágil lo de Gentoo... para probar un programa tenías que compilarlo todo desde cero... y luego lo ejecutabas y resulta que el programa era una decepción o no era o hacía lo que tú pensabas... el disco duro lleno de bibliotecas que no ibas a utilizar jamás... :(
Debian en el sentido contrario me cautivó., te bajas por separado ejecutable y fuente. :)
sudo apt-get install docker-ce
sudo docker run --rm -it fedora bash
Buenos días Juanma!
Quiero subir también un Makefile o algo similar porque me he dado cuenta que ni hay documentación suficiente ni forma de probar fácilmente la cosa sin leer este hilo (que ya empieza a ser largo).
Hoy me he podido sentar un rato pero apenas he tenido tiempo para probar lo de generar la opción "-c" y ver si se desactiva el warmboot y aparece el coldboot. La prueba no ha sido satisfactoria, no me ha dado tiempo a comprobar demasiado... pero he visto que "-c" genera una imagen bin final totalmente distinta al generado para el warmboot con los mismos argumentos (demasiados cambios en demasiados bytes), no cambia únicamente el byte por 0x10, cambia muchos más... así que ni grabar la prueba en la iceZUM Alhambra me he atrevido.
$ ./icemulti -p9 -o pack.bin counter8.bin led_on.bin pushbutton_and.bin counter.bin shift4.bin blink.bin tones.bin counter.bin counter8.bin hardware.bin
$ ./icemulti -c -o pack_cb.bin counter8.bin led_on.bin pushbutton_and.bin counter.bin shift4.bin blink.bin tones.bin counter.bin counter8.bin hardware.bin
meld <(hexdump -C pack.bin) <(hexdump -C pack_cb.bin)
[user@localhost Downloads]$ diff <(hexdump -C pack.bin) <(hexdump -C pack_cb.bin)
1c1
< 00000000 7e aa 99 7e 92 00 00 44 03 04 6e 0c 82 00 00 01 |~..~...D..n.....|
---
> 00000000 7e aa 99 7e 92 00 10 44 03 00 01 60 82 00 00 01 |~..~...D...`....|
--
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/2c47e0cd-76dc-4942-8d38-71f8f57049d3%40googlegroups.com.
Aupa Juanma,
Casi que prefiero un catarro y que los equipos funcionen... XD
Con respecto a los bitstream, buenas noticias. Salvo que la haya liado yo, has hecho la comparativa con algún programa que "acumula" las diferencias. Prueba esto:
meld <(hexdump -C pack.bin) <(hexdump -C pack_cb.bin)
Se abrirá una GUI, así que hazlo desde un escritorio. Alternativamente, puedes usar diff:
[user@localhost Downloads]$ diff <(hexdump -C pack.bin) <(hexdump -C pack_cb.bin)
1c1
< 00000000 7e aa 99 7e 92 00 00 44 03 04 6e 0c 82 00 00 01 |~..~...D..n.....|
---
> 00000000 7e aa 99 7e 92 00 10 44 03 00 01 60 82 00 00 01 |~..~...D...`....|
En cualquier caso:
7e aa 99 7e 92 00 00 44 03 04 6e 0c 82 00 00 01
7e aa 99 7e 92 00 10 44 03 00 01 60 82 00 00 01
En negrita lo que creo que es el coldboot, y en cursiva el puntero. Si generas pack con '-c -p9', deberían ser iguales salvo por ese bit.
$ ./icemulti -c -p9 -o pack_cbp.bin counter8.bin led_on.bin pushbutton_and.bin counter.bin shift4.bin blink.bin tones.bin counter.bin counter8.bin hardware.bin
Error: Can't select power on reset boot image in cold boot mode
$ iceprog -n pack_cb.bin
Un saludo
--
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/5ff74c8b-106f-4590-ab73-13c04f9c8e34%40googlegroups.com.
¡Mira que eres cabrón! ¿No te he dicho que no tenía tiempo?
¡Hala, tú alimentando el SAV! jajajajajajaja :)
Comprobados ambos, pero las diferencias son las mismas... solo que parece que con meld y diff se paran en la primera... ¿Puede ser?
No, no es posible. Icemulti trata esos parámetros como parámetros excluyentes entre sí... :(
Te lanza esto:
$ ./icemulti -c -p9 -o pack_cbp.bin counter8.bin led_on.bin pushbutton_and.bin counter.bin shift4.bin blink.bin tones.bin counter.bin counter8.bin hardware.bin
Error: Can't select power on reset boot image in cold boot mode
Aún así me he atrevido, he programado el pack_cb.bin en la iceZUM Alhambra sin borrar previamente el pack.bin grabado anteriormente y se queda "tostada" (los leds a medio encender y no responde al reset), imagino que el resto de diferencias, incluido el vector que cambia en el applet, hace estragos al no poder cambiar ceros por unos.
Buenos días Juanma!Sí, la de Micron es la más completita... pero hay algún otro... ahora no recuerdo los otros... pero lo tengo en el git del equipo, lo miro, te lo digo y lo subiré al github para que sirva de documentación (por cierto, ya creé el proyecto en mi github, pero no le he dado mucha publicidad porque aún no hay mucho que contar y está un poco desordenado. Si por casualidad en el README.md o en cualquier otro fichero cometo alguna barrabasada o imprecisión encantado de corregir (un pull-request y listo... :-D).
He echado un ojo, y no hay ninguna barrabasada ;). Sólo tres detalles:
- Los dos enlaces de final no son correctos. No existe 'github.com/juanmard/icezum/CoolBoot', sí 'github.com/juanmard/icezum/tree/master/ColdBoot'
- No es si es legal que tengas alojados en el repositorio documentos con copyright. Yo por si acaso suelo subir un fichero de texto con una lista de enlaces donde obtener los documentos, pero los PDF en sí los tengo sólo en local. A mayores, a Git no le sienta nada bien que haya PDFs en el repo.
- 'necesita de una PROM (Programable ROM, chip tipo flash)'. Estrictamente, no necesita 'una' tipo flash. Necesita una PROM, y en el caso de la Alhambra es tipo flash. El cambio más fácil es que sustituyas 'una' por 'la', en referencia concreta a la de la Alhambra. Pero dejo a tu criterio cómo hacer la distinción/aclaración.
¡Otra prueba que no se me había ocurrido! Me incrementas el SAV por momentos, no sé si aguantaré todo el fin de semana... ¡¡Hay que ponerlo a funcionar con el Arduino y hacer la iceZUM Alhambra independiente ya!! jajajaja
Con Verilog-VHDL puedes hacer un modelo de la Alhambra y simularlo todo aunque sea fin de semana...
Es broma. Ni se te ocurra :P. Pero como concepto es técnicamente posible: http://www.freemodelfoundry.com/whatsnew.php
jajajajajajaja, ¿No puedes esperar a la ICEStick que compraste en Mouser? jajajajajaja
Distingo la iCE40HK... ¿Lo otro es un micro? ¿haciendo de Arduino? jajajaja
¿La piensas construir de verdad? ¡Avísame que yo quiero una! :)
¡El pedido me llegó el lunes-martes! Digamos que la lié un poco. La iCEstick eran 22€, y los gastos de envío costaban otro tanto. Como a partir de 50€ el envío era gratis, cogí dos, un par de memorias flash (64 y 128 Mb, 3€ las dos) y una FPGA HX4K (6€). Bueno, eso pensé, pero lo hice por la noche y a la mañana siguiente me di cuenta de que había pedido una HX1K :S. Hablé con ellos por teléfono, pero no podían cambiar el componente. Amablemente me indicaron que podía coger la HX4K y me la enviaban gratis. Así que eso hice. Total, tengo 2 icestick, una HX1K suelta, otra HX4K suelta y dos memorias sueltas. Demasiado material para tan poco PCB :D. Una de esas memorias era para sustituir la de una de las icestick, y la idea era sustituir la HX1K por la HX4K. Pero si lo hago, me quedo con dos HX1K sueltas, una memoria de 32Mb y la otra de 64 o 128. Así que, por qué no hacer un par de PCBs sencillos, dejar las icesticks intactas y hacer las pruebas directamente con el material restante. Las dos parejas de FPGAS y memorias por 15€, bien merecen jugársela a hacer algo mal.
La imagen anterior son dos PCBs diferentes. Y básicamente es una Alhambra v1.1 partida en cuatro:La parte FTDI + USB desaparece directamente y la de potencia/alimentación no está en ese dibujo.
- Potencia/alimentación
- FTDI + USB
- Conversores de tensión 3,3v-5v
- FPGA + Flash
Lo que ves a la derecha es una 'shield' para pinchar directamente un Arduino Nano. Algo como esto: http://ep.yimg.com/ca/I/yhst-27389313707334_2252_106614573 Pero con tiras de pines, en lugar de los conectores con tornillo. Los cuatro integrados son los conversores de tensión 3,3v-5v. Tiene más que la Alhambra y con alguna salida adicional, para obtener un total de 38 conexiones a la FPGA. El conector CONN_2x20 que está en la mitad inferior, en horizontal. Además, en la parte inferior, un conector para recibir 3,3v, 5v y GND, interruptor para encender/apagar, y dos LEDs para indicar si las dos líneas de alimentación están bien. Opcionalmente, se pueden conectar dos Arduino Nano, utilizando uno de los laterales de cada uno.
En la parte central está la placa de la FPGA + Flash. En la parte superior derecha se ve el conector CONN_2x20 al que iría conectada la 'shield'. En la parte central derecha, ocho LEDs de propósito general, el conector de alimentación (1,2v, 3,3v y GND), el interruptor, y dos LEDs para indicar el estado de la alimentación. Debajo, los conectores de 6 y 2 pines que están pegados, son los de programación SPI. A diferencia de la Alhambra, los pines CS de la Flash y SS de la FPGA no están conectados en la placa. El conector de dos pines es un jumper por si se quiere hacer. Hay dos LEDs justo debajo del conector de 6, para indicar si se está programando la FPGA, la Flash o ambas. El conector de cuatro son CBSEL0, CBSEL1, CDONE y CRESET. A su izquierda, la Flash y el circuito de reset. Debajo del todo, un conector de 14 pines conectados directamente a la FPGA. Para, por ejemplo, conectar todos los pines digitales de otro Arduino Nano (a 3,3v). Se puede meter el Nano directamente, sin cable, aunque perdemos D13. Además, uno de esos 14 pines está rutado a una entrada/salida de las líneas especiales de reloj de la FPGA. En la parte central izquierda, el botón de reset, y un conector de ocho pines, que va a las ocho líneas especiales de reloj de la FPGA. Por último, en la parte superior izquierda, está el reloj en sí, y en la capa bottom otro conector CONN_2x20 que provee 38 conexiones directas a la FPGA (sin conversores de tensión intermedios).
Los tres conectores adicionales a la izquierda son para proveer puntos de alimentación al usuario, pero irán en la placa de alimentación. Lo otro es un rotatory encoder con pulsador. Iba a meterlo en la placa central, pero es enorme, así que se quedará aparte. Total, son tres conexiones nada más.
¿Fabricarlo? Lo veo difícil. Es más un proyecto para cacharrear con Kicad y ver hasta dónde puedo llegar. Una prueba de concepto. Lo que he hecho ha sido a partir del diseño de 4 capas recomendado por Lattice. Pero creo que la elección de esos conectores es demasiado ambiciosa. En general todo está excesivamente pegado (fíjate que la placa de la FPGA es de menos de 4,5cm x 4,5cm). No tengo experiencia rutando líneas de alimentación debidamente. Y tengo varias dudas importantes en lo que respecta a la conexión de múltiples maestros SPI, además de lo que sería la placa de alimentación en sí. Pero, quién sabe, a medio plazo, si va cogiendo mejor pinta, por qué no hacer un par de prototipos. La idea de conectar tres Arduino Nano y poder experimentar con computación paralela y coejecución de CPUs + aceleradores hardware desde luego es muy tentadora. El rendimiento sería nefasto, pero todo hardware """libre""".
Sí, pero nada más la tabla consume recursos de la FPGA...¿los LUTs de cada CBL?¿o quizás otros bloques de RAM? Ya por curiosidad... ¿Sabes si se puede elegir al sintetizar dónde poner dicha tabla? Lo que es seguro es que con la iCE40 andamos faltos de todo... :(
Los algoritmos de compresión permiten escoger, dentro de unos límites, muchas entradas muy cortas o pocas pero más largas. Dependiendo del resultados, será mejor en LUTs o en BRAM. De todas formas, serviría con un solo bloque BRAM. Además, no tiene que estar reservado exclusivamente para este propósito: se utiliza por el circuito que esté configurado y, cuando se vaya a cambiar de imagen, se aprovecha temporalmente.
Sí, se puede elegir dónde ponerla. Los sintetizadores suelen hacerlo de forma automática:Luego, cada sintetizador provee directivas para especificar que una memoria pequeña queremos meterla en BRAM, o que una grande queremos que se haga mediante LUTs.
- Si describimos una memoria que responda en el mismo ciclo, o que tenga más puertos de los que soportan las BRAM, se sintetiza como LUTs.
- Si describimos una memoria cuyo modelo se pueda implementar en una BRAM, pero es de tamaño reducido, se sintetiza como LUTs.
- El resto se sintetizan como BRAM.
¡Sería genial disponer de esa herramienta de forma libre!
Si esa es tu idea me apunto... aunque no se me ocurre en qué podría ayudar...
ya me está costando grabar una simple flash... jajajajajaja :)
Cada cual a su ritmo y en el ámbito que le es conocido. Créeme que si yo me pongo ahora a programar la Flash, me va a costar lo mismo o más que a ti. Aunque sé cómo tienen que funcionar las cosas, no he escrito nunca la secuencia concreta de instrucciones/comandos. Te veo mucho más hábil/animado para experimentar aunque no siempre tengas muy claro el resultado. A mí me cuesta mucho darle a programar, antes de estar seguro de saber qué va a pasar.
En el tema de los IP-cores, poco hay que hacer aquí. Esperar a que Jesús pase por el otro hilo para ver si hay alguna posibilidad de llegar a un entendimiento sobre el tamaño y formato del hash. Si no, simplemente habrá dos formatos paralelos. A partir de ahí, se podría hacer un "empaquetador": le das el código en verilog y las documentación en formato Markdown, y te genera un tar.gz con las fuentes, el o los bitstream y un PDF que incluye la documentación y el código comentado. Adicionalmente, puede generar una página web de cada componente en el sistema. No te asustes, que todo eso ya está hecho. Sólo hay que integrar Doxygen, Pandoc, Hugo u otro similar.
Puede que ponernos de acuerdo también en un fichero de repositorios. Un JSON que pueda cargar cualquier aplicación y donde encuentre las URL de repositorios con los tar.gz. He dicho que uno o varios bitstream, porque el paquete puede incluir bitstreams para varias placas. Así, se podría añadir un travis.yml, que dado un nuevo diseño y la documentación, sintetice y genere bitstreams para un conjunto de placas. Ese travis puede en realidad ejecutar un contenedor de docker, de forma que el repositorio no tendría que alojar los bitstream, porque el usuario podría lanzar el mismo contenedor y que se le generen de forma transparente.
Adicionalmente, hay varios repositorios libres de diseños HDL (OpenCores, LibreCores, FreeRangeFactory...). Se podrían implementar getters para ellos. De forma que la URL se añada con algún atributo para saber que hay que desempaquetar las fuentes de forma diferente, y puede que añadir las constraints de asociación de pines físicos.
Ten en cuenta que estoy hablando de Verilog en todo momento. No sé cómo encajaría en icestudio, con el formato actual de ICE.
En cualquier caso, todo esto es software, comunidad y cultura de la remezcla. A nivel técnico lo único que nos interesa en este hilo es incluir un identificador "único" en la flash junto a cada puntero.
Ten en cuenta que estoy hablando de Verilog en todo momento. No sé cómo encajaría en icestudio, con el formato actual de ICE.
En cualquier caso, todo esto es software, comunidad y cultura de la remezcla. A nivel técnico lo único que nos interesa en este hilo es incluir un identificador "único" en la flash junto a cada puntero.
Pero todo eso para no guardar en la flash el bitstream... osea que necesitamos una conexión al repositorio del bitstream, una comunicación exterior.... no sé, yo lo veo más como que te descargar el bitstream del repositorio y puedes usarlo sin necesidad de conexión externa, creo que es más útil disponer del bitstream completo en la flash.
Me gusta la idea... si lo asocio con mi experiencia en el software libre (GNU/Linux)... nunca me pareció ágil lo de Gentoo... para probar un programa tenías que compilarlo todo desde cero... y luego lo ejecutabas y resulta que el programa era una decepción o no era o hacía lo que tú pensabas... el disco duro lleno de bibliotecas que no ibas a utilizar jamás... :(
Debian en el sentido contrario me cautivó., te bajas por separado ejecutable y fuente. :)
Me gusta la analogía. El objetivo es Arch. Hay partes precompiladas (el toolchain y post-sintesis) y partes en fuentes (pre-sintesis). Tú puedes descargarte los bitstream, si existen. Si no, puedes bajar el netlist post-sintesis y hacer solo el place and route. O, si quieres, puedes hacerlo todo desde las fuentes, lo que incluye cambiar la funcionalidad.
En cuanto a tener el disco duro lleno de bibliotecas... Juanma, te presento a Docker. Vais a tener una relación muy larga, así que empezad con tranquilidad. Os muestro el primer paso:sudo apt-get install docker-ce
sudo docker run --rm -it fedora bash
Sí, efectivamente, has ejecutado una ""máquina virtual"" de Fedora y estás dentro. Haz 'dnf update', utiliza herramientas que sólo estén en Fedora. Cuando te aburras, escribe 'exit', y volverás a tu Debian. Todo lo que hayas hecho ha desaparecido. Tu sistema "no sabe" que ha estado ejecutando Fedora, no hay ninguna librería instalada.
En otras palabras, docker te permite descargar en una "imagen" todas las librerías que le faltan a tu sistema para ejecutar cualquier cosa que quieras. Las descomprime en un proceso aislado que sólo ve ese sistema de archivos y no el de tu sistema real, y cuando te marchas desaparecen todas y sólo queda la "imagen" original. Esa imagen es un fichero comprimido de entre 2MB y 10GB, depende de qué es lo que haya en la imagen. Si la imagen se ha generado a través de un script, puedes ver exactamente qué órdenes se han utiliado. Ejemplo de la imagen que se utiliza para compilar GHDL en Ubuntu: https://hub.docker.com/r/ghdl/ghdl-tools/~/dockerfile/
Yo lo he utilizado, por ejemplo, para distribuir instalaciones de OpenFOAM. Tarda unas 6 horas en compilar, y necesitas 3GB de librerías. La imagen de docker ocupa 1.37GB (todavía estoy analizando cómo quitarle más) y está lista para usar. Lo que es más importante, cualquier usuario que la utilice estará exactamente en el mismo entorno, por lo que los "problemas" son directamente reproducibles.
Sí, estoy trabajado en cómo meter icestorm en docker. Es como Apio, pero sin compilación cruzada. El sistema se compila una sola vez.
Por cierto, utilizo docker a diario en Windows 10, para probar cosas en Fedora, Debian y Alpine Linux al mismo tiempo. Y las mismas imágenes de docker funcionan en una Raspberry Pi :D :D :D.
Tengo la sensación de que vas a encontrar entretenimiento hasta poder echar mano a la Alhambra....
Saludos
Pensé el esquema de subdirectorios antes de crearlos, me di cuenta pero se me olvidó cambiar los enlaces (mi falta de experiencia en GitHub. Corregido.
Lista de enlaces creado en el README.md. He creado un .gitignore que filtre mis PDF locales, he borrado la caché (git rm --cached doc/*.pdf), pero no consigo que se borren y dejen de estar visibles los ficheros en GitHub. Para investigar.
git pusho rigin +master
git reset --hard origin master
Con Verilog-VHDL puedes hacer un modelo de la Alhambra y simularlo todo aunque sea fin de semana...
Es broma. Ni se te ocurra :P. Pero como concepto es técnicamente posible: http://www.freemodelfoundry.com/whatsnew.php
Debe ser complicado pero sería un buen aporte al proyecto, calmaría mucho SAV, desde luego solo tú podrías hacerlo... así que si te animas. :P
¡¡Ufff!! Complejo para mi. ¿Sabes si yosys tiene estas opciones de elección de forma manual? Sería quizás interesante a la hora de optimizar otros proyectos libres.
En esto me pierdo un poco, el formato json lo tengo oscuro y lo de travis.yml nunca lo había oído... pero más o menos te entiendo... docker funcionando como una especie de virtualización donde se generarían los bitstream dependiendo de la placa que se use y desde unos fuentes comunes, con lo que el repositorio únicamente debe tener las fuentes y no todos los bitstream para cada una de las placas... ¿Es eso?
En cualquier caso, todo esto es software, comunidad y cultura de la remezcla. A nivel técnico lo único que nos interesa en este hilo es incluir un identificador "único" en la flash junto a cada puntero.
Pero todo eso para no guardar en la flash el bitstream... osea que necesitamos una conexión al repositorio del bitstream, una comunicación exterior.... no sé, yo lo veo más como que te descargar el bitstream del repositorio y puedes usarlo sin necesidad de conexión externa, creo que es más útil disponer del bitstream completo en la flash.
¡Eso sí! pero entonces no sé para qué necesito el UID del bitstream en la flash ocupando sitio... ya tengo el bitstream... ¿para evitar errores?
Sí, con Docker me tuve que pelear para dar servicios con Discourse para pruebas del club (otro frente abierto que tengo) nunca lo he usado en este sentido que me comentas... el concepto de Docker es un concepto aún oscuro para mi (¿es una virtualización?¿no lo es?¿consume recursos?¿qué tipo de recursos?¿Menos?¿Más que una virtualización completa del sistema?), imagino que con el uso se me irá clarificando el concepto y lo usaré más frecuentemente. :)
Interesante... veo que tú lo usas como "punto de restauración" o similar... ¿es así? :)
Yo lo he utilizado, por ejemplo, para distribuir instalaciones de OpenFOAM. Tarda unas 6 horas en compilar, y necesitas 3GB de librerías. La imagen de docker ocupa 1.37GB (todavía estoy analizando cómo quitarle más) y está lista para usar. Lo que es más importante, cualquier usuario que la utilice estará exactamente en el mismo entorno, por lo que los "problemas" son directamente reproducibles.
Otro uso muy interesante... para comprobar bugs de issues... :)
Lo de la mecánica de fluidos me interesa (otro de mis frentes abiertos...) si eso enlaza, enlaza... :)
$ docker pull 11384eb/gea-weaves
$ docker run --rm -itv $(pwd):/work 11384eb/gea-weaves bash
root@containerid# blockMesh
root@containerid#
interFoam
jajajajajajaja, ya me ves... contestándote una semana después de que publicaras... pero aburrido no estoy nunca, eso te lo puedo asegurar, por opciones con las que entretenerse y aprender que no quede. :)
--
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/aN_vYtDCEyo/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.
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/ccc864c7-fee7-4406-bb61-7e6a11e27c40%40googlegroups.com.
winpty docker run --rm -itv /$(pwd):/work 11384eb/gea-weaves bash
winpty hace falta para tener una shell interactiva. Y la barra antes del path, por las diferencias de formato entre mingw, powershell y linux.
Para publicar en este grupo, envía un correo electrónico a fpga-wars-explorando-el-lado-lib...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/fpga-wars-explorando-el-lado-libre.
Pensé el esquema de subdirectorios antes de crearlos, me di cuenta pero se me olvidó cambiar los enlaces (mi falta de experiencia en GitHub. Corregido.
Es bastante intuitivo y en general todo funciona como esperas. Pero las URL son una excepción. Hay que prestar atención cuando navegas. Especialmente, si quieres descargarte un fichero desde terminal, tienes que usar la versión "raw". Por ejemplo:Lista de enlaces creado en el README.md. He creado un .gitignore que filtre mis PDF locales, he borrado la caché (git rm --cached doc/*.pdf), pero no consigo que se borren y dejen de estar visibles los ficheros en GitHub. Para investigar.
Tienes que "purgar" toda la historia (la de git, la de MundoReal todavía no se puede). Hay varias opciones:
http://stackoverflow.com/questions/2100907/how-to-remove-delete-a-large-file-from-commit-history-in-git-repository
En cualquier caso, debes tener en cuenta que al cambiar toda la historia en tu copia local, cuando te compares con el repo de Github tendrás dos versiones totalmente diferentes. No te dejará hacer "push" sin más. Y, si haces, "pull", te hará un "merge", por lo que estará todo por duplicado (habrá dos versiones de cada commit con un hash diferente). Para evitarlo, tienes que machacar el repo de GitHub:
git push origin +master
Ese "+" le indica que te la trae al pairo lo que tenga. Que borre todo y copie tu versión de la historia (que es la limpia).
Un efecto colateral de estos "cambios de historia" es que a cualquier otro usuario que haya hecho un checkout, cuando haga fetch y status, le dirá que hay un motón de cambios por descargar. Si hace, pull, estaremos en las mismas de antes: con dos historias duplicadas en el mismo merge. Para evitarlo, tendrá que hacer un reset:
git reset --hard origin master
Por eso no es conveniente andar tocando la historia de Git. Pero en este caso, como acaba de nacer el repo, no hay problema.
Por otro lado, aprovechando que vas a andar con esto, igua quieres reconsiderar el nombre de otro repo. Has puesto "PID", pero luego en el README indicas la intención de investigar otros algoritmos de control. Creo que sería más prudente utilizar sólo FPGA y Control en el nombre.
Con Verilog-VHDL puedes hacer un modelo de la Alhambra y simularlo todo aunque sea fin de semana...
Es broma. Ni se te ocurra :P. Pero como concepto es técnicamente posible: http://www.freemodelfoundry.com/whatsnew.php
Debe ser complicado pero sería un buen aporte al proyecto, calmaría mucho SAV, desde luego solo tú podrías hacerlo... así que si te animas. :P
Nah, no tengo interés particular en implementar algo así. Es relativamente complejo y no tiene casi utilidad para mí. Una descripción completa de los LEDs, el ADC, los conversores de tensión, etc. sólo son de interés como entorno de verificación para quien desarrolle específicamente para la Alhambra. Mi objetivo es conocer la arquitectura de las iCE40, no trabajar sólo con una placa.
¡¡Ufff!! Complejo para mi. ¿Sabes si yosys tiene estas opciones de elección de forma manual? Sería quizás interesante a la hora de optimizar otros proyectos libres.
Lo comentamos con más detalle en: https://groups.google.com/forum/#!topic/fpga-wars-explorando-el-lado-libre/3b-OSWwPqTs
Básicamente, echa un ojo a las páginas 6-15 del documento 'Memory Usage Guide for iCE40 Devices': http://www.latticesemi.com/Products/FPGAandCPLD/iCE40.aspx
Sí, Unai, me dí cuenta cuando estaba redactando el README.md, pero no encontré como cambiar el nombre del proyecto. Imagino que habrá que hacer otro nuevo con otro nombre y clonar. Investigo por Google y lo corrijo el próximo día.
git push nuevoremote +master
git push origin +master
git remote remove nuevoremoe
Pues anímate con el modelo de simulación de la iCE40, sería rizar el rizo... jejejejeje :)
No, es broma, es para picarte.... únicamente por puro interés personal y egoismo, estoy seguro que ver un modelo de simulación de un bus compartido hecho por ti en Verilog me ayudaría en mi proyecto del C4004... me quedé estancado simulando el bus por no sé qué tema de como trata yosys la definición del estado de impedancia en los inout o qué sé yo... Imagínate... no sé exactamente cúal es el problema... ¡como para encontrar la solución! jejejejejejeje
¡Me la trae al pairo! Tu opción favorita a partir de ahora. Cuidado con abusar de ella. Pero en este caso:
- Git no tiene noción de "nombre del proyecto", el nombre se lo da la carpeta en la que se encuentre ".git".
- Por lo tanto, para cambiar el nombre a tu proyecto en local, renombra la carpeta.
- Después, ve a GitHub y crea un proyecto nuevo. Da lo mismo que lo hagas en blanco, o añadas un README inicial. Lo único que te interesa es que te va a generar una URL del tipo github.com/juanmard/nuevorepo.
- En tu carpeta local añade un nuevo repo, o cambia "origin" para que apunte a la nueva URL (sólo una de las dos):
- Machaca la "breve" historia del repo recien creado (sólo una de las dos, dependiendo de lo que hagas en el paso anterior):
git push nuevoremote +master
git push origin +masterA partir de ahi, puedes comprobar a través del navegador que los dos repos en GitHub tienen la misma historia, y borrar el viejo. Si has renombrado origin, no tienes que hacer nada más en local. Si has añadido "nuevoremote", lo más cómodo es que cambies la URL de origin ahora, y elimines el otro:
git remote remove nuevoremoe
Un bus compartido per sé no tiene ninguna complicación. Pero ¿qué bus? He ahí la gracia. ¿De qué protocolo se trata? ¿Es bidireccional? ¿Cuántos maestros hay? ¿Esclavos?
Pues un pasito más... (un día con más tiempo miro con tranquilidad el tema del Docker)
Listo, hemos aumentado la coherencia del proyecto... para futuras referencias ha quedado aquí.
Por cierto, el issue de Jesús se ha perdido (el commit no, pero el issue sí), habría que investigar como no perderlos. Para nota, otro día.
Pues la verdad Unai que no tengo ni idea del protocolo. Es el bus del primer microcontrolador comercial de Intel (C4004). Yo retomé un proyecto que encontré en OpenCores, intenté comunicarlo con su ROM y el registro de desplazamiento... pero el bus se me atragantó. El hilo es este. Estuve una temporada dándole vueltas, pero no conseguí encontrar el fallo. Tampoco sé mucho de Verilog, lo que he aprendido por aquí, así que se me hace cuesta arriba... además saber que no se puede probar en la placa por el tema de las puertas triestado también me desanimó un tanto... y con tantos frentes abiertos, al final lo tengo un poco abandonado.
Me animé a la aventura del conjunto msc-4 al implementar el Simplez-F y hacer un programilla para él en la iceZUM Alhambra y ver que el bootloader funcionaba con ese sencillo microcontrolador/microprocesador. Puede aportar algo al proyecto del Simplez-F de Obujuan y pensé que estaría chulo hacer lo mismo con uno real, el más sencillo que existiera en el mercado... y apareció el conjunto de chips msc-4, el primero comercial de la historia... pero atascado estoy.
Cuando cerremos el frente del Cold/Warm Boot (si se cierra algún día) intentaré retomarlo. Si alguien del grupo se anima y encuentra por casualidad el fallo, que avise, que seguro que me vuelvo a animar. :)
Saludos.
Pues un pasito más... (un día con más tiempo miro con tranquilidad el tema del Docker)
Supongo que habrás visto en este hilo, que estoy retrasando ligeramente las pruebas de programación, para disponer de un entorno de desarrollo portable basado en docker. Está a puntito...
Listo, hemos aumentado la coherencia del proyecto... para futuras referencias ha quedado aquí.
Por cierto, el issue de Jesús se ha perdido (el commit no, pero el issue sí), habría que investigar como no perderlos. Para nota, otro día.
Cierto, se me olvido indicar que lo que estabas haciendo era sobre el repo, no sobre "los añadidos web" de GitHub. Ya lo siento, pero es que ni me fijé en que tenía una issue :S.
Pues la verdad Unai que no tengo ni idea del protocolo. Es el bus del primer microcontrolador comercial de Intel (C4004). Yo retomé un proyecto que encontré en OpenCores, intenté comunicarlo con su ROM y el registro de desplazamiento... pero el bus se me atragantó. El hilo es este. Estuve una temporada dándole vueltas, pero no conseguí encontrar el fallo. Tampoco sé mucho de Verilog, lo que he aprendido por aquí, así que se me hace cuesta arriba... además saber que no se puede probar en la placa por el tema de las puertas triestado también me desanimó un tanto... y con tantos frentes abiertos, al final lo tengo un poco abandonado.
Me animé a la aventura del conjunto msc-4 al implementar el Simplez-F y hacer un programilla para él en la iceZUM Alhambra y ver que el bootloader funcionaba con ese sencillo microcontrolador/microprocesador. Puede aportar algo al proyecto del Simplez-F de Obujuan y pensé que estaría chulo hacer lo mismo con uno real, el más sencillo que existiera en el mercado... y apareció el conjunto de chips msc-4, el primero comercial de la historia... pero atascado estoy.
Cuando cerremos el frente del Cold/Warm Boot (si se cierra algún día) intentaré retomarlo. Si alguien del grupo se anima y encuentra por casualidad el fallo, que avise, que seguro que me vuelvo a animar. :)
La lógica parece bastante directa, pero como hay múltiples módulos interconectados hay que tener claro el mapa de memora. Como comentas, esperemos a cerrar algún otro frene primero ;)
En lo que a mí respecta: icecube2 y el programador ya están funcionando en Windows10. He podido encontrar el menú para hacer los packs y activar el coldboot con las herramientas oficiales. Sin embargo, en GNU/Linux tengo problemas con la licencia flexlm. Concretamente, el hostid que lee de forma automática no coincide con la MAC de mis tarjetas. Así que está instalado, pero no quiere ejecutarse :S. Por otro lado, no me he metido con los drivers hasta no tener el software listo.
En paralelo, como he comentado arriba, estoy terminando la imagen docker.
Cuando tenga los dos entornos de trabajo preparados, continuaré con las aportaciones específicas de aplicación: el cold/warm boot y go-icemulti.
Saludos.
Saludos
Sí, me parece genial, le sigo la pista... Al leerte, este fin de semana me animé y empecé una instalación con Docker en mi equipo con Windows...
No tuve suerte, al parecer a Windows 7 Home no le gusta mucho la virtualización.
Intenté las docker-toolbox como dice el mensaje pero va demasiado lento y no consigo que tire ni los ejemplos.
Bueno, imagino que Jesús me perdonará por el issue perdido. :)
No entiendo como a los desarrolladores de github no se les ha ocurrido permitir clonar sus propios datos asociados al git... pero bueno, algún día, si hay más novatos manazas como yo y lo ven entonces necesario, lo desarrollarán. :)
Es lo malo de estas barreras creadas para impedir el acceso a terceros mediante una licencia... que al final fallan y no te dejan acceder a ti mismo.
No tengo ni idea para qué flexlm y el hostid lee la MAC, pero según tengo entendido, cambiar la MAC con la que se identifica un dispositivo es relativamente fácil.
¿Y si cambias la MAC de las tarjetas a la MAC que te conviene? Lo lanzo como especulación...sin conocer realmente el problema en profundidad, imaginando además que ya lo habrás probado.
Perfecto, esperaré con impaciencia... pero ya, visto lo visto, no podré usarlo en mi equipo con Windows... ¿Para qué calentarme la cabeza? Volveré a mi sencillo Debian para usar e investigar sobre Docker.
Saludos.
Saludos
Volveré a mi sencillo Debian para usar e investigar sobre Docker.
docker run --rm -it \
> -v /tmp/.X11-unix/:/tmp/.X11-unix \
> -e DISPLAY=unix$DISPLAY \
> 11384eb/elide:alpine-run sh
Esa orden descarga '
11384eb/elide:alpine-run
', que es una imagen basada en Alpine Linux: https://hub.docker.com/r/11384eb/elide/tags/ 146M es la información que hay que descargar y una vez descomprimida ocupa 525M.docker run --rm -it 11384eb/elide:alpine-run sh
Buenos días Juanma!
Me gusta la idea... si lo asocio con mi experiencia en el software libre (GNU/Linux)... nunca me pareció ágil lo de Gentoo... para probar un programa tenías que compilarlo todo desde cero... y luego lo ejecutabas y resulta que el programa era una decepción o no era o hacía lo que tú pensabas... el disco duro lleno de bibliotecas que no ibas a utilizar jamás... :(
Debian en el sentido contrario me cautivó., te bajas por separado ejecutable y fuente. :)
Me gusta la analogía. El objetivo es Arch. Hay partes precompiladas (el toolchain y post-sintesis) y partes en fuentes (pre-sintesis). Tú puedes descargarte los bitstream, si existen. Si no, puedes bajar el netlist post-sintesis y hacer solo el place and route. O, si quieres, puedes hacerlo todo desde las fuentes, lo que incluye cambiar la funcionalidad.
En cuanto a tener el disco duro lleno de bibliotecas... Juanma, te presento a Docker. Vais a tener una relación muy larga, así que empezad con tranquilidad. Os muestro el primer paso:sudo apt-get install docker-ce
sudo docker run --rm -it fedora bash
Sí, efectivamente, has ejecutado una ""máquina virtual"" de Fedora y estás dentro. Haz 'dnf update', utiliza herramientas que sólo estén en Fedora. Cuando te aburras, escribe 'exit', y volverás a tu Debian. Todo lo que hayas hecho ha desaparecido. Tu sistema "no sabe" que ha estado ejecutando Fedora, no hay ninguna librería instalada.
En otras palabras, docker te permite descargar en una "imagen" todas las librerías que le faltan a tu sistema para ejecutar cualquier cosa que quieras. Las descomprime en un proceso aislado que sólo ve ese sistema de archivos y no el de tu sistema real, y cuando te marchas desaparecen todas y sólo queda la "imagen" original. Esa imagen es un fichero comprimido de entre 2MB y 10GB, depende de qué es lo que haya en la imagen. Si la imagen se ha generado a través de un script, puedes ver exactamente qué órdenes se han utiliado. Ejemplo de la imagen que se utiliza para compilar GHDL en Ubuntu: https://hub.docker.com/r/ghdl/ghdl-tools/~/dockerfile/
Yo lo he utilizado, por ejemplo, para distribuir instalaciones de OpenFOAM. Tarda unas 6 horas en compilar, y necesitas 3GB de librerías. La imagen de docker ocupa 1.37GB (todavía estoy analizando cómo quitarle más) y está lista para usar. Lo que es más importante, cualquier usuario que la utilice estará exactamente en el mismo entorno, por lo que los "problemas" son directamente reproducibles.
Sí, estoy trabajado en cómo meter icestorm en docker. Es como Apio, pero sin compilación cruzada. El sistema se compila una sola vez.
Por cierto, utilizo docker a diario en Windows 10, para probar cosas en Fedora, Debian y Alpine Linux al mismo tiempo. Y las mismas imágenes de docker funcionan en una Raspberry Pi :D :D :D.
Tengo la sensación de que vas a encontrar entretenimiento hasta poder echar mano a la Alhambra....
Saludos
Releyéndolo, parece contradictorio lo de fabricar o no el PCB. Uno voy a hacer para aprovechar el material. Pero no sé si será ese tan complejo e incompleto, o simplemente aprovecharé algún diseño como el de la Kéfir.
Sí, con Docker me tuve que pelear para dar servicios con Discourse para pruebas del club (otro frente abierto que tengo) nunca lo he usado en este sentido que me comentas... el concepto de Docker es un concepto aún oscuro para mi (¿es una virtualización?¿no lo es?¿consume recursos?¿qué tipo de recursos?¿Menos?¿Más que una virtualización completa del sistema?), imagino que con el uso se me irá clarificando el concepto y lo usaré más frecuentemente. :)
Es menos que una virtualización completa. En una máquina virtual el SO no ve el hardware real, sino lo que la máquina le dice que tiene. En este caso, el contenedor sí que ve tu hardware y lo usa directamente. Es como ponerle orejeras a un burro o caballo. Está andando por el mismo prado, pero evitas que vea todo aquello que no le concierne. Siguiendo con la analogía, en una máquina virtual añadirías una zanahora y una foto de fondo, para que el animal no sepa ni donde está en realidad.
Consume ligeramente más recursos que si se ejecutan las mismas intenciones directamente en tu terminal. Pero muchísimos menos que una máquina virtual. Consume principalmente RAM y procesador, pero también GPU, red, ... Depende de qué ejecutes en el contenedor. En general, puedes hacerte la idea de que va a consumir lo mismo que si se ejecutara directamente, sólo con un ligero incremento de RAM que depende del tamaño de la imagen (alpine 8MB, fedora y ubuntu debajo de 100MB).
Interesante... veo que tú lo usas como "punto de restauración" o similar... ¿es así? :)
No es que lo use así, es que así funciona XD. Tú tienes imágenes, que son esos "puntos de restauración". Para poder hacer cualquier cosa, tienes que generar un contenedor a partir de la imagen. Cuando terminas con el contenedor, puedes borrarlo, dejarlo en standby, o guardarlo como una (nueva) imagen.
La explicación es muy intuitiva si tienes en cuenta que cada "imagen" es como un repositorio de git. Las imagénes están compuestas por capas, y guando guardas un contenedor lo que haces es un commit en la imagen. Por lo tanto, los contenedores son tu directorio de trabajo, y las imagenes la carpeta .git. Además, también existe docker-hub, por lo que puedes hacer push de tus imágenes. Exactamente igual que git, otra vez.
Hay una diferencia muy importante, eso sí: las imágenes no pueden tener mas de 64 o 128 capas (no me acuerdo exactamente). Tampoco es mucho problema, porque se puede hacer squash de varias capas para unirlas en una solo.
Yo lo he utilizado, por ejemplo, para distribuir instalaciones de OpenFOAM. Tarda unas 6 horas en compilar, y necesitas 3GB de librerías. La imagen de docker ocupa 1.37GB (todavía estoy analizando cómo quitarle más) y está lista para usar. Lo que es más importante, cualquier usuario que la utilice estará exactamente en el mismo entorno, por lo que los "problemas" son directamente reproducibles.
Otro uso muy interesante... para comprobar bugs de issues... :)
Lo de la mecánica de fluidos me interesa (otro de mis frentes abiertos...) si eso enlaza, enlaza... :)
Mi usuario en docker-hub es https://hub.docker.com/r/11384eb
Y esta es la imagen concreta con OpenFOAM: https://hub.docker.com/r/11384eb/gea-waves/~/dockerfile/
Suponiendo que estés en la carpeta de un caso, puedes descargarla y usarla con:
$ docker pull 11384eb/gea-weaves
$ docker run --rm -itv $(pwd):/work 11384eb/gea-weaves bash
root@containerid# blockMeshroot@containerid#
interFoam
Donde sustituyes blockMesh e interFoam por las instrucciones concretas para el mallado y solver que quieras usar.
La imagen creo que no tiene ni los ejemplos. Por lo que deberás descargártelos por separado.
No obstante, si nunca has trabajado con OpenFOAM, la curva de aprendizaje tiene su gracia. Puedes empezar por: https://cfd.direct/openfoam/user-guide/
jajajajajajaja, ya me ves... contestándote una semana después de que publicaras... pero aburrido no estoy nunca, eso te lo puedo asegurar, por opciones con las que entretenerse y aprender que no quede. :)
Estoy acostumbrado a trabajar de forma bastante "asíncrona". ¡Una semana no es nada!
Saludos