Programación de múltiples FPGAs usando JTAG

9

Tengo una cadena JTAG que conecta 4 FPGA Spartan 6 que programo usando ISE iMPACT. El software puede programar cualquier subconjunto estricto de los 4 FPGA seguidos con éxito y en cualquier orden. Sin embargo, cuando intento programar los cuatro FPGA, el pin HECHO del último FPGA no sube y la programación falla.

¿Qué podría estar causando este extraño comportamiento?

Notas:

  1. Después de programar tres de los FPGA, el bit INIT_B del registro de estado para el cuarto FPGA es 0, aunque el pin INIT_B es alto. Justo antes de programar el tercer FPGA, ese bit era 1. Esto sugiere que el cuarto FPGA se ha bloqueado.
  2. Al programar con SelectMap, puedo programar los cuatro FPGA sin ningún problema.
  3. Cuando programo tres de los FPGA con SelectMap, el cuarto todavía no se puede programar con JTAG.
  4. Cada uno de los cuatro pines hechos se levanta a 3V3 a través de resistencias de 4.7K Ohm, y luego se unen.

Cosas que he probado :

  1. Desconectar uno de los FPGA de la cadena permite que los 3 FPGA restantes aún estén programados.

  2. Cambiar la resistencia pull-up de 4.7K Ohm del último FPGA por una resistencia de 330 Ohm no resuelve el problema.

Randomblue
fuente
2
¿Qué quieres decir con "último FPGA"? Porque en la Guía del usuario se dice "The first device in a serial daisy chain is the last to be configured."¿Quieres decir el último en la cadena o el último en configurarse (primero en la cadena)? ¿Podría proporcionar un esquema?
embedded.kyle
2
Esta declaración en p59 me hace pensar lo contrario,"If the Spartan-6 device is configured via JTAG, the configuration instructions occur independent from the mode pins."
embedded.kyle
Después de familiarizarme con la Guía del usuario (han pasado aproximadamente 6 meses desde que hice el trabajo de FPGA), estoy un poco confundido por su terminología. Daisy Chain se utiliza junto con la programación en serie. En cuyo caso, los DONEpasadores están unidos entre sí. Para JTAG, la programación de múltiples dispositivos se llama Boundary-Scan Chain. En Chapter 3: Boundary-Scan and JTAG Configuration, la única mención del DONEpin es "If JTAG is the only configuration mode, then PROGRAM_B, INIT_B, and DONE can be tied High to a 330 resistor."¿Entonces el DONEpin low es el único problema? ¿Se programa correctamente?
embedded.kyle
vamos a continuar esta discusión en el chat
embedded.kyle
Creo que el hecho de que puedas obtener 3 pero no 4 es una pista. Consulte el Capítulo 4 de la Guía del programador de JTAG para diseñar sistemas de escaneo de límites: xilinx.com/support/sw_manuals/2_1i/download/jtag.pdf
embedded.kyle

Respuestas:

6

El DONEpin no se usa durante la programación de JTAG y se puede atar alto:

Si JTAG es el único modo de configuración, entonces PROGRAM_B, INIT_B y DONE pueden vincularse High a una resistencia de 330Ω. (p57)

Sin embargo, si se utiliza la programación en serie, todos los DONEpines deberían estar unidos y DriveDonedesactivados para todos los dispositivos, excepto el primero:

Es importante conectar los pines HECHOS para todos los dispositivos en una conexión en serie. Si no se conectan los pines HECHOS, la configuración puede fallar. (p135)

Todos los dispositivos, excepto el primero, deben desactivar el controlador en el pin HECHO. (p135)

Si se van a utilizar ambos, hay dos opciones:

Alternativamente, el controlador se puede desactivar para todos los pines HECHOS y se puede agregar una resistencia pull-up externa para extraer la señal High después de que todos los dispositivos la hayan liberado. (p135)

Para fines de depuración, a menudo es útil tener una forma de desconectar los pines DONE individuales de la señal DONE común, de modo que los dispositivos se puedan configurar individualmente a través de la interfaz serial o JTAG. (p135)

En su caso, creo que conectarlos y atarlos a todos mientras deshabilita el DONEpin es la mejor manera de hacerlo.

Todos los números de página hacen referencia a la Guía del usuario

Embedded.kyle
fuente
Hmmm ... Si atabas INIT_Balto y el INIT_Bbit en el registro de estado es 0, eso indicaría una falla de hardware para mí. A menos que pueda programar ese chip de forma independiente, lo que creo que dijo que podía. El DONEpin pasa a High-Z durante la programación, así que no sé qué hace el registro de estado durante ese punto. Si el LSB del registro de estado FPGA anterior es 1, eso indica un error CRC en ese dispositivo que puede impedir la programación del siguiente.
embedded.kyle
Problema encontrado (ver mi solución). Gracias por tu ayuda.
Randomblue
3

Resultó que el culpable era el INIT_Balfiler. Aunque se tiró alto, ya que se programaron los primeros FPGA, el INIT_Bpasador se tiró gradualmente hacia abajo y hacia abajo debido a un desplegable interno.

Después de que se programaron tres FPGA, el INIT_Bpin se tiró lo suficientemente bajo como para que el cuarto FPGA se interprete INIT_Bcomo un bajo lógico, evitando así que el cuarto FGPA se programe con JTAG.

Randomblue
fuente
Ω
Resulta que hay opciones bitgen para especificar que el INIT_Bpin se levante en lugar de bajar después de la programación.
Randomblue