Estoy tratando de cargar la configuración en mi placa FPGA usando Cypress FX2LP desde USB. La implementación básica proviene de la nota de aplicación AN63620 de Cypress, pero en su lugar, Spartan 3 uso Spartan 6 (xc6slx4), y el diseño del pin es diferente para las señales de control. Utilizo el bus de 8 bits para la configuración, pero como era más fácil enrutarlos, se mezclan a partir de algunos bits en los buses de datos 0-7 y 8-15 de Cypress. Modifiqué la fuente de Cypress para cargar palabras de 16 bits y escribí una aplicación host que mezcla bits en el orden correcto. Revisé el bus con el analizador lógico, y todo parece estar bien, puedo ver claramente la secuencia de inicio (0xAA 0x99 0x55 0x66 en el orden de bits correcto).
Mi problema es que el FPGA ni siquiera inicia la configuración. Creo que esto es porque si leo el registro de estado, todo es igual, igual que después del restablecimiento de PROG_B, cada bit de error es 0. Incluso traté de enviar una secuencia dañada con la secuencia de inicio correcta para ver si puedo obtener algunos bits de error. 1 (principalmente error CRC), pero no puedo. Siempre se quedan 0.
Puedo programar el FPGA con JTAG y mi aplicación de parpadeo liderada por hello world (cronometrada desde CCLK) para que el FPGA no se dañe físicamente. Medí todos los voltajes de suministro, todos son correctos, con muy poco ruido.
En el registro de estado leído puedo ver que M1 = 1 y M0 = 0, que es la configuración correcta para el esclavo SelectMAP.
Leí una oración en la guía de configuración de Spartan 6 que no puedo encontrar en Spartan 3: "Antes de sincronizar la detección de palabras, los pines D [0: n] se muestrean en cada borde del reloj, independientemente del estado de CSI_B" . ¿Esto significa que los bytes subsiguientes de la palabra de sincronización deben ponerse en el bus inmediatamente después de cada uno y no puede ser detenido por CSI_B? Si este es el caso, la interfaz GPIF no se puede usar para cargar la configuración (porque toma muchos ciclos de reloj por byte, y la carga está controlada por CSI_B). ¿Quizás solo importa la secuencia, y no la sincronización de la palabra de sincronización?
Ni siquiera puedo encontrar ningún ejemplo de alguien que intente configurar un Spartan 6 con Cypress y SelectMAP Slave.
¿Cuál podría ser el problema? Tal vez algunos problemas de integridad de la señal que no importan para el analizador, pero sí para el FPGA?
EDITAR: Resolví el problema cortando la línea del reloj y conectándola a un GPIO del Cypress, até CSI_B a tierra y modifiqué el mismo flujo de bits en cada uno de los flancos ascendentes del reloj.