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
Du solltest nochmal erklren, was Du willst. Ich lese da: Wann polle ich eine Signalreaktion, nachdem ich einen Trigger gesetzt habe. ?
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
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
> 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.
>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 ...
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.
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?)
Einfach mal auf der Altera Seite schauen: http://www.altera.com/literature/manual/mnl_avalon_spec.pdf?GSA_pos=3&WT.oss_r=1&WT.oss=avalon
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.
> 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.
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.
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
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...
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
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?
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()
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.