Forum: FPGA, VHDL & Co. NIOS II C Anweisung, wie schnell auf andere VHDL Komponente


von Plau S. (radih)


Lesenswert?

Hi

Ich verwende das nios ii cpu (free licence) und habe aussenrum ein Paar 
anderen Komponenten gebaut(in vhdl)

Im nios IDE schreibe ich meine C Programme, allerdings ist es mir 
unklar, wie sich ein C Befehl auf die vhdl Komponente auswirkt(im Bezug 
auf Zeit)

Z.B. setze ich im C-Code eine Variable auf 1, bzw. setze ich einen 
Ausgangport vom NIOS II auf 1(IOWR_ALTERA_AVALON_PIO_DATA(0x00481090, 
"1");), der Ausgang ist zu einer VHDL Komponente verdrahtet.
Mein FPGA läuft auf 50 MHz(Cyclone II Starter Kit) und der Nios II läuft 
auf 50 MHz.

Der Hauptclock ist an den NIOS II und allen anderen VHDL Komponenten 
geschlossen.
Die Frage ist, nach wieviel Clocks ist an der VHDL Komponente sichtbar, 
dass ich im C-Code eine 1 geschickt habe

Die gleiche Frage gilt auch für die umgekehrte Richtung, wenn ich von 
der VHDL Komponente einen Ausgangswert bekomme, soll ich ihn so 
abfragen:
variable=IORD_ALTERA_AVALON_PIO_DATA(0x00481120);

Aber wann soll die Anweisung im C-Code erscheinen(einfach spät genug, 
damit ich auf jeden Fall weiss, dass der Wert da ist, oder gibt es 
andere Tricks?)

Vielen Dank im Voraus

von Oliver N. (neufranke)


Lesenswert?

Du solltest nochmal erklren, was Du willst. Ich lese da:

Wann polle ich eine Signalreaktion, nachdem ich einen Trigger gesetzt 
habe.

?

von Plau S. (radih)


Lesenswert?

Hi,

auf der eine Seite habe ich mein kompiliertes Design(NIOS II + andere 
VHDL Komponenten). Der NIOS CPU kommuniziert mit diesen Komponenten.

auf der anderen Seite habe ich mein C-Programm, welches über den NIOS II 
IDE ausgeführt wird. In diesem C-Programm sage ich, dass der NIOSIICPU 
Signale an den VHDL Komponenten schicken soll(*1) und auch welche von 
der VHDL Komponenten bekommen soll(*2).

Meine Frage bzgl *1 ist:
Wenn ich im C-Programm die Anweisung habe: schicke ein Signal an einer 
der VHDL-Komponenten. Wieviel Clock'Signals vergehen, bis das Signal bei 
der Komponenten sichtbar ist. Alles läuft mit 50 MHz Clocks

Frage bzgl. *2:
Wenn einer der Ausgänge der VHDL Komponenten ein Signal parat hat und 
ich will es durch das C-Programm auslesen, sollte ich wieviele Clocks 
abwarten?
Angenommen, das Design fängt an: Und die VHDL Komponente braucht 10 
Clocks um ein Signal an den Ausgang zu setzen, wie kann ich diese 10 
50MHz-Clocks im C-Programm abmessen(wenn ich for Schleife verwende und 
von 1 bis 10 zähle weiss ich nicht wieviel Clocks das sind)

ich hoffe jetzt ist es leichter beschrieben

von Oliver Bründler (Gast)


Lesenswert?

Wenn du Daten zwischen Nios II und selbst geschriebener Hardware 
austauschen willst, dann kann ich dir nur empfehlen deine selbst 
geschriebenen VHDL-Module an den Avalon-Bus anzubinden. Das geht relativ 
einfach.

Theoretisch könntest du deine Clocks mit einem Timer messen. Finde ich 
aber nicht besonders sauber... Wieso verwendest du nicht ein 
Handshaking? Also dass deine VHDL-Komponente über eine Signalleitung 
bestätigt, dass sie Daten übernommen hat bzw. Daten parat sind.

Gruss Oli

von Gast (Gast)


Lesenswert?

> Frage bzgl. *2:

Wenn das ganze zeitkritisch ist, generiere einen Interrupt sobald das 
Signal gelesen werden soll. Dann kannst du sofort lesen. Was in der 
Hardware anliegt, wird vom Prozessor auch so gelesen.

von Gast (Gast)


Lesenswert?

>Was in der Hardware anliegt, wird vom Prozessor auch so gelesen.

Die Frage ist aber, wie lange er warten muss, bis er es (korrekt) lesen 
kann. Die Hardware tut ja auch etwas, bis sie auf die Software reagiert 
hat ...

von Oliver Bründler (Gast)


Lesenswert?

Einen Interrupt zu Generieren kann bei schneller Hardware problematisch 
sein, da der NIOS II mehr als 100 clockzyklen benötigt um auf einen 
Interrupt zu reagieren... Bei schneller Hardware kann man auch das 
WAIT-Signal des Avalon-Buses solange auf High legen bis die Hardware das 
Resultat bereit hat. Schau dir mal die Bus-Spezifikation des 
Avalon-Buses an und überleg dir ob du die Komponenten wirklich nicht 
direkt anbinden willst. Wäre aus meiner Sicht die einzige wirklich 
saubere lösung um ein einigermassen schneller Handshake zu realisieren.

von Plau S. (radih)


Lesenswert?

Danke erstmal für die zahlreiche Antworten

Würdet ihr mir bitte sagen, wo ich mehr über diesen Avalon-Bus lesen 
kann
(wie kann ich externe Komponenten an diesen Bus anbinden und überhaupt 
wie das Ganze drum herum läuft? Muss ich mit dem SOPC Builder arbeiten?)

von Mathi (Gast)


Lesenswert?


von Jens (Gast)


Lesenswert?

Ohne jetzt genau erklären zu können wqie das im Falle von
Altera funktioniert, simuliere das Ganze. Da kannst Du die
Takte auszählen bis irgendwelche Signale sichtbar werden.
Keine Ahnung was die Vorschläge mit Interrupts mit den
internen Verzögerungen einzelner Signale zu tun haben.

von Morin (Gast)


Lesenswert?

> Ohne jetzt genau erklären zu können wqie das im Falle von
> Altera funktioniert, simuliere das Ganze. Da kannst Du die
> Takte auszählen bis irgendwelche Signale sichtbar werden.

Das ist etwas heikel. Je nach Kontext (z.B. Cache-Inhalt) kann das 
jedesmal etwas anders aussehen. Mit einmal Simulieren wirst du da so 
nicht schlau.

von Oliver Bründler (Gast)


Lesenswert?

Auf der Altera-Seite findest du Tutorials zum entwickeln eigener 
komponenten für den Avalon-Bus. Der Avalon-Bus ist der Bus, welcher vom 
SOPC Builder unterstützt wird.

von high_speed (Gast)


Lesenswert?

Was für Daten soll der NIOS II auswerten?
Ist es ein kontinuierlicher Datenstrom bei dem alle xxx ns ein
neuer Wert ansteht.

Am einfachsten man baut zwischen der Hardware und dem Prozessor einen 
FIFO.
Im einfachsten Fall kann das ein einfaches Register sein.

Wenn Daten im FIFO anstehen wird der Interrupt gesetzt.
Der Prozessor holt sich die Daten daraus ab und setzt anschließend den
Status vom FIFO zurück.

Wenn natürlich andauernd in einem kurzen Zeitabstand neue Daten 
anstehen,
die der NIOS nicht mehr verarbeiten kann, läuft der FIFO irgendwann
über, dann braucht man einen anderen Prozessor oder man muss Werte 
verwerfen.

MfG
Holger

von Plau S. (radih)


Lesenswert?

Der NIOS II wertet Daten von einem Sensor aus.
Der NIOS II sendet ein Start Signal für den Sensor und soll das Resultat 
dann empfangen.

Entweder, frage ich nach bestimmter Zeit nach, wo ich mir schon sicher 
bin, dass die Daten vorliegen oder ich setze eine Variable auf 1, sobald 
Daten anstehen und dann tue ich im NIOS II C Code folgendes:

while (ack!=1) {
    ack =  IORD_ALTERA_AVALON_PIO_DATA(0x004810A0); // ack
}

Die Verbindung mache ich nicht über dem Avalon Bus, da ich ihn in meinem 
SOPC Builder als Komponente nicht gefunden habe.

Deswegen mache ich es mit dem ack Abfrage, was auch geht.


P.S.

@Oliver Bründler

Ich habe das Tutorial von dem du sprichst nicht gefunden...

von Roger S. (edge)


Lesenswert?

Plau Sein wrote:

>     ack =  IORD_ALTERA_AVALON_PIO_DATA(0x004810A0); // ack

Mit der system library wird ein header file system.h erstellt welches 
die Basisadressen, IRQs, etc. aller Komponenten enthaelt.
Wenn du dein PIO z.B. pio_ack benannt hast, dann kannst du 
IORD_ALTERA_AVALON_PIO_DATA(PIO_ACK_BASE) verwenden anstatt die Adresse 
abzutippen.

> Die Verbindung mache ich nicht über dem Avalon Bus, da ich ihn in meinem
> SOPC Builder als Komponente nicht gefunden habe.

Der Avalon Bus ist implizit vorhanden. Er verbindet z.B den Nios mit dem 
PIO.

Cheers, Roger

von Plau S. (radih)


Lesenswert?

Roger Steiner wrote:

> Der Avalon Bus ist implizit vorhanden. Er verbindet z.B den Nios mit dem
> PIO.

Ja gut, aber ich weiss nicht, wie ich in benutzen soll, wie soll ich 
meine Komponenten an dem Bus verbinden, wie schicke ich Signale in 
Richtung:
Komponente->NIOS II CPU
und wie frage ich im C Code ab, wie die Signale sind?

von Gast (Gast)


Lesenswert?

Du schickst von der Komponente normal gar keine Signale an den Nios. Du 
hast ein paar Adressleitungen und ein paar dadurch ausgewählte Register, 
und der Nios schreibt oder liest dann diese Register.
schreiben mit IORD(), lesen mit IOWR()

von Roger S. (edge)


Lesenswert?

Plau Sein wrote:
> Ja gut, aber ich weiss nicht, wie ich in benutzen soll, wie soll ich
> meine Komponenten an dem Bus verbinden,

Die Verbindungen kreiert der SOPC Builder automatisch.

> wie schicke ich Signale in
> Richtung:
> Komponente->NIOS II CPU
> und wie frage ich im C Code ab, wie die Signale sind?

Deine Komponente braucht dazu einen Avalon Slave port.
Welche Signale ein Avalon Slave bereitstellen kann/muss steht im PDF von 
Mathi.

Damit bist du in etwa gleich weit wie mit deiner PIO Loesung. Du kannst 
dann das ganze etwas aufpeppen in dem du deiner Komponente einen 
Interrupt verpasst, so dass der NIOS nicht mehr pollen muss.

Cheers, Roger

von Plau S. (radih)


Lesenswert?

So wie ich das verstanden hab, muss ich meine eigene Komponenten im SOPC 
Builder einbinden und dann erscheinen sie im System und werden durch den 
Avalon Bus angebunden. Mein Unverständnis aber ist, wie soll ich meine 
Eingänge und Ausgänge definieren, wenn ich sie als eigene Komponenten im 
SOPC einbinde. Jedes Mal steht etwas von Port export u.s.w.
Ich weiss nicht, wie ich sie dann definieren soll.

von Roger S. (edge)


Lesenswert?

Plau Sein wrote:
> Mein Unverständnis aber ist, wie soll ich meine
> Eingänge und Ausgänge definieren, wenn ich sie als eigene Komponenten im
> SOPC einbinde. Jedes Mal steht etwas von Port export u.s.w.
> Ich weiss nicht, wie ich sie dann definieren soll.

Die mit export bezeichneten Signale werden an der SOPC entity 
herausgefuehrt.
Sie tragen neben den urspruenglichen Signal Namen auch den der 
jeweiligen Komponente.

Cheers, Roger

von Oliver Bründler (Gast)


Lesenswert?

Ich habs zwar nicht genau Angeschaut, aber hier solltest du alles 
darüber finden wie man selbst komponenten entwickelt.

http://www.altera.com/literature/hb/qts/qts_qii54007.pdf

Gruss Oli

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.