Forum: FPGA, VHDL & Co. 64MHz Takt in Modelsim erzeugen?


von Günter (. (dl4mea)


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)

von user (Gast)


Lesenswert?

du musst die simulation auf ps umschalten

vsim -t ps

den clk erzeuge ich dann so

signal clk : std_logic := '0';

begin
  clk <= not clk after 7812 ps

von Pacitus (Gast)


Lesenswert?

Das timmt aber immer noch nicht genau.

von Günter (. (dl4mea)


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

von Christian R. (supachris)


Lesenswert?

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.

von Bertram (Gast)


Lesenswert?

Günter (dl4mea) schrieb:
> und schon ists bis auf das Tastverhältnis ziemlich genau
vollkommen irrelevant, da man nur aus rising baut

von O_o (Gast)


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

von Günter (. (dl4mea)


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

von Christian R. (supachris)


Lesenswert?

Wie gesagt solche langen sachen macht man lieber mit Ein- und Ausgabe 
über Files. Lass doch alles was du sehen willst, in ein File schrieben, 
meinetwegen noch mit Simulationszeit usw. dann kannst du ohne Wave 
Ausgabe simulieren lassen, das geht um einiges schneller.

von PittyJ (Gast)


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.

von Klaus F. (kfalser)


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.

von Günter (. (dl4mea)


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)

von SuperWilly (Gast)


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

von Paul B. (Gast)


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.

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


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

von J. S. (engineer) Benutzerseite


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.

von Paul B. (Gast)


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.

von P. K. (pek)


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

: Bearbeitet durch User
von Valko Z. (hydravliska)


Lesenswert?

Hi

probiere es so aus:

...
  CONSTANT c_clk_666_freq   : REAL := 66.6e+6;
  CONSTANT c_clk_666_period : TIME := 1e9 NS / c_clk_666_freq;
...

  SIGNAL clk666            : STD_LOGIC := '1';
...
  clk666   <= NOT clk666 AFTER c_clk_666_period/2;


Gruß

von Sym (Gast)


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.

von J. S. (engineer) Benutzerseite


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.

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.