Forum: FPGA, VHDL & Co. NIOS II auf FPGA für Anfänger


von Alex T. (tutsch)


Lesenswert?

Hallo.

Ich habe jetzt schon eine ganze weile in diesem Forum nach einträgen 
gesucht die mir helfen könnten und leider nichts gefunden.

Seit kurzem Besitze ich das Eva. Board DE1 von Altera. Ich habe schon 
kleinere VHDL-dateien geschrieben und sie erfolgreich über JTAG auf den 
FPGA Cyclon II EC2C20F484C7 übertragen.
Jetzt wäre die nächste Aufgabe in meinem Projekt den NIOS II prozessor 
auf den FPGA zu bringen und programmierbar zu machen.
Da ich neu bin auf dem Gebiet habe ich absolut keine Ahnung wie ich das 
angehen muss.
ein paar tipps zum anfang wären nicht schlecht, da die tutorials nicht 
gerade übersichtlich sind und mich zum teil eher verwirren.
über links die das vorgehen leicht und verständnisvoll beschreiben wäre 
ich auch dankbar

hier ein paar fragen vorab:

angenommen ich hab den NIOS II prozessor nun auf dem fpga und schreibe 
jetzt eine c-datei mit NIOS II IDE, wird dann der prozessor dabei nicht 
überschrieben wenn ich anschließend diese auf den fpga übertrage oder 
muss ich einen anderen speicherplatz angeben?
und wie verwende ich dann die PINs/ports? haben diese Namen oder 
Adressen?

Ich möchte zum einstieg erstmal ein programm schreiben das eine led des 
boards blinken lässt. wär super wenn ihr mir helfen könntet

danke schon im vorraus
tutsch

von Alex T. (tutsch)


Lesenswert?

Hallo, bin durch nachforschen im internet auf ein nios tutorial 
gestoßen. Hab alles genau nach gemacht wie es dort verlangt wurde. Wenn 
ich jetzt beim SOPC-Builder jetzt allerdings auf generate klicke kommt 
folgende Fehlermeldung. die datei nios_sh ist in dem ordner jedoch 
vorhanden. woran könnte es liegen?



Info: first_nios2_system: Generating QIP file.
Info: Starting PTF file elaboration.
      5 [main] sh 988 fork: child 1164 - died waiting for longjmp before 
initialization, errno 11
d:/programme/altera fpga/quartus/sopc_builder/bin/nios_sh: fork: 
Resource temporarily unavailable
      8 [main] sh 3408 fork: child 2980 - died waiting for longjmp 
before initialization, errno 11
d:/programme/altera fpga/quartus/sopc_builder/bin/nios_sh: fork: 
Resource temporarily unavailable
Error: D:\Programme\altera 
fpga\NIOS2_Prozessor_SELBER/first_nios2_system.ptf: Failed to refresh 
PTF file
Info: Finished elaborating PTF file.
Executing: d:/programme/altera 
fpga/quartus//sopc_builder/bin/sopc_builder --classic --generate 
D:/Programme/altera fpga/NIOS2_Prozessor_SELBER/first_nios2_system.ptf
Info: Starting generation...
      6 [main] sh 3964 fork: child 1652 - died waiting for longjmp 
before initialization, errno 11
d:/programme/altera fpga/quartus/sopc_builder/bin/nios_sh: fork: 
Resource temporarily unavailable
Error: System generation failed.


gruß christoph

von Roger S. (edge)


Lesenswert?

Installationspfad mit spaces scheint dem SOPC Builder immer noch nicht 
zu bekommen:

d:/programme/ altera fpga /quartus/sopc_builder/

Cheers, Roger

von Alex T. (tutsch)


Lesenswert?

hi,

erstmal danke für deine antwort.
habe jetzt quartus auf ein neues verzeichnis installiert.
jetzt bringt er beim generieren diese Fehlermeldung

Info: meinNIOS2: Generating QIP file.
Info: Starting PTF file elaboration.
      6 [main] sh 3868 fork: child 2324 - died waiting for longjmp 
before initialization, errno 11
d:/programme/altera/quartus/sopc_builder/bin/nios_sh: fork: Resource 
temporarily unavailable
Error: D:\Programme\altera\meinNIOS2/meinNIOS2.ptf: Failed to refresh 
PTF file
Info: Finished elaborating PTF file.
Executing: d:/programme/altera/quartus//sopc_builder/bin/sopc_builder 
--classic --generate D:/Programme/altera/meinNIOS2/meinNIOS2.ptf
Info: Starting generation...
      6 [main] sh 4092 fork: child 2000 - died waiting for longjmp 
before initialization, errno 11
d:/programme/altera/quartus/sopc_builder/bin/nios_sh: fork: Resource 
temporarily unavailable
Error: System generation failed.

von Alex T. (tutsch)


Lesenswert?

habe den Fehler immernoch und kann ihn nicht beseitigen,
hat jemand von euch eine idee woran es liegen könnte?
(betriebssystem vista, quartus v7.2)

gruß christoph

von Matze (Gast)


Lesenswert?

An deiner Stelle würde ich die 9.0 Version der Quartus Software sowie 
die der NiosII IDE installieren. Wie Roger schon bemerkte, lass die 
Leerzeichen im Installationspfad raus. Dann müsste die Geschichte ohne 
Probleme funktionieren. Habe hier das gleiche Bord vor mir liegen und 
benutzte die besagten Version beider Programme; das klappt prima!
Gruss, Matthias

von Alex T. (tutsch)


Lesenswert?

hi,

ihr hattet recht, mit der version 9.0 funktioniert alles einwandfrei!!
Danke.

Nun noch eine frage:
ich hab jetzt ein NIOS II prozessor auf meinen board gespielt und möchte 
es jetzt mit NIOS IDE programmieren.
als erstes habe ich ein beispiel programm "binary_count" verwendet was 
einwandfrei funktioniert.

Wenn ich jetzt aber mein eigenes Programm schreibe, wie greife ich dann 
auf die IOs zu? kann ich die Namen vom Blockschaltbild verwenden oder 
die Adressen? und wenn die adressen, wie finde ich sie?
Oder doch die einzelnen PINS?

vielen dank schonmal. Ihr habt mir bisher sehr geholfen

von Matze (Gast)


Lesenswert?

Beides geht! Nach der ersten Kompilierung (Build) kannst du die 
Headerdatei
"system.h" einbinden. In ihr sind jegliche Zuordnungen enthalten. Wenn 
du nun auf eine PIO names INTERFACE zugreifen möchtest kann das über den 
Alias
INTERFACE_BASE geschehen oder die Adresse die diesem define in der 
Headerdatei zugeordnet wurde. Also einfach mal via SOPC Builder eine PIO 
Einbinden, als Ausgang konfigurieren und schon kanns losgehen.
Gruss, Matthias

von Alex T. (tutsch)


Angehängte Dateien:

Lesenswert?

danke mathias.

Aber irgendwie wills bei mir nicht klappen.
Also ich hab jetzt mein blockschaltbild mal angehängt.
über jtag programm drauf gespielt und den prozessor mit einem 
count_binary
standard programm getestet und funktioniert einwandfrei.

jetzt hab ich selber ein neues projekt mit dem nios II ide gemacht und 
erstmal build geklickt. danach diese quelldatei geschrieben:

#include "system.h"

int main(void)
{
    LEDG0=0;
    LEDG1=1;
}

natürlich gab es beim Kompilieren Fehler. wie genau müsste ich jetzt 
vorgehen wenn ich LEDG0 z.b. auf null setzen möchte?
(blockschaltbild im anahng)

von Matze (Gast)


Lesenswert?

Wie ich sehe heisst deine PIO LED_PIO, sprich du musst diese mit 
PIO_LED_BASE ansprecehn, wenn du den Portstate verändern mäöchtest. Bei 
deinem Programm wirst du zudem das Problem haben, dass du das Toggeln 
der LED's nicht sehen wirst. Das geht leider etwas zu schnell ;-) Klick 
mal auf system.h, da findest du dann irgendwo dein PIO Interface. Wie du 
siehst steht hinter dem ..._BASE #define nichts anderes als die Adresse, 
die du der Komponente im SOPC Builder zugordnet hast.
Gruss, Matze

von Alex T. (tutsch)


Lesenswert?

hi
ok. also ich habe jetzt den port mit LED_PIO_BASE angesprochen. hiermein 
programm das nur die erste led des ports aufleuechten lassen soll:

#include "system.h"

int main(void)
{

   LED_PIO_BASE=1;
    while(1);
    return 0;
}


Bekomme aber folgende Fehlermeldung


make -s all includes
Compiling main.c...
../main.c: In function `main':
../main.c:9: error: invalid lvalue in assignment
make: *** [obj/main.o] Error 1
Build completed in 20.353 seconds

von Matze (Gast)


Lesenswert?

Sorry, da habe ich selbst gerade etwas übersehen. Probiere es mal bitte 
so:

#include "altera_avalon_pio_regs.h"
#include "system.h"
#include <stdio.h>

int main()
{
  IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0x01);

  while (1);

  return 0;
}

Matze

von Alex T. (tutsch)


Lesenswert?

funktioniert leider auch nicht.
hier die fehlermeldung:


**** Build of configuration Debug for project blank_project_0 ****

make -s all includes
Compiling main.c...
../main.c: In function `main':
../main.c:6: error: syntax error before numeric constant
make: *** [obj/main.o] Error 1
Build completed in 27.554 seconds

von Alex T. (tutsch)


Lesenswert?

jetzt gehts.
ich habe noch ein paar enter nach der main klammer gemacht und jetzt 
kompiliert er es fehlerfrei....kein plan warum. ist wohl ein bug im 
prgramm.

aber jetz wäre es noch super wenn du mir erklären könntest was diese 
zeile macht und wieso ich diese funktion aufrufen muss. ist es nicht 
direkt möglich den port zu beschreiben?

IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0x01);


christoph

von Matze (Gast)


Lesenswert?

Müsste so laufen

#include "system.h"

int main()
{

  unsigned int *ptr = (unsigned int*)LED_PIO_BASE ;

  *ptr =0x01;

  while (1);

  return 0;
}

Gruss, Matze

von Matze (Gast)


Lesenswert?

"aber jetz wäre es noch super wenn du mir erklären könntest was diese
zeile macht und wieso ich diese funktion aufrufen muss. ist es nicht
direkt möglich den port zu beschreiben?

IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0x01);"

Dies ist eine einfache Definition in der Headerdatei:

#include "altera_avalon_pio_regs.h"

Macht die ganze GEschichte etwas lesbarer.

von Alex T. (tutsch)


Lesenswert?

ok. schonmal vielen dank.
wenn ich jetzt den port einen namen geben möchte.
wie gehe ich dann vor?
z.b. ich möchte meinen port jetzt Port3 nennen.
ich kenne es so, dass man dann z.b. sfr Port3 = 0xAdresse schreibt.
mir ist aufgefallen, dass das bei nios leider nicht geht. Gibts eine 
möglichkeit soetwas zu machen?
(sozusagen eine eigene Headerdatei zu erstellen)

von Tim (Gast)


Lesenswert?

Was meinst du denn genau mit Port? Der Port hat doch schon einen Namen 
--> PIO_LED_BASE !?!

von Roger S. (edge)


Lesenswert?

> ich kenne es so, dass man dann z.b. sfr Port3 = 0xAdresse schreibt.

Hier ist es halt anders.
Folgendes ist moeglich:
1
volatile unsigned long* my_port = (volatile void*)PIO_LED_BASE;
2
*my_port = 0xCAFEBABE;

Nur machst du dir damit eine Wurmbuechse auf.
Die Register der SOPC Komponenten sind memory mapped, darunter auch die 
des PIO. Sobald du ein NIOS mit data cache hast, sind die selbst 
gestrickten Zugriffe nicht mehr zuverlaessig.
Sollte die PIO Komponente mal eine andere register map haben, faellst du 
damit auch auf die Nase.

Desshalb gibts die Makros wie
1
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0xCAFEBABE);
da wird dann ein Zugriff mittels IO Instruktion gemacht, welche am cache 
vorbei gehen.

> (sozusagen eine eigene Headerdatei zu erstellen)

All die Arbeit nimmt dir der SOPC Builder ja ab, alle Komponenten sind 
in der system.h drin.

Cheers, Roger

von Alex T. (tutsch)


Lesenswert?

ok gut danke.

welche funktionen gibt es denn noch und wo finde ich diese?
wie spreche ich dann zum beispiel meinen timer an?

gruß christoph

von Matze (Gast)


Lesenswert?

genauso wie deine PIO --> memory mapped peripheral components. Der Timer 
hat wie dein PIO Interface eine fix definierte Adresse. Die 
Funktionalität des Timers, sowie aller anderer Komponenten ist auf eine 
Registerstruktur abgebildet. Durch das beschreiben der jeweiligen 
Register kannst du den Timer konfigurieren, starten etc. Schau dir mal 
das Altera Handbuch zu diesem Thema an.
Gruss, Matze

von Castro (Gast)


Lesenswert?

Hallo zusammen, ich habe ein paar Codes, Matrizen Rechnungen,Kalman 
Filter,Gauß Verfahren und mochte die auf FPGA zum laufen bringen. Da ich 
nur die Codes kenne und weisst nicht wie der Einstiegt dazu ist, möchte 
ich wissen was ist für mich den nächsten Schritt, wo soll ich anfangen.
Gruß.
Castro

von Phil (Gast)


Angehängte Dateien:

Lesenswert?

hi leute,


habe gerade diesen thread hier gefunden! Dieser passt ziemlich genau auf 
mein problem das ich zurzeit auch habe. Habe eine ganz ähnliche 
Struktur, aus dem angehängten Blockschaltbild könnt ihr entnehmen das 
dies dem weiter oben dargestellten recht nahe kommt.

Dieses Struktur habe ich mit der Software Quartus 2 und dem SOPC Builder 
erstellt.

Am Ausgang des PIO ist noch ein zusätzliches Nicht Glied geschaltet da 
das Entwicklungsboard auf dem ich arbeite (Cyclone II mit EP2C25F672C6N 
FPGA) mit negativer Logik arbeitet und die LED's ohne dieses Nicht Glied 
quasi immer angeschaltet wären.

Dies habe ich nun mit Quartus 2 vollständig kompiliert und auf mein FPGA 
geschrieben, dies funktioniert auch einwandfrei.

Jetzt möchte ich ebenfalls gewisse LED's ansteuern.

Ab diesem Punkt komme ich nicht mehr weiter.

Denn ich möchte dazu die "System Console" des SOPC Builders nutzen und 
damit quasi die LED's steuern.

Dies soll schlußendlich darauf hinauslaufen das ich beispielsweise die 
Koeffizienten eines FIR Filters ändern kann, ohne das komplette Design 
immer neu kompilieren zu müssen.

Hoffe ihr könnt mir hier helfen!

lg phil

von Roger S. (edge)


Lesenswert?

Phil schrieb:
> habe gerade diesen thread hier gefunden! Dieser passt ziemlich genau auf
> mein problem das ich zurzeit auch habe.

Aber trotzdem haettest du einen neuen thread aufmachen koennen!

> Jetzt möchte ich ebenfalls gewisse LED's ansteuern.
> Ab diesem Punkt komme ich nicht mehr weiter.

Da die LEDs an einem PIO haengen und dieser an einem NIOS, machst du das 
in C. Kreiere ein neues C/C++ Projekt im NIOS EDK und waehle als 
template "Board Diagnostics" dann solltest du was zum zurechtschnippeln 
haben.

> Denn ich möchte dazu die "System Console" des SOPC Builders nutzen und
> damit quasi die LED's steuern.

Die System Console steht dir als stdin/stdout zur verfuegung, wenn du in 
deinem SOPC eine JTAG UART drinn hast und diese in der sytem library 
auch darauf gemapt hast.

> Dies soll schlußendlich darauf hinauslaufen das ich beispielsweise die
> Koeffizienten eines FIR Filters ändern kann, ohne das komplette Design
> immer neu kompilieren zu müssen.

Oje, laeuft der FIR in software oder als HDL?
Bei letzterem nimmst du besser eine oder mehrere virtual JTAG 
komponenten.

Cheers, Roger

von Phil (Gast)


Angehängte Dateien:

Lesenswert?

hi roger,

vielen dank erstmal für deine wirklich flotte antwort"


"Aber trotzdem haettest du einen neuen thread aufmachen koennen!"
Ich hab das deshalb nicht gemacht weil es in vielen anderen Foren immer 
heißt "benutzt doch erstmal die Such-Funktion" ;-)



"
> Jetzt möchte ich ebenfalls gewisse LED's ansteuern.
> Ab diesem Punkt komme ich nicht mehr weiter.

Da die LEDs an einem PIO haengen und dieser an einem NIOS, machst du das
in C. Kreiere ein neues C/C++ Projekt im NIOS EDK und waehle als
template "Board Diagnostics" dann solltest du was zum zurechtschnippeln
haben.
"

Okay erstmal, wo in welchen Dokument finde ich die Information das die 
PIO an einem Nios hängen? Leider ist mir die allgemein diese struktur 
noch etwas schleierhaft.

Nun ich wollte mit Nios 2 IDE genau das erstellen, allerdings fehlt mir 
wohl was zum "zurechtschnippeln" Was meinst du damit?
Ich habe anbei mal ein Screenshot drangehängt, was meine Problemstellung 
verdeutlichen soll.

"
> Denn ich möchte dazu die "System Console" des SOPC Builders nutzen und
> damit quasi die LED's steuern.

Die System Console steht dir als stdin/stdout zur verfuegung, wenn du in
deinem SOPC eine JTAG UART drinn hast und diese in der sytem library
auch darauf gemapt hast.
"

In meinem SOPC habe ich folgendes drin:
JTAG to Avalon Master Bridge ("Avalon Memory Mapped Master")
PIO ("Avalon Memory Mapped Slave")

Diese sind auch miteinander verbunden im SOPC. Ich habe diese 
Konfiguration so übernommen weil diese in einem Beispiel "LED Lightshow 
Example" welches in einem Alterdokument drin stand, so vorgegeben wurde.

Den Rest lasse ich einfach mal weg da ich nunmal Neuling auf diesem 
gebiet bin und mir das alles noch ein wenig schwer fällt. :-)


lg phil

von Roger S. (edge)


Lesenswert?

Phil schrieb:
> "Aber trotzdem haettest du einen neuen thread aufmachen koennen!"
> Ich hab das deshalb nicht gemacht weil es in vielen anderen Foren immer
> heißt "benutzt doch erstmal die Such-Funktion" ;-)

Mag sein, bloss hast du ein neues Problem, das verdient auch einen neuen 
thread, weil um dir zu helfen will keiner das alte Geschreibsel 
durchackern.

> Okay erstmal, wo in welchen Dokument finde ich die Information das die
> PIO an einem Nios hängen? Leider ist mir die allgemein diese struktur
> noch etwas schleierhaft.

Das legst du im SOPC builder fest.

> In meinem SOPC habe ich folgendes drin:
> JTAG to Avalon Master Bridge ("Avalon Memory Mapped Master")
> PIO ("Avalon Memory Mapped Slave")

Das reicht nicht fuer das Nios EDK, um damit ein C/C++ Projekt betreiben 
zu koennen brauchts mindestens noch eine NIOS CPU und etwas Speicher.
4KB On-Chip RAM reichen fuer etwas blinke blinke.

Die Fehlermeldung in deinem screenshot sagt uebrigens dasselbe.

> Diese sind auch miteinander verbunden im SOPC. Ich habe diese
> Konfiguration so übernommen weil diese in einem Beispiel "LED Lightshow
> Example" welches in einem Alterdokument drin stand, so vorgegeben wurde.

Da hat es sicher auch ein NIOS drinn.

Cheers, Roger

von Phil (Gast)


Lesenswert?

"Das reicht nicht fuer das Nios EDK, um damit ein C/C++ Projekt 
betreiben
zu koennen brauchts mindestens noch eine NIOS CPU und etwas Speicher.
4KB On-Chip RAM reichen fuer etwas blinke blinke.

Die Fehlermeldung in deinem screenshot sagt uebrigens dasselbe."

Okay das wusste ich nicht!

"Da hat es sicher auch ein NIOS drinn."

Das ist eben der Punkt, im SOPC Builder von diesem Beispiel taucht keine 
Nios CPU und kein Ram Speicher auf!!! Daher bin ich davon ausgegangen 
das meins dann stimmt...leider fehlt mir die Kenntniss darüber ob das 
nicht doch in irgend einem HDL Code drin steht..ich weiß es nicht.


Okay nun gut ich habe jetzt im SOPC Builder noch eine Nios CPU eingefügt 
sowie 4 KB Ram Speicher den du erwähnt hattest.

Nachdem ich das nun in mein Schematic File eingebunden und nochmal 
kompiliert habe, hat es anschließend funktioniert.

Ich konnte über die "System Console" ganz einfach die LED's ansteuern!

Danke nochmal für deine Hilfe!!

Werde für meine nächste Frage nun einen neuen Thread aufmachen, das ist 
doch ein klein wenig komplexer! :-)


lg Phil

von Peter M. (Gast)


Lesenswert?

Und hier ist noch ein Einsteiger ;-)

Ich hab eine n-Kanal-PWM mit dem Nios verknüpft und greife wie folgt auf 
eine PWM zu:

void PWMout (int channel, int value){

    IOWR_ALTERA_AVALON_PIO_DATA(PWM_SEL_BASE, channel);
    IOWR_ALTERA_AVALON_PIO_DATA(PWM_DATA_BASE, value);
}

 while( 1 )
    {
        PWMout(1, 50);
    }
    return 0;

Wie bekomme ich es jetzt hin, gleichzeitig mehrere Kanäle (unabhängig 
voneinander) anzusteuern.

Und ich bin (noch) kein C-Guru. Arbeite mich gerade erst ein.

von Peter M. (Gast)


Lesenswert?

> und greife wie folgt auf eine PWM zu:

Muss heißen: " und greife wie folgt auf einen PWM-Kanal zu:... "

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.