Estoy revisando el esquema de la versión 1.1 de la Alhambra para ver cómo podría pinchar un Arduino al SPI y programar la flash, como experimento para sustituir el FTDI. Creo que ahora mismo:
- Cuando se programa la memoria Flash, la FPGA se mantiene en reset, por lo que sus puertos SCK, SDO, SDI y SS_B se encuentran en alta impedancia o como entradas.
- Cuando se programa la FPGA, tanto esta como la memoria son esclavos. Como la memoria no está selecionada, su SDO está en alta impedancia.
- Cuando no se usa el FTDI, sus puertos SCK, MOSI y SS_B deben estar en alta impedancia, ya que de otra forma harían corto con las salidas de la FPGA cuando esta está en modo master.
Por lo tanto, con el hardware actual, debo asegurar que el Arduino tiene las salidas 10,11,12 y 13 en alta impedancia, salvo cuando esté el RESET de la FPGA activo.
Para poder realizar transferencias desde Arduino con la FPGA encendida y funcionando, debo asegurarme de que en el bitstream los pines 68, 68, 70 y 71 están configurados como entradas. Además, para que la FPGA se configure desde la flash nada más arrancar, Arduino deberá empezar en modo alta impedancia y esperar a que la FPGA termine para que sea seguro pasar a modo maestro.
Por último, como la iCE40 tiene un par de módulos SPI configurables como maestro/esclavo de forma dinámica (con buffered IO), se puede escribir en la flash indistintamente desde Arduino y la FPGA, estando ambos en funcionamiento. Para ello, hay que ser cuidadoso e implementar alguna sincronización con un pin adicional (o varios) para evitar que dos estén como maestros al mismo tiempo. En otras palabras, meter un arbitrador en la lógica.
Opcionalmente, incluir un multiplexor 8-4 (2:1 de 4 bits) externo como protección. Pero esto requeriría modificar la placa demasiado: ocho cortes y soldaduras.
La duda que me surge es si se puede añadir una resistencia entre cada maestro y el bus para que se reduzca la corriente en caso de que más de uno tenga las salidas activas (pero con diferentes valor lógico). Siendo una plataforma de desarrollo, es de esperar querer añadir más dispositivos al bus, por lo que algo así sería más seguro que cuidar la programación, y menos complicado que añadir multiplexores.
He buscado un poco al respecto y casi me explota la cabeza:
Por un lado hay referencias en las que se incluyen resistencias entre los pines SPI de la FPGA y el bus, y en caso de usar un programador externo (ICSP), se conecta en el lado de la FPGA. Cualquier periférico adicional va al otro lado. Esto se hace para que el ICSP tenga prioridad. Pero creo que no es de aplicación en este caso, ya que tanto el Arduino como el FTDI hacen las veces de ICSP.
http://electronics.stackexchange.com/questions/76415/spi-device-prevents-isp-programmingEn otros casos se añaden resistencias pull-up o pull-down a los CS de los esclavos, para que no participen aún cuando la línea este en alta impedancia. A veces se hace esto además de lo anterior.
https://www.dorkbotpdx.org/blog/paul/better_spi_bus_design_in_3_stepsEn ningúno de ellos se centran en posibles cortos, sino en tener prioridad en el bus. A mí no me preocupa eso, ya que prefiero que no funcione ninguno a que lo haga el principal, pero puedan estar quemándose otros.
¿Alguien puede arrojar algo de luz sobre cuál sería la medida de protección hardware más simple?