Programmieren mehrerer FPGAs mit JTAG

9

Ich habe eine JTAG-Kette, die 4 Spartan 6-FPGAs verbindet, die ich mit ISE iMPACT programmiere. Die Software kann jede strenge Teilmenge der 4 FPGAs hintereinander erfolgreich und in beliebiger Reihenfolge programmieren. Wenn ich jedoch versuche, alle vier FPGAs zu programmieren , geht der DONE-Pin des letzten FPGA nicht hoch und die Programmierung schlägt fehl.

Was könnte dieses seltsame Verhalten verursachen?

Anmerkungen:

  1. Nach dem Programmieren von drei der FPGAs ist das INIT_B-Bit des Statusregisters für das vierte FPGA 0, obwohl der INIT_B-Pin hoch ist. Kurz vor dem Programmieren des dritten FPGA war dieses Bit 1. Dies deutet darauf hin, dass das vierte FPGA blockiert ist.
  2. Bei der Programmierung mit SelectMap kann ich problemlos alle vier FPGAs programmieren.
  3. Wenn ich drei der FPGAs mit SelectMap programmiere, kann das vierte immer noch nicht mit JTAG programmiert werden.
  4. Jeder der vier fertigen Pins wird über 4,7 kOhm Widerstände auf 3V3 hochgezogen und dann miteinander verbunden.

Dinge, die ich versucht habe :

  1. Durch Trennen eines der FPGAs von der Kette können die verbleibenden 3 FPGAs noch programmiert werden.

  2. Das Austauschen des 4,7-K-Ohm-Pull-up-Widerstands des letzten FPGA gegen einen 330-Ohm-Widerstand löst das Problem nicht.

Zufälliges Blau
quelle
2
Was meinst du mit "letztes FPGA"? Denn im Benutzerhandbuch heißt es: "The first device in a serial daisy chain is the last to be configured."Meinst du das Letzte in der Kette oder das Letzte, das konfiguriert werden soll (das Erste in der Kette)? Könnten Sie einen Schaltplan bereitstellen?
embedded.kyle
2
Diese Aussage auf Seite 59 lässt mich anders denken,"If the Spartan-6 device is configured via JTAG, the configuration instructions occur independent from the mode pins."
embedded.kyle
Nachdem ich mich mit dem Benutzerhandbuch vertraut gemacht habe (es ist ungefähr 6 Monate her, seit ich FPGA-Arbeit geleistet habe), bin ich etwas verwirrt von Ihrer Terminologie. Daisy Chain wird in Verbindung mit der seriellen Programmierung verwendet. In diesem Fall sind die DONEStifte miteinander verbunden. Für JTAG wird die Programmierung mehrerer Geräte als Boundary-Scan-Kette bezeichnet. In Chapter 3: Boundary-Scan and JTAG Configuration, die einzige Erwähnung des DONEPins ist "If JTAG is the only configuration mode, then PROGRAM_B, INIT_B, and DONE can be tied High to a 330 resistor."Also ist der DONEPin niedrig das einzige Problem? Programmiert es richtig?
embedded.kyle
Lassen Sie uns diese Diskussion im Chat fortsetzen
embedded.kyle
Ich denke, die Tatsache, dass Sie 3, aber nicht 4 bekommen können, ist ein Hinweis. Lesen Sie Kapitel 4 des JTAG-Programmierhandbuchs zum Entwerfen von Boundary-Scan-Systemen: xilinx.com/support/sw_manuals/2_1i/download/jtag.pdf
embedded.kyle

Antworten:

6

Der DONEPin wird während der JTAG-Programmierung nicht verwendet und kann hochgebunden werden:

Wenn JTAG der einzige Konfigurationsmodus ist, können PROGRAM_B, INIT_B und DONE High an einen 330Ω-Widerstand gebunden werden. (S. 57)

Wenn jedoch die serielle Programmierung verwendet wird, sollten alle DONEPins miteinander verbunden und DriveDonefür alle Geräte außer dem ersten deaktiviert sein:

Es ist wichtig, die DONE-Pins für alle Geräte in einer seriellen Daisy Chain anzuschließen. Wenn die DONE-Pins nicht angeschlossen werden, schlägt die Konfiguration möglicherweise fehl. (S. 135)

Alle Geräte außer dem ersten sollten den Treiber am DONE-Pin deaktivieren. (S. 135)

Wenn beide verwendet werden sollen, gibt es zwei Möglichkeiten:

Alternativ kann der Treiber für alle DONE-Pins deaktiviert und ein externer Pull-up-Widerstand hinzugefügt werden, um das Signal High zu ziehen, nachdem alle Geräte es freigegeben haben. (S. 135)

Für Debugging-Zwecke ist es oft hilfreich, einzelne DONE-Pins vom gemeinsamen DONE-Signal zu trennen, damit Geräte über die serielle oder JTAG-Schnittstelle individuell konfiguriert werden können. (S. 135)

In Ihrem Fall denke ich, dass DONEes der beste Weg ist, sie zu verbinden und alle hoch zu binden, während der Pin deaktiviert wird.

Alle Seitenzahlen beziehen sich auf das Benutzerhandbuch

embedded.kyle
quelle
Hmmm ... Wenn Sie INIT_Bhoch gebunden haben und das INIT_BBit im Statusregister 0 ist, würde dies auf einen Hardwarefehler für mich hinweisen. Es sei denn, Sie können diesen Chip unabhängig programmieren, was Sie meiner Meinung nach könnten. Der DONEPin geht während des Programmierens auf High-Z, daher weiß ich nicht, was das Statusregister während dieses Punktes tut. Wenn das LSB des vorherigen FPGA-Statusregisters 1 ist, weist dies auf einen CRC-Fehler in diesem Gerät hin, der möglicherweise die Programmierung des nächsten verhindert.
embedded.kyle
Problem gefunden (siehe meine Lösung). Danke für deine Hilfe.
Randomblue
3

Es stellte sich heraus, dass der Schuldige der INIT_BStift war. Obwohl hochgezogen, als die ersten FPGAs programmiert wurden, wurde der INIT_BStift aufgrund eines internen Pulldowns allmählich tiefer und tiefer gezogen.

Nachdem drei FPGAs programmiert worden waren, wurde der INIT_BPin so tief gezogen, dass das vierte FPGA INIT_Bals logisch niedrig interpretiert werden konnte , wodurch verhindert wurde, dass der vierte FGPA mit JTAG programmiert wurde.

Zufälliges Blau
quelle
Ω
Es stellt sich heraus, dass es Bitgen-Optionen gibt, mit denen festgelegt werden kann, dass der INIT_BStift nach dem Programmieren nach oben anstatt nach unten gezogen wird.
Randomblue