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
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.
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.
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.
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
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.
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...
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!
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.
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...
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
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).
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.