Electronic – Programming multiple FPGAs using JTAG


I have a JTAG chain connecting 4 Spartan 6 FPGAs that I program using ISE iMPACT. The software can program any strict subset of the 4 FPGAs in a row successfully, and in any order. However, when I attempt to program all four FPGAs, the DONE pin of the last FPGA does not go high, and the programming fails.

What could be causing this strange behaviour?


  1. After programming three of the FPGAs, the INIT_B bit of the status register for the fourth FPGA is 0, although the INIT_B pin is high. Right before programming the third FPGA, that bit was 1. This suggests the fourth FPGA has locked up.
  2. When programming with SelectMap, I can program all four FPGAs without any problem.
  3. When I program three of the FPGAs using SelectMap, the fourth one still cannot be programmed using JTAG.
  4. Each of the four done pins are pulled-up to 3V3 through 4.7K Ohm resistors, and then tied together.

Things I have tried:

  1. Disconnecting one of the FPGAs from the chain allows for the remaining 3 FPGAs to still be programmed.

  2. Swapping the 4.7K Ohm pull-up resistor of the last FPGA for a 330 Ohm resistor doesn't solve the problem.

Best Answer

The DONE pin in not used during JTAG programming and can be tied high:

If JTAG is the only configuration mode, then PROGRAM_B, INIT_B, and DONE can be tied High to a 330Ω resistor. (p57)

However, if Serial programming is used, then all the DONE pins should be tied together and the DriveDone should be disabled for all devices except the first:

It is important to connect the DONE pins for all devices in a serial daisy chain. Failing to connect the DONE pins can cause configuration to fail. (p135)

All devices except the first should disable the driver on the DONE pin. (p135)

If both are to be used, there are two options:

Alternatively, the driver can be disabled for all DONE pins and an external pull-up resistor can be added to pull the signal High after all devices have released it. (p135)

For debugging purposes, it is often helpful to have a way of disconnecting individual DONE pins from the common DONE signal, so that devices can be individually configured through the serial or JTAG interface. (p135)

In your case, I think connecting them and tying them all high while disabling the DONE pin is the best way to go.

All page numbers reference the User Guide