Forum: FPGA, VHDL & Co. Zeitbasis für FPGA/PPC?


von A. M. (am85)


Lesenswert?

Hi

Ich habe mir einen einfachen Zähler in VHDL geschrieben und den in mein 
EDK Design eingebunden (Xilinx). Nun möchte ich einfach mittels C 
Programm und den Funktionen aus dem Header "time.h", die laut 
Dokumentation implementiert sein sollen, den Wert des Zählers auslesen, 
diesen mit einem Zeitstempel versehen und an einen anderen Rechner 
schicken. Das klappte soweit auch alles ganz schön, nur leider stimmt 
die Zeit nicht. Ich bekomme also immer schön den 1.1.1970 00:00:xx 
angezeigt. Wobei die Sekunden dem ersten Anschein nach auch nur bis 40 
hochgezählt werden und danach kommt es irgendwie zu einem Reset. 
Möglich, dass der "Reset" beim aufruf der time() Funktion an den Reset 
meines Zählers geknüpft ist...warum, weiß ich aber nicht. Hier mal ein 
bisschen Code:
1
    while(1)
2
    {
3
      CounterValue = MY_COUNTER_mReadSlaveReg2(MY_COUNTER,0);
4
      //printf("%u\r\n",CounterValue);
5
      if(CounterValue >= CompareValueMin && CounterValue <= CompareValueMax)
6
      {
7
        //Uhrzeit und Zählerstand an den Host Schicken
8
        now = time(0);
9
        strftime(TimeAndCounter, 22, "%d.%m.%Y - %H:%M:%S : ", localtime(&now));
10
        sprintf(TimerValueStr, " %u\n", CounterValue);
11
        strcat(TimeAndCounter, TimerValueStr);
12
        if(Output_Socket_Thread(TimeAndCounter) < 0)
13
        {
14
          printf("Error: Output_Socket_Thread()\r\n");
15
        }
16
        printf("%s\r\n",TimeAndCounter);      
17
      }
18
      if(CounterValue >= 3345)
19
      {
20
        ResetCounter();
21
        StartCounter();
22
      }
23
    }

Von diesem Reset mal abgesehen, ist halt die Frage, wie ich wirklich zur 
realen Uhrzeit komme. Nun hat der FPGA offensichtlich keine eigene 
Zeitbasis und ich vermute, der PPC Kern dadurch auch nicht. Gibt es aber 
eine Möglichkeit trotzdem die aktuelle Zeit zu bekommen? Im weiteren 
Projektverlauf wäre sowas schon recht wichtig und deswegen wäre es gut, 
wenn es eine Lösung gibt.

Vielen Dank schonmal für eure Antworten und bitte ruhig fragen Stellen, 
wenn noch was fehlt oder offen ist.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Gibt es aber eine Möglichkeit trotzdem die aktuelle Zeit zu bekommen?
Es gibt Echtzeituhrenbausteine. Die mußt du dann auslesen und den Wert 
in deinen internen Timer eintragen. Der sollte dann aber schon vorher 
funktionieren...

von A. M. (am85)


Lesenswert?

Danke für deine Antwort. Mh, so einen Echtzeitbaustein wird es aber 
nicht zufällig als kostenlosen Softcore geben, oder wüsstest du da was?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Üblicherweise wird beim Systemstart die Zeit aus einer Echtzeituhr 
geladen und in einen long umgerechnet. Dann läuft dieser Zähler ohne 
weiteren Zugriff auf die Echtzeituhr (RTC) hoch. Und mit deinen 
C-Funktionen greifst du nur auf diesen internen Zähler zu.
Du hast jetzt erst mal das Problem, nämlich dass deine Uhr (dieser 
interne Zähler) überhaupt nicht funktioniert. Dabei kann ich dir nicht 
helfen.

> Mh, so einen Echtzeitbaustein wird es aber
> nicht zufällig als kostenlosen Softcore geben, oder wüsstest du da was?
Das bringt nichts. Denn dann dürftest du dein System niemals 
ausschalten. RTCs sind darauf getrimmt, dass sie mit geringster 
Stromaufnahme weiterlaufen. Das kann dein FPGA garantiert nicht.

von A. M. (am85)


Lesenswert?

Lothar Miller schrieb:
> Üblicherweise wird beim Systemstart die Zeit aus einer Echtzeituhr
> geladen und in einen long umgerechnet. Dann läuft dieser Zähler ohne
> weiteren Zugriff auf die Echtzeituhr (RTC) hoch. Und mit deinen
> C-Funktionen greifst du nur auf diesen internen Zähler zu.
> Du hast jetzt erst mal das Problem, nämlich dass deine Uhr (dieser
> interne Zähler) überhaupt nicht funktioniert. Dabei kann ich dir nicht
> helfen.

Ich habe mich mit der Echtzeit bei Computern bisher nicht beschäftigt, 
aber ähnlich läuft es ja doch auf auf einem stinknormalen Heimcomputer 
ja auch, oder irre ich? Jetzt ist eben die Frage, ob es sowas auch auf 
meinem Board (Xilinx ML410) vorhanden ist. Ich habe in einem Thread im 
Xilinx Forum was davon gelesen, dass es da einen Registersatz des PPC 
geben soll, dessen Wert mit jedem Prozessorzyklus hochgezählt wird ( 
http://forums.xilinx.com/t5/EDK-and-Platform-Studio/Time-Stamp-PPC/m-p/17345#M4723 
). Zum einen wird das aber auch nur laufen, wenn Strom an ist und zum 
anderen habe ich dazu nichts weiter gefunden.

Lothar Miller schrieb:
> Das bringt nichts. Denn dann dürftest du dein System niemals
> ausschalten. RTCs sind darauf getrimmt, dass sie mit geringster
> Stromaufnahme weiterlaufen. Das kann dein FPGA garantiert nicht.

Daran habe ich mich sowieso die ganze Zeit gestoßen und bin deswegen 
davon ausgegangen, dass es keine nachrüstbare Lösung geben wird.

von A. M. (am85)


Lesenswert?

So, ich habe nochmal genau nachgeschaut und dabei entdeckt, dass auf dem 
ML410 ein "Real Time Clock Module" verbaut ist. Nun steht nur noch die 
Frage im Raum, wie ich dieses Modul auslesen kann.

von Christian R. (supachris)


Lesenswert?

Die RTC klemmt am SMBus, also I2C. Du musst also entweder direkt über 
das XPS I2C Modul gehen oder laut Plan auf Seite 71 oder so des User 
Guides geht es auch über einen PCI-SMBUS Baustein da drin...Variante 1 
ist sicher für so Standalone Designs, Variante 2 eher für Linux und so.

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.