Hi
ich habe mal eine Frage zu NIOS.
Unter QSYS wurde der NIOS CPU mit 50Mhz verbunden.
Jetzt habe ich mich an dieses Beispiel hier mal gehalten:
https://www.altera.com/en_US/pdfs/literature/tt/tt_my_first_nios_sw.pdf
(Seite 13)
Und verstehe halt leider nicht das delay.
Wenn ich es jetzt z.B. bei meinem Code anwende:
Wenn der Nios mit 50MHz läuft, müsste ich doch mit einem delay mit dem
Wert 50000000 dann auf 1s kommen, oder liege ich hier falsch?
Zumindest läuft es mit diesem wert sehr langsam.
Mir gehts später darum, das ich eine bestimmte Anzahl an Werten, z.B. 20
Werte in 1 Sekunde aufnehme und den Rest mit delay fülle, damit es immer
auf 1s kommt.
Vielen Dank
Diese Art von delay kann man machen, hat aber einige Nachteile. Der
erste, den du bereits gesehen hast, ist, dass die Zeit nicht stimmt.
Warum? Schau ins Assembler file... Von x runterzählen heißt halt nicht
nur x clock zyklen zu warten, sondern auch noch zu vergleichen, Werte in
register zu laden etc. Es entsteht overhead durch den Code an sich.
Deswegen stimmt deine Zeit nicht.
Faktor 3 - 5 kann durchaus sein, dazu müsstest du aber das assembler
file herzeigen.
Mein Tipp: Bau dir nen Systemtimer mit rein. Damit kannst du dann genau
1s warten.
Max K. schrieb:> Wenn der Nios mit 50MHz läuft, müsste ich doch mit einem delay mit dem> Wert 50000000 dann auf 1s kommen, oder liege ich hier falsch?
Nur wenn der Nios mit jedem Takt einen Befehl abarbeiten kann.
Üblicherweise braucht es aber (u.U. ja nach Befehl) mehrere Takte um
einen Befehl abzuarbeiten. Weitere Unterschiede können auftreten, wenn
die Zugriffszeit verschiedener Speicher (BRAM, DDR-RAM, Flash,
SPI-Flash) noch ins Spiel kommt.
> Mir gehts später darum, das ich eine bestimmte Anzahl an Werten, z.B. 20> Werte in 1 Sekunde aufnehme und den Rest mit delay fülle, damit es immer> auf 1s kommt.
Dann nutze einen Hardwaretimer, der Dich einmal pro Sekunde weckt...
Duke
Max K. schrieb:> Mir gehts später darum, das ich eine bestimmte Anzahl an Werten, z.B. 20> Werte in 1 Sekunde aufnehme
Dann solltest du mit einem Zeitraster von 50ms arbeiten, damit die Werte
äqidistant sind. Oder was machst du mit diesen 20 Werten?
> oder liege ich hier falsch?
Sieh dir das Assemnblerfile an und berechne wie viele die Operationen
dort drin brauchen. Dann kannst du überschlägig berechnen wie weit du
zählen musst. In der Praxis nimmst du deinen Wert 50000000 und stoppst
die Zeit, die dafür gebraucht werden. Und dann kommt ein Dreisatz, um
den Zählerwert für 1s zu berechnen.
Das Verfahren ist aber aktive Rechenzeitverschwendung und zudem sehr
ungenau und unzuverlässig. Denn wenn du irgendwas dazuprogrammierst,
dann braucht das auch Rechnezeit.
Lothar M. schrieb:> Das Verfahren ist aber aktive Rechenzeitverschwendung
passt aber zu der verschwenderischen Strategie, wertvolle FPGA-Fläche
mit langsamen Prozessoren zuzuknallen.
Weltbester FPGA-Pongo schrieb im Beitrag #5183773:
> Lothar M. schrieb:>> Das Verfahren ist aber aktive Rechenzeitverschwendung> passt aber zu der verschwenderischen Strategie, wertvolle FPGA-Fläche> mit langsamen Prozessoren zuzuknallen.
Naja, es geht dem TE wohl auch darum, den Einsatz von FPGA zu üben.
Allerdings sollte man dann auch konsequent sein und alle derartigen
Timings in Hardware erzeugen. Wofür hat man schließlich das FPGA?
Für Projekte, bei denen ich mit dem Timing bei der Ansteuerung von
Hardware herumspielen muss, verwende ich auch bevorzugs ein FPGA mit
Softcore. Dann muss ich mich nicht darauf verlassen, dass sich die
Timerblöcke eines normalen Microcontrollers wirklich zu ansteuern lassen
wie ggf. benötigt. Und bei rein hardwaremäßig erzeugtem Timing kann ich
auch sicher sein, dass es keinen Jitter durch die Firmware gibt.
Natürlich ist das nichts für kostensensitive Anwendungen in
Großstückzahlen, aber für Prototypen und Kleinserienprodukte durchaus
praktikabel.
Andreas S. schrieb:> Naja, es geht dem TE wohl auch darum, den Einsatz von FPGA zu üben.
Mit einem zusammengeklickten CPU-Core, der dann hinterher mit C-Code
zugetextet wird, lernt er m.E. aber rein gar nix über einen
zielgerichteten Einsatz von FPGAs.
Denn wenn man was neu lernt, dann sollte man nicht lernen, wie man für
einen Testaufbau schnell mal einen Prototypen zusammenflicken kann.
das delay() ist Mist.
Ein vernünftiger Compiler wird dir das beim Optimieren einfach
rausschmeissen. Mach das lieber jetzt gleich und selber, bevor Du dich
totsuchst, wenn Du irgendwann mal die Optimierung einschaltest.
Mal eine Frage, um mal einen groben Richtwert zu bekommen:
Wie viel Prozent eines MAX10 oder eines anderen FPGAS werden durch den
NIOS und das obige, einfache Beipspielprogramm verbraucht?
Wie viele LUTs? Wie viel Resourcen bleiben noch übrig, die man selber
nutzten könnte?
chris schrieb:> Wie viel Prozent eines MAX10 oder eines anderen FPGAS werden durch den> NIOS und das obige, einfache Beipspielprogramm verbraucht?
Logischerweise ist das abhängig vom verwendeten FPGA...
Je nachdem, was er können soll, belegt ein NIOS2 zwischen 700 und 3000
LEs.
Der dickste MAX10 hat davon 50000.
>Je nachdem, was er können soll, belegt ein NIOS2 zwischen> 700 und 3000 LEs.
Die Aussagen sind jetzt sehr variabel, deshalb habe ich nach dem
Resourcenberbrauch vom obigen Beispiel inclusive des Beispielprogramms
gefragt, denn für ein lauffähiges System bedarf es ja auch des Speichers
und der Busse.
Nein, Du hast eine sehr allgemein gehaltene Frage gestellt.
Möglicherweise meinstest Du etwas anderes. Wenn Du passende Antworten
auf Fragen erhalten möchtest, solltest Du keine impliziten Annahmen
treffen, sondern die Fragen vollständig formulieren.