Forum: FPGA, VHDL & Co. Cyclone III JTAG erkennen


von Markus F. (mfro)


Lesenswert?

Erstmal voraus: ich gestehe, ich bin FPGA-Anfänger, um nicht zu sagen, 
Laie.

Trotzdem habe ich eine Frage, auf die ich auf die Schnelle beim Suchen 
keine Antwort gefunden habe.

Ich habe hier einen Cyclone III EP3C16, der an einem Coldfire-Prozessor 
hängt. Beim Systemstart bekommt der FPGA per nCONFIG, nSTATUS und 
DATA0-"Bit-banging" seine Config von der Firmware des Microcontrollers 
geladen, der dazu die Konfiguration aus einem Flash holt was soweit auch 
zuverlässig funktioniert.

Nun hätte ich aber gerne die Config per USB Blaster auch mal über den 
JTAG-Anschluss des FPGA's geladen, damit ich nicht nach jeder 
Konfig-Änderung neu flashen muß.

Dazu habe ich mir überlegt, die Microcontroller-Firmware so zu ändern, 
daß sie zunächst nur eine "Mini-Config" aus dem Flash in den FPGA lädt, 
die nichts anderes tut als den JTAG-Anschluß anzugucken, ob da wohl der 
USB-Blaster draufsteckt und abhängig vom Ergebnis (ein paar GPIO's des 
Coldfires hängen am FPGA) entweder den FPGA aus dem Flash (wie seither) 
neu konfiguriert oder drauf wartet, bis das per JTAG geschehen ist.

Natürlich könnte ich auch eine zweite Microcontroller-Firmware basteln, 
die immer auf JTAG wartet, aber ich habe keine Lust, immer hin und her 
zu Flashen und zwei Versionen zu verwalten.

Worum's mir geht ist die erwähnte "Mini-Config" (ich denke, den Rest 
krieg' ich hin): wie erkenne ich, ob der USB-Blaster (an TCK, TDI, TDO 
und TMS) angesteckt und aktiv ist? TCK ist per 10K Pulldown an GND und 
der Rest per 10K an 3.3V abgeschlossen.

Hat schon mal jemand was ähnliches gemacht und vielleicht sogar ein 
Beispiel dazu? Oder bin ich gedanklich auf dem Holzweg?

Herzlichen Dank schon mal für Ideen und Antworten.

Gruß,
Markus

von Christian R. (supachris)


Lesenswert?

Das brauchst du alles gar nicht. Ich bin mir ziemlich sicher, dass auch 
beim Cyclone der JTAG Anschluss immer und unabhängig vom eingestellten 
Confi-Modus zur Konfiguration benutzt werden kann. Bei Xilinx ist es 
jedenfalls so. Also einfach per JTAG im laufenden Betrieb das Prog-File 
direkt auf dem FPGA austauschen und fertig.

von Markus F. (mfro)


Lesenswert?

Christian R. schrieb:
> Das brauchst du alles gar nicht. Ich bin mir ziemlich sicher, dass auch
> beim Cyclone der JTAG Anschluss immer und unabhängig vom eingestellten
> Confi-Modus zur Konfiguration benutzt werden kann. Bei Xilinx ist es
> jedenfalls so. Also einfach per JTAG im laufenden Betrieb das Prog-File
> direkt auf dem FPGA austauschen und fertig.

Danke, aber so einfach isses - glaub' ich - leider nicht.

Der FPGA hängt ziemlich eng verzahnt am Coldfire (er macht für den z.B. 
den DDR- und den Interrupt-Controller) und selbiger fliegt selbstredend 
gehörig auf die Schnauze, wenn ich die Config austausche, nachdem der 
schon gebootet hat (und z.B. davon ausgeht, daß da RAM ist, wo grad' 
noch der FPGA war).

Ich muß also beim Booten (wenn der Microcontroller sich noch 
ausschließlich aus dem Flash versorgt) entweder über JTAG (und da möchte 
ich halt gern erkennen, ob was angesteckt ist) oder über Flash 
konfigurieren.

von P. K. (pek)


Lesenswert?

Du kannst ja dort wo der Prozessor die Config ins FPGA laden würde, 
einfach nichts tun und warten bis der CONF_DONE-Pin vom FPGA hochgeht. 
Dies passiert, sobald Du Deine Config über den JTAG runtergepitzt hast.

von Markus F. (mfro)


Lesenswert?

P. K. schrieb:
> Du kannst ja dort wo der Prozessor die Config ins FPGA laden
> würde,
> einfach nichts tun und warten bis der CONF_DONE-Pin vom FPGA hochgeht.
> Dies passiert, sobald Du Deine Config über den JTAG runtergepitzt hast.

Ja, auch das ist klar.

Dann müsste ich aber zwei Firmwares (??) haben (und pflegen): eine, wo 
der Coldfire den FPGA mit den Daten aus dem Flash konfiguriert und eine, 
wo er nur auf CONF_DONE wartet.

Mir schwebt halt was vor, wo ich erkennen kann, ob an den JTAG-Pins was 
angesteckt ist, und abhängig davon "automatisch" das richtige tue.

: Bearbeitet durch User
von adenin (Gast)


Lesenswert?

Dann must Du extra Leitungen von aussen an den JTAG legen, um ihn zu 
überwachen. Der JTAG-Port intern ist für die geladene Applikation 
unsichtbar.

von G. L. (lele)


Lesenswert?

Wie wärs denn mit einer ganz simplen Lösung?
Einfach mitm uC nen Pin abfragen! Wobei z.B. der Jumper an
jenem Pin immer nur zusammen mit dem JTAG-Stecker gesetzt bzw.
entfernt wird.
Ist "nur" eine IF-Abfrage in der Software...

Ein bisschen umständlicher aber ohne Jumper wäre ein Transistor an jenem
abzufragenden Pin, der vom JTAG-Signal geschaltet wird...

von Markus F. (mfro)


Lesenswert?

G. L. schrieb:
> Einfach mitm uC nen Pin abfragen! Wobei z.B. der Jumper an
> jenem Pin immer nur zusammen mit dem JTAG-Stecker gesetzt bzw.
> entfernt wird.

Wenn's nicht anders geht (und das hier:
> Dann must Du extra Leitungen von aussen an den JTAG legen, um ihn zu
> überwachen. Der JTAG-Port intern ist für die geladene Applikation
> unsichtbar.
scheint ja deutlich dafür zu sprechen, genau das wollte ich wissen, 
schade), werd' ich wohl so was machen müssen, obwohl mir meine 
Schnapsidee deutlich besser gefallen hätte (wenn sie denn funktionieren 
würde).

Mal sehen, ob ich am Mäuseklavier noch ein Schalterchen loseisen kann.

Danke an alle!

von Christian R. (supachris)


Lesenswert?

Ich versteh dein Problem immer noch nicht. Wenn das FPGA (noch) nicht 
geladen ist, darf der µC doch sowieso nix damit anstellen. Ob der nun 
vom µC aktiv oder per JTAG gefüttert wird, tut doch da nix zur Sache. Du 
musst nur in der µC Firmware das Done auswerten und halt warten, bis das 
FPGA (wieder) ansprechbar ist.
Wir machen das seit Jahren genau so, klappt bestens. Da braucht man 
überhaupt keinen extra Aufwand treiben.

von berndl (Gast)


Lesenswert?

Christian R. schrieb:
> Ich versteh dein Problem immer noch nicht

ich ehrlich gesagt auch nicht... Der uC muss halt in Gottes Namen 
wissen, mit was fuer einem Verhalten des FPGAs er zu rechnen hat. Und 
das muss die SW abkoennen! Das ist in diesem Fall eine einfache binaere 
Entscheidung. Und je nachdem wie sich das FPGA meldet mache ich in der 
SW halt dies oder eben jenes...

von Markus F. (mfro)


Lesenswert?

Christian R. schrieb:
> Ich versteh dein Problem immer noch nicht. Wenn das FPGA (noch)
> nicht
> geladen ist, darf der µC doch sowieso nix damit anstellen. Ob der nun
> vom µC aktiv oder per JTAG gefüttert wird, tut doch da nix zur Sache. Du
> musst nur in der µC Firmware das Done auswerten und halt warten, bis das
> FPGA (wieder) ansprechbar ist.

Der Prozessor braucht das FPGA, sobald er das Flash "verlässt", also muß 
er die Config entweder selbst aus dem Flash laden (wenn keiner da ist, 
der ihm das abnimmt) oder warten, bis jemand anderes (das 
JTAG-Interface) das tut (mit einer möglicherweise neuen Config). Jetzt 
könnte ich natürlich hingehen und die Firmware so umschreiben, daß sie 
(von mir aus) 30 Sekunden drauf wartet, bis der FPGA (per JTAG) 
hochkommt (dann hätte ich genug Zeit, in Quartus auf's Knöpfchen zu 
drücken) oder das eben im anderen Fall anschließend selber tun.

Meine Hoffnung war, daß er "von alleine" erkennen könnte, ob sich am 
JTAG-Interface was tut/was angesteckt ist und dann auf jeden Fall wartet 
(dann könnte ich noch mal am Kaffee schlürfen) oder eben sofort selbst 
loslegt, was diese Wartezeit (und die damit einhergehende Verzögerung 
der "normalen" Boot-Zeit) vermeiden würde.

: Bearbeitet durch User
von Christoph Z. (christophz)


Lesenswert?

Markus F. schrieb:
> Dann müsste ich aber zwei Firmwares (??) haben (und pflegen): eine, wo
> der Coldfire den FPGA mit den Daten aus dem Flash konfiguriert und eine,
> wo er nur auf CONF_DONE wartet.

Nö, ein einzelner Source-Code reicht aus.

Dafür gibt es in C und C++ die Möglichkeit mit #ifdef zur Compilierzeit 
Entscheidungen zu treffen. Das passende Gegenstück findest du in den 
Komandozeilen Optionen des Compilers, wo du direkt beim Compileraufruf 
defines deklarieren kannst (oft die Option -D).

von Markus F. (mfro)


Lesenswert?

Christoph Z. schrieb:
> Markus F. schrieb:
> Dafür gibt es in C und C++ die Möglichkeit mit #ifdef zur Compilierzeit
> Entscheidungen zu treffen.

Genau das wollte ich eben vermeiden. Da ist immer die falsche Firmware 
im Flash.

von P. K. (pek)


Lesenswert?

Du kannst ja, wenn CONF_DONE vom FPGA tiefgezogen wird (passiert, wenn 
Du mit dem JTAG den Config-Donwload startest) im Prozessor einen 
Interrupt auslösen, welcher die Zugriffe auf's FPGA unterbindet und ein 
"graceful recovery" einleitet und wieder startet sobald CONF_DONE = 1.

Ich gehe mal davon aus, dass der JTAG in der Entwicklung zum Einsatz 
kommt und nicht im Feld. ein CONF_DONE-basierter IRQ im dümmsten Moment 
sollte also nicht so tragisch sein...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.