Wie wandelt man eine Ganzzahl in VHDL als Zeit um?

Um einen Prüfstand zu vereinfachen, möchte ich verschiedene Verzögerungen einstellen, indem ich Zahlenwerte am Anfang der Datei verändere. Ich möchte so etwas tun:

input_frequency : integer := 1000000;
...
constant t_per : time := (1. / input_frequency * 1000000000.) ns;

... was nicht kompiliert.

Im Moment bin ich Hardcoding:

constant t_per : time := 1000 ns;

Ich konnte das obere Beispiel auch nicht mit dem Variablenschlüsselwort zum Laufen bringen .

Gibt es einen Weg, um die Hardcoding-Zeiten in VHDL zu umgehen?

Antworten (3)

mit der Zeiteinheit multiplizieren (oder anderweitig betreiben).

constant t_per : time := (1 / input_frequency * 1000000000) * 1ns;(oder Variationen davon)

Hier ist eine Referenz, die hilfreich sein könnte: aldec.com/en/support/resources/documentation/articles/1165
Eigentlich ist das 1vorher nsnicht nötig, aber guter Stil empfehlenswert. Um seinen Code zum Laufen zu bringen, würde nur der Multiplikationsoperator benötigt. Zwischen dem ganzzahligen Wert und der sekundären Einheit ( ) sollte ein Trennzeichen (Leerzeichen) stehen ns.
@CapnJJ Hat wie ein Zauber funktioniert. Danke. Ich habe nicht ganz verstanden, wie die fs/ns/ms/etc. Schlüsselwörter funktionierten.
@Paebbels ja. Ich gehe zwischen VHDL und Systemverilog hin und her, daher wird die Syntax manchmal für mich zerdrückt :( (Ich werde meine Antwort so belassen, damit Ihr Kommentar für die Nachwelt immer noch gilt.)
@CapnJJ Keine Beschwerden über Ihre Antwort. Ich wollte diese Tatsache nur hinzufügen :). Warum SV verwenden, wenn Sie VHDL haben? (aber diese Frage ist hier Thema ...)
@Paebbels Ich habe mich auf die Verifizierung konzentriert ~ 8 Jahre und verwende SV für die funktionale Verifizierung. aber, ja, off-topic

Sie können ganzzahlige Werte in Zeitwerte umwandeln. Jeder Zeitwert wird als Positionszahl auf der Zahlenskala dargestellt. Daher bietet VHDL die Attribute 'val(...)und 'pos(...). Jede ganzzahlige Einheit repräsentiert eine primäre Zeiteinheit. Diese primäre Einheit ist als Femtosekunde (fs) definiert. Aber viele Simulatoren wie ModelSim haben eine größere Primäreinheit wie Pikosekunde (ps) gewählt. Sie können diese minimale zeitliche Auflösungsgrenze mit der Befehlszeilenoption auf Femtosekunden festlegen -t 1fs.

Ganzzahlen in Zeit umwandeln:

constant myInt  : integer := 10000;
constant myTime : time    := time'val(myInt);

Das ist gleich 10 ps, weil es 10.000 fs sind. 'posSie können mit dem Attribut von einem physischen Typwert in einen universellen ganzzahligen Wert zurückkonvertieren .

Dasselbe kann durch Multiplizieren von Zeitwerten mit einer Ganzzahl erreicht werden, da das Paket std.standardOperatorüberladungen für *to ​​allow time * integerund integer * timeOperationen enthält.

constant myInt  : integer := 5;
constant myTime : time    := 10 ns * myInt;

Dies ergibt 50 ns. Natürlich gibt es mehr überladene Operatoren wie Division oder Modulo.


Wenn Sie mehr mit Typzeit spielen oder andere physikalische Typen wie Frequenz erleben möchten , werfen Sie einen Blick auf die PoC - Bibliothek und das Paket PoC.physical .

Für Leute, die von Google hierher kommen, ist diese Antwort nützlich, um Frequenz in Zeit in Prüfständen umzuwandeln:

CONSTANT freq : positive := 50E6;
CONSTANT CLKPERIOD : time := (real(1E9)/real(freq)) * 1 ns;

Die Typumwandlung von real() ermöglicht genauere Werte.