Forum: FPGA, VHDL & Co. Cyclone 3 Starter Kit - Externer Flash via JTAG schreiben/lesen


von LdB (Gast)


Lesenswert?

Hallo zusammen,

ich habe ein Cyclone 3 Starter Kit. Auf diesem befindet sich ein 
externer Flash (von Intel), der mit dem FPGA verbunden ist. Diesen 
externen Flash versuche ich nun zu beschreiben und schließlich die Daten 
von ihm zu lesen. Also vereinfacht gesagt, will ich Schreib- und 
Leseoperationen ausführen. Diese Operationen sollen jedoch über die JTAG 
Schnittstelle erfolgen. D.h., dass die Daten über die JTAG-Schnittstelle 
gesendet werden und schließlich an dem externen Flash anliegen sollen. 
Somit sollen auch die Daten über die JTAG-Schnittstelle gelesen werden 
können.

Da ich mit FPGAs noch nicht soviel zu tun hatte, kenn ich mich auch 
nicht besonders gut mit ihnen aus. Deshalb auch meine Frage, ob dies 
jemand schon gemacht hat und mir somit helfen kann? Hat einer eine gute 
Idee, wie ich vorgehen kann? Gibt es evtl. von Altera schon 
vorgefertigte Tools, die dieses Ziel erreichen? Mir ist jeder Tipp/Rat 
willkommen.

Viele Grüße

von Sigi (Gast)


Lesenswert?

"Kit Installation"-exe (Altera-Seite) installiert alle
möglichen Infos inkl. Docs etc.
Dort findest du eine Anleitung zum Programmieren des
Flash als auch ein POF-File für das Rücksetzen auf
Werkseinstellung.

von LdB (Gast)


Lesenswert?

Danke für die Antwort.

Nur nutze ich den Altera-Programmer, wenn ich den Flash beschreibe. Ich 
will aber eine Art Bootloader in VHDL schreiben, der mir den externen 
Flash über JTAG beschreibt. Denn das ganze soll schließlich auf eine 
andere Hardware portiert werden.

Hat dazu vllt. jemand eine Idee?

Gruß

von Kest (Gast)


Lesenswert?

Geh einfach in Quartus -> Programmer -> Add Device und dann statt .sof 
wählst Du Dein Flash-Device aus (ob jetzt seriell oder parallel musst Du 
schauen). Wenn Du soweit bist, wird vom Quartus automatisch (in 
Abhängigkeit von Deinem FPGA) ein SOF File in das FPGA erzeugt/geladen 
(quasi ein Wrapper JTAG->FLASH) und darüber kannst Du dann Deine Daten 
laden.

Und ja, es gibt von Altera Tools dafür. Allerdings habe ich selber noch 
nie einzelne Adressen oder so beschrieben, sondern gleich ganze Dateien 
geflasht.

Kest

von LdB (Gast)


Lesenswert?

Danke für die Antwort Kest. Trotzdem habe ich noch ein paar Fragen.

Wenn ich dich richtig verstanden habe, kann Quartus selbstständig ein 
Programm einfügen, das die JTAG-Schnittstelle mit der 
FLASH-Schnittstelle vebindet. Und über dieses Programm ist es mir dann 
möglich, meine Daten über JTAG zu flashen. Ist das richtig so? Klappt 
das mit jedem beliebigen Flash?

Auf meiner Zielhardware befindet sich nämlich ein MX29LV320C Flash (das 
Board ist nur für Testzwecke da). Ist es mit diesem auch möglich? Zudem 
würde mich interessieren, wie dieses Programm aussieht. Ist es evtl. 
möglich, dass ich den VHDL Code hinter dem Programm sehen kann? Denn 
genau diese Programm, das die JTAG- mit der Flash-Schnitstelle 
verbindet, will ich nämlich schreiben.

Mir reicht es übrigens, wenn ich die ganzen Programme flashe. Einzelne 
Adressen schreiben, liegt zunächst nicht in meinem Interesse.

Und nochmal zum Quartus-Programmer. Wenn ich diesen öffne, dann befindet 
sich oberhalb meine kompilierte .sof und unterhalb mein FPGA. Muss ich 
nicht vllt. den FPGA highlighten -> Attach Flash Device durchführen?

Kest schrieb:
> Geh einfach in Quartus -> Programmer -> Add Device und dann statt .sof
> wählst Du Dein Flash-Device aus (ob jetzt seriell oder parallel musst Du
> schauen)

Dies verwirrt mich nämlich ein bisschen, da statt einer .sof ein 
Flash-Device ausgewählt werden soll?! Deshalb bitte ich nochmals um eine 
genauerer Erklärung falls möglich.

Bitte habt etwas Geduld mit mir, denn aller Anfang ist schwer.

Viele Grüße

von Kest (Gast)


Angehängte Dateien:

Lesenswert?

LdB schrieb:
> Wenn ich dich richtig verstanden habe, kann Quartus selbstständig ein
> Programm einfügen, das die JTAG-Schnittstelle mit der
> FLASH-Schnittstelle vebindet. Und über dieses Programm ist es mir dann
> möglich, meine Daten über JTAG zu flashen. Ist das richtig so? Klappt
> das mit jedem beliebigen Flash?

Du hast richtig verstanden. Ich denke nicht, dass es mit jedem 
beliebigen Flash klappt. Stichwort CFI-Flash: schaue bei Altera nach, ob 
das möglich ist. Wichtig ist nur, dass Dein CFI-Flash an den "richtigen" 
Pins des FPGAs häbngt (Standardbelegung), denn woher soll dann das FPGA 
wissen, wie Dein Flash angebunden ist ;-)

LdB schrieb:
> Zudem
> würde mich interessieren, wie dieses Programm aussieht. Ist es evtl.
> möglich, dass ich den VHDL Code hinter dem Programm sehen kann? Denn
> genau diese Programm, das die JTAG- mit der Flash-Schnitstelle
> verbindet, will ich nämlich schreiben.

Wenn Du das machen möchtest, dann müsstest Du tiefer in die Materie 
einsteigen. Es gibt keinen fertigen VHDL Code dafür. Aber Du könntest 
ein NIOS System erstellen mit einem CFI-Flash controller, dann in C die 
Flash-Bibliotheken einbinden -- dann hättest Du die Möglichkeit Flash zu 
beschereiben/zu lesen. Dann müsstest Du Dich noch mit JTAG-Schnittstelle 
auseinandersetzen, um darüber die DAten zu schieben. Ist wohl möglich, 
aber ich habe es nie gemacht (mit JTAG).

Was ich öfters gemacht habe war einfache ein "Bootloader": die Daten 
kommen über UART/USB/Ethernet rein und werden in das Flash 
geschrieben/gelesen.

LdB schrieb:
> Und nochmal zum Quartus-Programmer. Wenn ich diesen öffne, dann befindet
> sich oberhalb meine kompilierte .sof und unterhalb mein FPGA. Muss ich
> nicht vllt. den FPGA highlighten -> Attach Flash Device durchführen?

Ja, genau das musst Du tun!

LdB schrieb:
> Dies verwirrt mich nämlich ein bisschen, da statt einer .sof ein
> Flash-Device ausgewählt werden soll?! Deshalb bitte ich nochmals um eine
> genauerer Erklärung falls möglich.

Sobald Du "Attach Flash Device" gemacht hast, wird Deine "*.sof" Datei 
blau gehiglighted. Das heißt, diese Datei kommt jetzt von Altera 
(Factory default PFL image)

Das müsste so gehen (ob das mit Deinem Flash geht, kann ich aber nicht 
sagen, kannst Du aber mit Verify mal "checken", ob's läuft).

Ansonsten liesmal die Doku (Stichwort: CFI, PFL image, Flash 
programming...) :-)

Grüße,
Kest

von LdB (Gast)


Angehängte Dateien:

Lesenswert?

Also nochmals Danke für die ausführliche Erklärung.

Also ich benutze noch das Cyclone 3 Starter Kit als Testhardware. Und 
ich bin langsam am verzweifeln. Ich bin genau wie Du es gesagt hast 
vorgegangen und trotzdem ist das Ganze fehlgeschlagen.

Zunächst habe ich mein Design kompiliert und den Programmer gestartet. 
Über Attach Flash Device habe ich den auf dem Board befindlichen Intel 
128Mb Flash ausgewählt. Nur habe ich das Problem, dass meine .sof nicht 
blau gehighlightet wird. Als, dass der factory default PFL, wie bei dir 
eingefügt wird. Und beim Laden des Programms es eine Fehlermeldung gibt.
Hast du evtl. dafür auch eine Idee? Muss ich vllt. noch irgendetwas 
aktivieren?

Gruß

von Kest (Gast)


Lesenswert?

Du brauchst keine SOF!
- Einfach alles löschen
- Add device
- FPGA Auswählen (Cyclone III)
- auf das "none" gehen
- rechte Masutaste -> "Attach Flash Device"
- Flash auswählen -> ok
- es steht immer noch "none" nicht in Blau!
- jetzt auf z.B. "black check" beim Flash kliken
- "none" wird zu "Factory default PFL image"

Das war's

Kest

von LdB (Gast)


Lesenswert?

Vielen Dank Kest. Es hat gleich funktioniert.

Nur noch eine Frage zu deinen "Bootloadern", da ich ja das gleiche 
ereichen will. Hast du diese Bootloader in VHDL geschrieben oder hast du 
sie in einem Nios System erstellt? Was ist deiner Meinung nach 
einfacher, da ich mich zuerst daran versuchen will, bevor ich evtl. die 
schwerer Methode angehe?

Wäre nett, wenn du mir noch antwortest, auch wenn du schon die Nerven 
mit mir verloren hast ;-).

Gruß

von Kest (Gast)


Lesenswert?

Ich habe alles mit dem SOPC und NIOS erstellt. Die Treiber für Flash 
gibts ja auch noch dazu deshalb macht da keinen Sinn selber was zu 
machen.
Mit dem SOPC ist es auf jeden Fall einfacher (und schneller)! Es gibt ja 
unendlich viele Beispiele von Altera (Application Notes).

Grüße,
Kest

von LdB (Gast)


Lesenswert?

Also ich habe mich jetzt für die Qsys-Variante entschieden. Der 
SOPC-Builder von Quartus ist scheinbar veraltet. Ist aber soviel ich 
weiß dasselbe.

Für mein System habe ich nun folgende Komponenten:
- einen NIOS2 prozessor
- ein System ID Peripheral
- ein Common Flash Interface
- ein JTAG UART Core

Ist das alles? Oder habe ich evtl. etwas vergessen?


Gruß

von Kest (Gast)


Lesenswert?

Das ist im Prinzip alles. Vielleicht noch den Speicher, aus dem das 
NIOS-Programm laufen soll? ;-)

Grüße,
Kest

von Duke Scarring (Gast)


Lesenswert?

LdB schrieb:
> Ist das alles? Oder habe ich evtl. etwas vergessen?
Mal doch mal, wie Du die Komponenten miteinander verbinden willst.
Da kann man auch viel besser Lücken und Engpässe ausmachen.

Duke

von LdB (Gast)


Angehängte Dateien:

Lesenswert?

Duke Scarring schrieb:
> Mal doch mal, wie Du die Komponenten miteinander verbinden willst.

Ok. Ich habe ein Bild angefügt, wie des ganze System aussehen soll. 
Zudem habe ich die genaue Verschaltung des Systems in Qsys angehängt.

Nun habe ich aber ein Problem mit dem Adress Map. Ich weiß nicht ganz 
genau, wie man die Base-Adresse und die End-Adresse herausfindet oder 
berechnet. Ich habe nämlich noch einen Haufen voll von Errors, weil die 
Adressen sich überlappen. Kann mir einer sagen, wie ich die Adressen 
berechnen kann, sodass die Messages verschwinden? Die Wahl der Adressen 
ist doch nicht beliebig oder?

Gruß

von Kest (Gast)


Lesenswert?

Hallo,

ich habe ja schon vorhin geschrieben -- für den Nios bräuchtest Du jetzt 
RAM, zur Zeit lässt Du alles aus dem Flash laufen -> keine gute Idee, 
wenn man mit dem Zugriff auf den Flash noch nicht klar kommt. Mach also 
ein On-Chip Memory rein, mit der passenden Größe und verbinde es mit dem 
NIOS.

Um die Basis-Adressen automatisch zuzuweisen gehst Du auf System-> 
Assign Base Addresses.

Grüße,
Kest

von LdB (Gast)


Lesenswert?

Ok. Danke für den Hinweis. Ich mach auch gleich einen On-Chip Ram rein. 
Muss ich alle End-Adressen zuweisen oder nur die der Speicher?

von Kest (Gast)


Lesenswert?

Wenn Du Base-Adressen automatisch zuweist (wie ich geschrieben habe), 
dann musst Du überhaupt nichts mehr machen
Kest

von LdB (Gast)


Angehängte Dateien:

Lesenswert?

Also, ich hab jetzt die Hardware-Komponenten fertig, wie man im 
Screenshot sieht. Ich habe das System mit Qsys aufgebaut. Muss nun noch 
die .qsys umgeformt werden, damit ich die.sopcinfo bekomme? Oder brauch 
ich die erst gar net?

Mein Vorgehen sieht jetzt wie folgt aus. Zunächst werde ich nun in 
Quartus in einer .bdf das System implementieren und den Clk und Reset 
mit Inputpins versehen und die Ausgänge zuweisen. Danach das System 
kompilieren um die .sof zu erhalten. Mit dieser .sof muss ich ja mein 
FPGA laden. Nun sollte es mir in NIOS2 SBT for Eclipse möglich sein, 
mein System zu generieren. Die C-Bibliotheken müssten dann schon 
enthalten sein oder irre ich mich da? Muss ich diese evtl selbst 
einfügen? Wenn dies geschehen ist, kann ich ja die Software in mein 
Nios-System laden und es sollte funktionieren. Hab ich evtl etwas 
vergessen?

Und zuletzt würde mich interessieren, ob des ganze überhaupt mit der 
Quartus II Web Edition möglich ist oder brauche ich die lizensierte 
Version?

Grüße

von Kest (Gast)


Lesenswert?

Das ganze funktioniert auch mit der Web-Edition (falls nur NIOS-e 
eingebunden wird). Ansonsten musst Du halt immer JTAG dranlassen.

Wenn Du Eclipse startest, neues Projekt anlegst, die richtige .sopcinfo 
auswählst, werden alle treiber-Dateien automatisch eingebunden.

Kest

von LdB (Gast)


Lesenswert?

Also ich habe jetzt mein Qsys-System fertig. Die Generierung war 
ebenfalls erfolgreich mit keinen Errors und keinen Warnings. Nun füge 
ich mein System in mein Quartus-Projekt ein. Dazu erstelle ich eine .bdf 
und füge das System als Blockschaltbild ein, verbinde die Ein- und 
Ausgänge jeweils mit den richtigen Pins. Nur ist mir aufgefallen, dass 
die JTAG-Schnitstelle nicht im Blockschaltbild vorhanden ist. Ist das so 
richtig?

Nachdem ich nun die.qip eingebunden habe, kompilier ich nun das ganze 
System. Dies geschieht auch ohne Errors, jedoch mit 72 Warnings. Davon 
sind vier critical Warnings. Ist das normal? Funktioniert des System 
trotzdem, wie es soll?

Zumindest will ich noch die Critical Warnings wegbekomen. Und zwar 
erhalte ich viermal:
Critical Warning (332168): The following clock transfers have no clock 
uncertainty assignment. For more accurate results, apply clock 
uncertainty assignments or use the derive_clock_uncertainty command.

Hattest du des schon und kannst mir helfen?

Gruß

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.