64MHz Takt in Modelsim erzeugen?

OP #2655074
Lesenswert?

Hallo,

zwei Fragen:
a) wie erzeuge ich in Modelsim einen 64MHz-Takt?
b) wie schreibe ich das effizient wenn ich über lange Zeiträume 
simulieren will?

Zu a)

ich möchte in Modelsim einen 64MHz-Takt erzeugen, also 7,8125ns low, 
7,8125 high. Leider aber macht mir das Modelsim die Nachkommastellen 
nicht, wenn ich es einfach so schreiben würde:
1
   -- the 64MHz clock  
2
   clock64 : process begin
3
      clk64 <= '0';
4
      wait for 7.8125 ns;
5
      clk64 <= '1';
6
      wait for 7.8125 ns;
7
   end process clock64;
Das ganze brauche ich weil ich extern gesamplete Daten als Input habe, 
die ein ganz genaues Timing haben, und das ständige Rumskalieren beim 
Ausmessen von Zeiten ist äußerst nervig. Das ganze verzehntausendfachen 
geht auch wieder nicht, weil dann der Simulator ewig läuft.
Also habe ich die Zeiten gerundet und mach meist 8ns und manchmal 7ns 
Delays. Die Frage hier: Geht das einfacher?
1
   -- the 64MHz clock  
2
   clock64 : process begin
3
      clk64 <= '0';
4
      wait for 8 ns;
5
      clk64 <= '1';
6
      wait for 8 ns;
7
      clk64 <= '0';
8
      wait for 7 ns; -- 7
9
      clk64 <= '1';
10
      wait for 8 ns;
11
      clk64 <= '0';
12
      wait for 8 ns;
13
      clk64 <= '1';
14
      wait for 8 ns;
15
      clk64 <= '0';
16
      wait for 8 ns;
17
      clk64 <= '1';
18
      wait for 8 ns;
19
      clk64 <= '0';
20
      wait for 7 ns; -- 7
21
      clk64 <= '1';
22
      wait for 8 ns;
23
      clk64 <= '0';
24
      wait for 8 ns;
25
      clk64 <= '1';
26
      wait for 8 ns;
27
      clk64 <= '0';
28
      wait for 8 ns;
29
      clk64 <= '1';
30
      wait for 7 ns; -- 7
31
      clk64 <= '0';
32
      wait for 8 ns;
33
      clk64 <= '1';
34
      wait for 8 ns;
35
   end process clock64;

zu b)

Mit diesem Takt sample ich das GPS 1pps-Signal ab, und wenn ich den 
Modelsim hier über 1sec (noch besser wären 16sec) simulieren lasse, dann 
läuft das ewig. Wie kann man das am effizientesten beschleunigen?

Danke für eure Hilfe!

Günter (dl4mea)
OP #2655710
Lesenswert?

Hi,

naja, dann machen wir halt einfach
1
   clock64 : process begin
2
      clk64 <= '0';
3
      wait for 7812ps;
4
      clk64 <= '1';
5
      wait for 7813ps;
6
   end process clock64;
und schon ists bis auf das Tastverhältnis ziemlich genau

Womit ich sagen wollte: Danke, das geht!

Jetzt nur noch die ergänzende Frage: Wie kann ich es am effizientesten 
machen wenn ich mit diesen Einstellungen 1sec oder länger simulieren 
möchte?

Ciao, Günter
Gast #2656477
Lesenswert?

Christian R. schrieb:
> Günter (dl4mea) schrieb:
>> Jetzt nur noch die ergänzende Frage: Wie kann ich es am effizientesten
>> machen wenn ich mit diesen Einstellungen 1sec oder länger simulieren
>> möchte?
>
> Hm, für solche langen zeiten ist Modelsim nicht wirklich optimal. Das
> simuliert man am besten mit File I/O und dann ohne Wave-Ausgabe.

oder waveform größe begrenzen, dann kannst du modelsim auch 24h 
simulieren lassen :D
OP #2656524
Lesenswert?

Hallo,

ganz verstehe ich das mit der Waveform-Größe nicht. Denn das würde doch 
heißen, ich kann mir die Ergebnisse bei 1sec, 2sec usw. nicht anschauen 
kann?

Also genauer gesagt: Ich taste mit den 64MHz ein 1pps von GPS ab und 
bräuchte eh nur das Geschehen rings um den 1pps rum (1pps plus etwa 500 
clocks). Da wird nämlich der nächste Korrekturfaktor ausgerechnet.

Ciao, Günter
Gast #2657380
Lesenswert?

>> Das ganze verzehntausendfachen
>> geht auch wieder nicht, weil dann der Simulator ewig läuft.

Das vestehe ich jetzt nicht.
Der Simulator sollte, wenn man den Process von der Clock abhängig macht, 
doch eh nur auf die Flankenwechsel bei der Clock achten. Und ob die 
Zeitbasis das ms us oder ps ist, das ist für die Rechenzeit völlig egal.
Die Zeiten zwischen den Flankenwechseln werden ignoriert, weil da ja eh 
nichts passieren kann.
Jedenfalls habe ich es so verstanden.
#2657435
Lesenswert?

PittyJ schrieb:
> Jedenfalls habe ich es so verstanden.

Stimmt so auch.
Das eigentliche Problem mit der zeitlichen Auflösung ist die maximale 
Simulationszeit, weil die Simulatoren die interne Zeit entweder als 
unsigned 32 Bit oder 64 Bit Zahl darstellen.
Bei 32 Bit und ps Auflösung ist dann bei ca. 4 ms Schluss.

Eine Auflösung in ps oder ns macht die Simulation nicht schnelle oder 
langsamer.
OP #2659558
Lesenswert?

>>> Das ganze verzehntausendfachen
>>> geht auch wieder nicht, weil dann der Simulator ewig läuft.

Ich benötige für die Bearbeitung meiner Inputdaten (Capture-File des 
ADC) immer dieselbe Anzahl Taktflanken und nicht einfach nur einen Lauf 
über insgesamt 1sec. Wenn ich also Faktor Zehntausend mache, nur damit 
ich mit Nanosekunden-Auflösung zeitlich 1:10000 skalierte Timing-Events 
brauche, dann brauch ich dennoch dieselbe Anzahl Events bis mein 
komplettes Capturefile abgearbeitet ist.

Das "-t ps" hat schon was gebracht.

Günter (dl4mea)
Gast #2659647
Lesenswert?

>ich kann mir die Ergebnisse bei 1sec, 2sec usw. nicht anschauen

Siehst du dann überhaupt noch irgendetwas? Du solltest dir überlegen, 
wie man die Ergebnisse ohne Wave-Betrachtung überprüfen/bewerten kann.

VG, SuperWilly
Gast #4018601
Lesenswert?

Wie würde man die Simulation ansetzen, um z.B. einen Takt von exakt 
66.000 MHz, bzw auch 66,6600 MHz (1%-Grenze für Jitter) anzulegen?

Wie bekomme ich das langzeitgenau?

Soweit bekannt rechnet Modelsim mit fs, damit ist man in der Auflösung 
limitiert.
Moderator (Firma: Titel) Persönliche Seite #4018919
Lesenswert?

Frank P. schrieb:
> Wie würde man die Simulation ansetzen, um z.B. einen Takt von exakt
> 66.000 MHz, bzw auch 66,6600 MHz (1%-Grenze für Jitter) anzulegen?
Das wäre eigentlich eh' unsinnig, weil es in der Realität keinen so 
genauen Takt gibt...

> Soweit bekannt rechnet Modelsim mit fs, damit ist man in der Auflösung
> limitiert.
Dann skaliere doch einfach alles um drei Zehnerpotenzen nach oben: 
Verwende einen 66,6600 kHz Takt...
Persönliche Seite #4020037
Lesenswert?

> Wie bekomme ich das langzeitgenau?
Das timing muss als solches natürlich stimmen. Ich mache das bei krummen 
Takten so, dass ich eine genügend grosse Anzahl modelliere und 
zwischendurch runde, dann aber bei dem letzten irgendwo ein paar fs 
einspare, sodass es langfrisitig stimmt.

So kriegt man eigentlich jeden krummen Takt in die Simulation.
Gast #4021598
Lesenswert?

Lothar Miller schrieb:
> Dann skaliere doch einfach alles um drei Zehnerpotenzen nach oben:
> Verwende einen 66,6600 kHz Takt...
Das ist nicht so wirklich eine Lösung, weil diverse Timings in den Cores 
reale Zeiten brauchen ...

Jürgen Schuhmacher schrieb:
> irgendwo ein paar fs einspare, sodass es langfristig stimmt.
Ist aber eine zimeliche Fummelei und wird auch nicht wirklich genau.
#4029435
Lesenswert?

Frank P. schrieb:
>> irgendwo ein paar fs einspare, sodass es langfristig stimmt.
> Ist aber eine zimeliche Fummelei und wird auch nicht wirklich genau.

Weiss nicht, was Du mit der Timing-Simulation genau beweisen willst: Den 
realen Jitter (oder auch Wander, falls Du spread spectrum verwendest) 
kannst Du eh nicht abbilden, bzw. die Chance, dass Du die "böse" 
Kombination auch wirklich simulierst ist eher klein.

Würde daher eine Simulation mit "ungefähr"-Timing (damit grobe 
Relationen sichtbar sind) für die Funktion nehmen, und das Timing mit 
der STA abhandeln.

(Falls Du Chip-Design machst und nicht FPGA, kann es natürlich sinnvoll 
sein, eine Timing-Simulation mit dem backannotierten Layout 
durchzuführen. Deren "pass" wäre aber auch wieder nur notwendig und 
nicht hinreichend.)
Gast #4039656
Lesenswert?

Wenn es wirklich genau sein soll:
Halbperiode mit dem eingebauten Datentyp 'real' berechnen.

Schleife:
1) Mit now Zeit1 abfragen.
2) Warten bis Halbperiode abgelaufen ist
3) Mit now aktuelle Zeit2 abfragen. Zeit2-Zeit1 ergibt aktuelle 
Halbperiode. Mit soll-Periode vergleichen und die nächste Halbperiode 
geeignet verlängern. Zurück zu (1)

Vorteil: Keine Akkumulation vom Fehlern (ausgenommen der Berechnung der 
Halbperiode). PLLs sind so auch modelierbar. Funktioniert mit ps 
Zeitauflösung genauso wie mit ns.
Nachteil: Halbperiode ist +- 1 Simulatorzeiteinheit unterschiedlich.

Wem das noch wegen der Verwendung von Real zu ungenau ist, der kann 
zusätzlich noch dann, wenn die Periode ein vielfaches der 
Simulatorauflösung hat, den Fehler der floats korregieren. Habe ich noch 
die benötigt.

Bei Bedarf, kann ich gerne den Source-Code heraussuchen.
Persönliche Seite #4062852
Lesenswert?

Frank P. schrieb:
> Lothar Miller schrieb:
>> Dann skaliere doch einfach alles um drei Zehnerpotenzen nach oben:
>> Verwende einen 66,6600 kHz Takt...
> Das ist nicht so wirklich eine Lösung, weil diverse Timings in den Cores
> reale Zeiten brauchen ...
>
> Jürgen Schuhmacher schrieb:
>> irgendwo ein paar fs einspare, sodass es langfristig stimmt.
> Ist aber eine zimeliche Fummelei und wird auch nicht wirklich genau.

Nun, es wird auf die fs genau, wenn man damit simuliert und die 
Berechnung geht automatisch von Statten, da ich das mit einem Excel 
erzeuge, das auch gleich den VHDL-Code mit auswirft.

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