Forum: FPGA, VHDL & Co. Wie bekomme ich den NIOS II und eine C-Anwendung dafür dauerhaft auf einen Cyclone II?


von Sebastian H. (ti-bastler)


Lesenswert?

Hallo Mikrocontrollerfreunde,

ich brauche mal eure Hilfe. Ich habe das DE2-Development-Board von 
Altera mit einem Cyclone II EP2C35 und Config.-Device EPCS16 drauf. 
Darin habe ich ein Nios II Prozessor System implementiert und dafür eine 
C-Anwendung geschrieben. Das läuft als Testvariante (.sof-Datei über 
Byteblaster auf Board laden und anschließend Software mit der Nios IDE 
starten) wunderbar. Nun habe ich mir auch eine volle Lizenz besorgt, um 
die Anwendung auch nach Abschalten der Betriebsspannung auf dem Board zu 
behalten. Allerdings ist mir noch völlig unklar, wie man den Prozessor 
und die Anwendung auf einmal auf das Board läd, so dass das Programm 
gleich nach anlegen der Versorgungsspannung losläuft. Welche Datei 
enthält die Software für dauerhaftes Draufladen? Wo muss die Software 
hingeschrieben werden? In den On-Chip-ROM? In das Confg.-Device? Eines 
von beidem wäre wichtig, da ich bei Erfolg selbst eine Cyclone 
II-Platine bauen will, die außer den beiden Chips (EP2C8 und EPCS4) und 
ein paar Schaltern, LEDs, Steckern nichts enthalten soll (kein Flash-ROM 
oder zusätzlichen RAM).

Ich habe bisher erfolglos versucht, das Problem mit dem Flash Programmer 
der NIOS IDE zu lösen. Damit schreibt man angeblich das Programm in das 
Config.- Device. Dazu habe ich im Nios-System einen EPCS-Controller 
eingefügt. Hoffe, das war richtig. Schien mir aber logisch, damit der 
Prozessor auf das Config.-Device zugreifen kann. Jedenfalls bringt der 
Flash Programmer immer folgende Meldungen:


+++++++++++++++++++++++++Fehlermeldung++++++++++++++++++++++++++++++
**** Build of configuration Debug for project nimmde2 ****

make -s all includes
Linking nimmde2.elf...
/cygdrive/c/Programme/TI/Altera/Nios II Design 
Suite/nios2eds/bin/nios2-gnutools/H-i686-pc-cygwin/bin/../lib/gcc/nios2- 
elf/3.4.1/../../../../nios2-elf/lib/mno-hw-mul//libsmallc.a(writer.o)(.t 
ext+0x20):  In function `_write_r':
/build/nios2eds-gnutools-win32-7.2/bin/nios2-gnutools/src/newlib/newlib/ 
libc/reent/writer.c:58:  warning: warning: write is not implemented and 
will always fail
/cygdrive/c/Programme/TI/Altera/Nios II Design 
Suite/nios2eds/bin/nios2-gnutools/H-i686-pc-cygwin/bin/../lib/gcc/nios2- 
elf/3.4.1/../../../../nios2-elf/bin/ld:  region epcs_controller is full 
(nimmde2.elf section .text). Region needs to be 12432 bytes larger.
/cygdrive/c/Programme/TI/Altera/Nios II Design 
Suite/nios2eds/bin/nios2-gnutools/H-i686-pc-cygwin/bin/../lib/gcc/nios2- 
elf/3.4.1/../../../../nios2-elf/bin/ld:  section .rodata [00121800 -> 
00121b4b] overlaps section .text [00121800 -> 0012508f]
collect2: ld returned 1 exit status
make: *** [nimmde2.elf] Error 1
Build completed in 8.0 seconds

++++++++++++++++++++++++Ende Fehlermeldung+++++++++++++++++++++++++++

auch wenn das Board aus ist. Kann mir nicht vorstellen, das der EPCS16 
zu klein für das Programm sein soll. Ist die Vorgehensweise prinzipiell 
richtig? Was gibt es noch für Möglichkeiten? Angeblich kann man auch den 
On-Chip-Rom mit einer .hex-File initialisieren. Klingt auch nicht 
schlecht aber wie mache ich aus meinem Programm so eine .hex-File und 
wie integriere ich die in die .pof des Systems?

Ich bin sehr dankbar für jeden Hinweis. Eine 
Schritt-für-Schritt-Anleitung wäre natürlich super oder ein Link dazu 
...

Schon jetzt vielen Dank für eure Hilfe.

Grüße von

Sebastian

von Kest (Gast)


Lesenswert?

Eine HEX Datei wird automatisch generiert, wenn Du Build anklikst. Diese 
Datei ist meistens im Verzeichnis, wo auch die .ptf .sof Dateien sind 
und heist sie dann auch onchip.hex oder ähnlich.
Im SOPC-Builde gehst Du auf onchip_inst, machst EDIT und klickst das 
Kästchen an, wo steht, dass dieser Speicher mit einer bestimmten 
Hex-Datei initialisiert werden soll...

So viel dazu, wenn Dein Programm in den onchip-Speicher passt. Ansonsten 
speicherst Du Dein Program im EPCS (oder anderen Flash) und kannst auch 
daraus Deine Anwendung starten. Beim NIOS musst Du dann angeben, wohin 
die Reset-Vektoren zeigen.

Alles in Einem ist es trivial. Wenn Dein Programm aber nicht in den EPCS 
passt, hast Du ein Problem ;-) Dann schreib doch einen bootloader, der 
die Daten von UART, SD/MMC-Karte oder Flash liest.

Hoffe konnte Dir ein bisschen helfen,

Kest

von Sebastian H. (ti-bastler)


Lesenswert?

Danke für deine schnelle Antwort. Das klingt alles schon ganz gut. Aber 
...

Der SOPC-Builder erzeugt eine rom.hex-Datei im NIOS-Verzeichnis. Die 
enthält ja aber nicht das Programm, das ich mit der NIOS IDE geschrieben 
habe. In meinem Softwareprojektverzeichnis befindet sich keine 
.hex-Datei. Wie erzeuge ich aus meinem Programm eine .hex-Datei?


Wie und mit welcher Software schreibe ich mein Programm (in welcher 
Datei-Form?) in den EPCS??? (Schritt für Schritt).

Komme noch nicht wirklich weiter.

von Kest (Gast)


Lesenswert?

Wenn Du in der NIOS IDE dem Nios sagst, wohin er das Programm ablegen 
soll (System Library Propertys) und da onchip_mem anwählst (Program 
memory, ...), dann generiert er diese HEX Datei auch im gleichen 
Verzeichnis.


Um ans EPCS ranzukommen (über JTAG) musst Du erst EPCS instaniieren. 
Dann kommst Du auch mit Flash-Tool (über IDE) da ran. Dies ist aber 
etwas komplizierter... Allerdings, wird dabei auch POF Datei erstellt, 
die lädst Du dann über Active Serial rein (so wie immer, nehme ich an). 
Dann ist automatisch alles drin.

Kest

von Sebastian H. (ti-bastler)


Lesenswert?

Ich bins mal wieder. Vielen Dank für deine bisherigen Hinweise. 
Allerdings lösen die mein Problem noch nicht. Ich kann jetzt schon die 
C-Anwendung in Form einer rom.hex-File mit in die NIOS-POF einbinden. 
Die Fehlermeldung mit dem zu kleinen EPCS kam daher, dass ich die 
Anwendung in den System-Properties (NIOS-IDE) in den EPCS-Controller 
schreiben wollte, was anscheinen so nicht funktioniert. Jetzt habe ich 
herausgefudne, dass das mit dem Flash-Programmer funktioniert, indem man 
in den Properties das Programm in den RAM legt und den Reset-Vektor auf 
den EPCS-Controller zeigen lässt. Das hab ich auch schon hinbekommen, 
ABER:

Auf meinem Zielsystem habe ich nur OnChip-RAM oder/und ROM. Da passt 
mein Programm aber auch in Form einer .hex-File oder wie oben mit 
Flash-Programmer beschrieben, nicht rein. Gibt es eine Möglichkeit, das 
C-Programm dirkt in den EPCS4 zu schreiben und es von dort auszuführen, 
ohne dass es im RAM/ROM des NIOS liegt? Ich gehe mal davon aus, dass in 
den EPCS4 mehr reinpasst als in den On-Chip-RAM/ROM.

Bisher kann ich (auf dem EP2C35 mit ext. SRAM) experimentell das 
Programm im RAM platzieren und den Reset-Vektor auf den EPCS zeigen 
lassen. Dann schreibt er es auch in den EPCS und startet es auch von 
dort. Aber hier habe ich wie gesagt extern genug RAM, um darin das 
Programm abzulegen. Das ist auf meinem Zielsystem nicht der Fall. Kann 
ich das Programm also direkt in den EPCS4 schreiben und von dort starten 
(ohne, dass es in meinem RAM liegt, da der zu klein ist)???

von Roger S. (edge)


Lesenswert?

Sebastian Haschke wrote:
> Gibt es eine Möglichkeit, das
> C-Programm dirkt in den EPCS4 zu schreiben und es von dort auszuführen,
> ohne dass es im RAM/ROM des NIOS liegt? Ich gehe mal davon aus, dass in
> den EPCS4 mehr reinpasst als in den On-Chip-RAM/ROM.

Dazu muss man das EPCS mittels eines eigenen IP linear in den Avalon 
Addressraum reinmappen. Mit ALTERA Bordmitteln geht das nicht. Jedoch 
bist du nicht der Erste mit der Idee.

In der 'Post your own IP' section im niosforum hat schon jemand ein 
'EPCS Virtual Memory' veroeffentlicht. Ich habe es jedoch selbst noch 
nicht ausprobiert.

Du findest das Forum unter http://www.niosforum.com/

Cheers, Roger

von Kest (Gast)


Lesenswert?

@Sebastian Haschke (ti-bastler):

okay, ich glaube, ich verstehe jetzt, was Du meinst. Ich würde so 
vorgehen:

1.) EPCS-Controller im SOPC einbinden
Damit kannst Du aus und in den EPCS lesen/schreiben.

2.) Aus NIOS aus, mit NIOS -> Tools -> Flashprogrammer kannst Du dann 
belibige Dateien, in den EPCS an eine bestimmte Adresse schreiben. Somit 
kannst Du dann dein Program dahin verfrachten (in welcher Form das 
Programm liegt, weis ich jetzt aus dem Kopf nicht, aber irgendwas mit 
.HEX oder wie auch immer)

3.) Dann solltest Du die Dokus von Altera lesen (EPCS Cotntroller, 
Bootloader und so weiter und so fort). Dann schreibst Du so einen 
Bootloader, der Dein Programm aus dem EPCS in dein RAM lädt und dann 
startet. Ich habe sowas nur teilweise gemacht, wird aber nicht schwer 
sein -- halt Fleißarbeit.


Mit dem Bootloader kannst Du dann belibige Programme aus dem EPCS laden 
und ausführen.

Grüße,
Kest

p.s.:
> Auf meinem Zielsystem habe ich nur OnChip-RAM oder/und ROM. Da passt
> mein Programm aber auch in Form einer .hex-File oder wie oben mit
> Flash-Programmer beschrieben, nicht rein.

das habe ich nicht verstanden :-o Was heißt "auch in Form einer .hex 
Datei"?

von Sebastian H. (ti-bastler)


Lesenswert?

Danke für eure Antworten. Über den 'EPCS Virtual Memory' werde ich mich 
mal informieren.

Ich habe nicht genügend Platz um das Programm in den On-Chip-Memory 
(egal ob RAM oder ROM im FPGA) zu laden weil es 15 kByte groß ist und in 
den EP2C8 nur 9 kByte On-Chip-Memory reinpassen. Gibt es eine 
Möglichkeit, das Programm direkt aus dem EPCS Config. Device zu laden 
(so wie aus einem EEPROM)? Wenn ich das mit dem 68k von Motorola 
vergleiche, habe ich da ja mein Programm direkt in den EEPROM 
geschrieben und es direkt von dort mittels Resetvektor ausgefürt. Genau 
so was brauche ich (allerdings mit dem EPCS als Speicher). Ich gehe 
immer noch davon aus, dass in den EPCS mehr reinpasst als in den FPGA 
selbst. Nur wie?

Das mit dem Bootloader klingt sehr kompliziert und scheint mein Problem 
auch nicht zu lösen, da der das Programm auch nur in den RAM kopiert und 
dann ausführt. In meinen RAM passt das Programm aber leider nicht rein. 
Hat noch jemand eine Idee?

von Kest (Gast)


Lesenswert?

MAn kann das Program direkt aus dem Flash ausführen, egal ob EPCS oder 
andere. Dies habe ich schon oben gesagt, aber scheinbar hast Du es nicht 
ausprobiert?

Wenn Du EPCS Controller im SOPC integrierst, dann kannst Du auch bei 
NIOS IDE (Propertys) auswählen, wo dein Stack liegt, wo Dein Read-Only 
Speicher und wo der Programspeicher liegen soll. Da wählst Du halst 
statt onchip, Epcs aus und fertig! Melde Dich, wenn es klappt.


Grüße,

Kest

von Sebastian H. (ti-bastler)


Lesenswert?

Hallo Kest,
das habe ich so schon vor meiner ersten Fragestellung ausprobiert und 
dabei die oben stehende Fehlermeldung bezüglich zu wenig Platz im EPCS 
erhalten. Funktioniert so also nicht.

von Sebastian H. (ti-bastler)


Lesenswert?

Ich hab gerade im Cyclone Handbuch gelesen, dass man eine Kompression 
der POF-File einstellen kann. Die Dekompression macht der Cyclone dann 
beim Laden selbst, in seinen RAM, von dem ich zu wenig habe :-(. Würde 
das bei 12 kByte, die an Programmspeicher im EPCS fehlen, was bringen 
oder verschiebe ich damit den Platzmangel nur wieder? Denn wohin soll er 
es entpacken, wenn nicht genug RAM drin ist ...

von Kest (Gast)


Lesenswert?

ich fürchte, das kannst Du dann vergessen. WEnn es nicht genug Speicher 
auf dem Board gibt, dann ist es eben so. Die Kompression kannst Du 
zunächst mal für FPGA-Konfiguration einstellen, vielleicht reicht es 
schon aus, dass DEin Program noch reinpasst.

Was ist das überhaupt für Programm, was Du da reinflashen möchtest? Hast 
Du viele Printf's? Hast Du "small C-Library" angeklickt? Vielleicht gibt 
es anders wo Einsparmöglichkeiten.


Grüße,
Kest

von Roger S. (edge)


Lesenswert?

Kest wrote:
> MAn kann das Program direkt aus dem Flash ausführen, egal ob EPCS oder
> andere.

Mit dem standard EPCS Controller geht das eben nicht. Der EPCS 
Controller hat nur Platz fuer einen Bootloader in einem M4K, welcher 
standardmaessig die Software vom EPCS in ein RAM kopiert.

Cheers, Roger

von Roger S. (edge)


Lesenswert?

Sebastian Haschke wrote:
> Ich hab gerade im Cyclone Handbuch gelesen, dass man eine Kompression
> der POF-File einstellen kann. Die Dekompression macht der Cyclone dann
> beim Laden selbst, in seinen RAM, von dem ich zu wenig habe :-(. Würde
> das bei 12 kByte, die an Programmspeicher im EPCS fehlen, was bringen
> oder verschiebe ich damit den Platzmangel nur wieder? Denn wohin soll er
> es entpacken, wenn nicht genug RAM drin ist ...


Komprimiert wird nur der Bitstream. Unkomprimiert braucht der beim EP2C8 
etwa die haelfte deines EPCS4. Also haettest du worst case knapp 256KB 
fuer deinen code uebrig.

Cheers, Roger

von Sebastian H. (ti-bastler)


Lesenswert?

Hallo Roger,
die 256kB wären bei Komprimierung im EPCS frei für meinen Code. Ich kann 
sie mit dem Standard-EPCS aber nicht dafür nutzen, richtig? Also kann 
ich in meinem Fall nur soviel Code reinschreiben, wie in den 
On-Chip-Memory passt, oder?

Mal noch ne andere Frage:
Sieht man im SOPC-Builder VOR dem Compilieren/Generieren des 
Nios-Systems irgendwo, wie viel On-Chip-Memory da rein passt?

von Roger S. (edge)


Lesenswert?

Sebastian Haschke wrote:
> die 256kB wären bei Komprimierung im EPCS frei für meinen Code. Ich kann
> sie mit dem Standard-EPCS aber nicht dafür nutzen, richtig? Also kann
> ich in meinem Fall nur soviel Code reinschreiben, wie in den
> On-Chip-Memory passt, oder?

Genau. Wie gesagt um dein Problem zu loesen schau dich nach IPs wie dem 
'EPCS Virtual Memory' um, die Idee ist nicht neu.

> Mal noch ne andere Frage:
> Sieht man im SOPC-Builder VOR dem Compilieren/Generieren des
> Nios-Systems irgendwo, wie viel On-Chip-Memory da rein passt?

Nein.

Cheers, Roger

von Sebastian H. (ti-bastler)


Lesenswert?

Auf

http://www.fpga.nl

finde ich keinen Link zu IP-Cores. Woher bekomme ich das Teil? Oder gibt 
es das schon im SOPC-Builder? Da hab ich noch ein "Active Serial Memory 
Interface" gefunden. Allerdings steht da im Datenblatt auch nur, dass es 
das Prgramm beim Booten in den RAM kopiert. Stimmt das oder könnte das 
weiter helfen?

von Roger S. (edge)


Lesenswert?

Sebastian Haschke wrote:
> Auf
>
> http://www.fpga.nl
>
> finde ich keinen Link zu IP-Cores. Woher bekomme ich das Teil?

bei http://www.niosforum.com registrieren und dann in die 
Post-your-own-IP section.

> Oder gibt
> es das schon im SOPC-Builder? Da hab ich noch ein "Active Serial Memory
> Interface" gefunden. Allerdings steht da im Datenblatt auch nur, dass es
> das Prgramm beim Booten in den RAM kopiert. Stimmt das oder könnte das
> weiter helfen?

Das ASMI ist der Vorgaenger des EPCS Controllers. Bringt dir nichts.


Cheers, Roger

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.