¿Es posible que un FPGA se configure "parcialmente"?

Tengo una placa Spartan 6 que diseñé y tengo algunos problemas de configuración. Estoy usando flash SPI para programar el fpga (por ejemplo, uso jtag para escribir el flash y el flash luego escribe el fpga). El esquema que utilicé para la configuración se puede encontrar en la página 42 de UG380 de xilinx. http://www.xilinx.com/support/documentation/user_guides/ug380.pdf

La mayoría de las veces puedo programar el dispositivo sin problemas usando la interfaz jtag (programando directamente el fpga) o el spi flash (programando indirectamente el fpga); todo sale como se esperaba. Sin embargo, hay instancias en las que parece que el fpga no se configura correctamente a pesar de que el pin terminado se eleva (tengo un indicador LED en el pin y lo he monitoreado con un alcance). Esto se manifiesta de diferentes maneras. Entre otras cosas, esta placa maneja un VGA dac. Escribí un banco de pruebas para llevar barras de color a un monitor. El 75 % de las veces, si restablezco la placa (pulsando con fuerza un botón que hace que program_b sea bajo), las barras de color se encienden como se esperaba. El 25% de las veces no obtengo nada del vga dac. Parece que algunos de los pines que impulsan el dac no t alternar (el 75% de las veces todo funciona correctamente, lo hacen alternar). Además del dac, tengo un led de prueba que conduzco con el msb de un contador, que simplemente divide el reloj del sistema de 100 MHz para que parpadee ~ dos veces por segundo. Ese pin parece aparecer sin problemas cada vez.

Dadas estas observaciones, me pregunto si es posible que a veces el fpga no esté configurado correctamente, o tal vez esté parcialmente configurado (por ejemplo, el pin que controla el LED aparece sin problemas, los pines que controlan el dac no). Las guías de usuario de xilinx indican que el enrutamiento de configuración es bastante sensible; en particular, el reloj de configuración debe terminarse correctamente. Me pregunto si es posible que haya un problema de diseño, lo que hace que el fpga falle ocasionalmente en la configuración. No estoy muy familiarizado con la forma en que realmente funciona la configuración (especialmente con respecto a la verificación), siempre "simplemente funcionó" en mis tableros anteriores, pero me parece extraño que el pin terminado suba cada vez sin problemas. , pero sigo viendo este comportamiento.

¿El diseño funcionó correctamente en la simulación?
Sí, funciona perfectamente en simulación. Más concretamente, el RTL idéntico funciona perfectamente en una placa de desarrollo xilinx con una tarjeta secundaria que diseñé para el vga dac.
Así que esta instancia está en tu propio tablero. Posiblemente valga la pena explorar las PSU, los voltajes del banco de E/S (¿están todos los pines defectuosos en el mismo banco?), las conexiones de E/S Vref, etc.
Esa es una buena pregunta. Exploraré más a fondo hoy. Las fuentes de alimentación se ven bien, muy limpias y planas. Los voltajes del banco de E/S son todos iguales: 3,3 V, pero revisaré el problema del banco. Ese es un punto interesante. Gracias
Esto me suena como un problema de pin de tierra de origen de energía. Las posibilidades de que la FPGA se configure mal son muy, muy pequeñas. Con tus pruebas, supongo que tienes algunos problemas en tu placa.
¿Cómo se restablece su diseño?
Gracias por todos los comentarios: el diseño tiene un reinicio síncrono, que es generado por un microcontrolador. El micro monitorea el estado del pin terminado, así como algunos otros periféricos y pulsos de E/S a la FPGA. El fpga sincroniza el pulso de reinicio con los distintos dominios de reloj. Seguiré depurando la placa. Hasta ahora, los suministros se ven bien, pero intentaré ver si no hay un rebote en el suelo que aún no haya encontrado.

Respuestas (1)

En realidad, no es posible que la FPGA salga de la rutina de inicio con una configuración corrupta, ya que confirma el CRC de la configuración después de cargar la configuración completa, pero antes de que intente iniciarse. Si no coincide, entonces el pin DONE permanece bajo y puede verificar lo que sucedió leyendo los bits de estado en JTAG.

Dado que parece que la configuración siempre se completa con el pin DONE liberado y su salida de reloj dividida está funcionando, supongo que puede tener un problema de metaestabilidad o un problema de inicialización en su diseño que aún no ha detectado.

¿Confirma el CRC cuando se usa la configuración SPI? Sé que se verifica cuando se usa jtag para programar directamente la pieza. Tendría que estar de acuerdo con usted, pero el mismo RTL funciona sin problemas en una placa de desarrollo xilinx.
No importa de dónde provenga el flujo de bits (JTAG, SPI, SelectMAP), la secuencia de inicio y configuración es la misma y el CRC siempre se verifica como parte de la secuencia.
Además, ¿ha intentado restablecer solo su lógica sin activar una recarga de la configuración de FPGA? ¿Un reinicio de su lógica soluciona el problema cuando ocurre, o solo una recarga de configuración?
Gracias por la información, @alex.forencich. Es bueno saber que el CRC siempre se verifica. Desafortunadamente, el restablecimiento de la lógica no parece solucionar el problema.
Entonces, según la información de CRC, parece que ha abordado la respuesta a esta pregunta. He estado depurando más y parece que definitivamente hay otro problema (puse una sonda de alcance por un tiempo y parece que cambia a nivel bajo de vez en cuando, lo que no había notado antes). Investigará más a fondo. Gracias por tu ayuda.
Interesante. Si el pin DONE está bajando ocasionalmente, es posible que el FPGA se esté reiniciando. Es posible que desee verificar el pin PROG_B y también verificar los rieles de la fuente de alimentación FPGA con el alcance para asegurarse de que no esté sucediendo nada extraño.
Pensé lo mismo. Tengo un circuito de reinicio que puede controlar un botón (esto a su vez impulsa prog_b). Es posible que haya habido una junta de soldadura fría en una resistencia pull-up... se ve mejor, pero aún quedan algunas cosas por depurar. ¡Gracias por tu ayuda!