NIOS Geschwindigkeit delay frage

OP #5170700
Lesenswert?

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:
1
int main()
2
{
3
    unsigned long delay = 0;
4

5
    int value[20];
6
    int i;
7

8
  while(1)
9
  {
10

11
    for(i = 0; i <= 19; i++)
12
    {
13
      value[i] = IORD_ALTERA_AVALON_PIO_DATA(PIO_DATA_BASE);
14

15
      printf(" - %d\n", value[i]);
16
      
17
      delay = 0;
18

19
      while(delay < 2000000)
20
      {
21
        delay++;
22
      }
23
    }
24

25
  }
26
  return 0;
27
}

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
Gast #5170703
Lesenswert?

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.
Gast #5170707
Lesenswert?

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
Moderator (Firma: Titel) Persönliche Seite #5170715
Lesenswert?

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.
(Firma: Schweigstill IT) Persönliche Seite #5184403
Lesenswert?

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.
Moderator (Firma: Titel) Persönliche Seite #5184414
Lesenswert?

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.
Gast #5185590
Lesenswert?

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?
Gast #5186197
Lesenswert?

>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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren