Es geht mir nicht um die Quarzgenauigkeiten. Das stimmt, das kann man
nicht einhalten. Trotzdem sollte das Design nominell erst mal generisch
die "richtigen" Zeiten generieren.
Daher: Wenn ein Timer absolute Zeiten generieren soll, z.B. einen Puls
von 1000 ms, und mit 75 MHz getaktet wird, dann sollte er in der
Simulation auch genau 1000 ms lang (Sprich 75 Mio Takte) sein. Wenn nun
im Design durch einen Fehler der Puls aber 75.000.001 Takt lange oder
74.999.999 Takte lange ist, dann muss ich mein Design korrigieren.
Schließlich will ich ja mit der Testbench mein Design testen.
Bei einem Takt weniger komme ich ja nur noch auf 0,99999998... Sekunden.
Durch die Rundungsfehler in der Simulation bin ich auf ähnliche Werte
gekommen, obwohl es exakt 75 Mio Takte waren. Eine Bewertung des Designs
war also nicht möglich. Diesen Fehler wollte ich ausschließen. Deshalb
Zähle ich nun Takte und löse die Zeitermittlung nun so:
1 | in1_to_in2_time <= ((edge2_clks - edge1_clks) * 1 sec) / clk_speed_hz;
|
"in1_to_in2_time" ist vom Typ time, die anderen von Typ integer.
Zuvor hatte ich es so versucht:
1 | in1_to_in2_time <= edge2_time - edge1_time;
|
Da war alles vom Typ time.