Hallo, ich möchte für die Überprüfung eines komplexen Clockingnetzwerkes eine komfortable Möglichkeit haben um die Frequenz mehrerer Signale leicht in der Simulation abzulesen. Gibt es eine Möglichkeit dies direkt(!) im ISim abzulesen? Eine andere Möglichkeit wäre, eine Auswertung in der Testbench zu schreiben mit dem Ziel, dass in der Simulation ein Signal den Frequenzwert des zugehörigen Signal repräsentiert. Ich dachte da an das Attribut 'last_event. Jedoch komme ich hier einfach nicht auf den grünen Zweig. Hat jemand eventuell eine gute Idee hierfür? Ich bedanke mich!
frequenz schrieb: > Gibt es eine Möglichkeit dies direkt(!) im ISim abzulesen? Im Modelsim kann man sich die Zeitdifferenz zweier Cursor auch als Frequenz anzeigen lassen. Schau mal, ob das in ISim auch geht. frequenz schrieb: > Ich dachte da an das > Attribut 'last_event. Jedoch komme ich hier einfach nicht auf den grünen > Zweig. Eine gute Idee. Zeig mal, was Du schon gemacht hast. Duke
frequenz schrieb: > Ich dachte da an das Attribut 'last_event. Das ist bestenfalls die halbe Wahrheit oder die doppelte Frequenz. Schlimmstenfalls kommt gar nichts Sinnvolles dabei raus (asymmetrischer Takt). Ich würde einfach den Zeitpunkt der steigenden Flanke merken und bei der nächsten steigenden Flanke die Frequenz ausrechnen. > Überprüfung eines komplexen Clockingnetzwerkes Das kommt mir verdächtig vor...
frequenz schrieb: > Eine andere Möglichkeit wäre, eine Auswertung in der Testbench zu > schreiben mit dem Ziel, dass in der Simulation ein Signal den > Frequenzwert des zugehörigen Signal repräsentiert. Ich dachte da an das > Attribut 'last_event. Jedoch komme ich hier einfach nicht auf den grünen > Zweig. Eine assert anweisung die beim Überschreiten der max. Taktfrequenz meckert, sieht so aus: assert (not clk'event) or clk'delayed'last_event >= Pulswidth report "clk too fast"; Statt mitlaufendem Signal würde ich wegen dem type time aus 'last-event eine variable bevorzugen. Leider unterstützt isim wohl keine variable im wave_form window (zumindest 12.4). Oder falls signale keinen type time annehmen können, dann nach integer konvertieren.
Unterstützt ISIM überhaupt irgendwas Wichtiges - abgesehen, von Standard? Ich finde das Tool, nach allem, was ich bisher gesehen habe, einfach nur enttäuschend. In ModelSIM habe ich mir immer die Zeit zwischen den Taktflanken gemerkt, in einem Fall, wo es jitter gab, die Periode zwischen 128 Flanken, die einen bestimmten Wert nicht überschreiten durfte.
wie wäre es mit einem process:
1 | process(clk) |
2 | variable old : time; |
3 | variable diff : time; |
4 | variable freq : real; |
5 | begin
|
6 | if rising_edge(clk) then |
7 | diff := now - old; |
8 | old := now; |
9 | freq := 1/(diff/1 ns); |
10 | end if; |
11 | end process; |
user schrieb: > freq := 1/(diff/1 ns); Naja, da fehlt ein Punkt bei der 1:
1 | ERROR:HDLParsers:800 - "C:/Projekte/.../test.vhd" Type of freq is incompatible with type of /. |
Und dann ist die Auflösung wegen der 1ns recht grob... Ich würde also eher sowas vorschlagen:
1 | signal freq : real := 0.0; |
2 | :
|
3 | :
|
4 | process
|
5 | variable old : time := 0 ns; |
6 | begin
|
7 | wait until rising_edge(clk); |
8 | freq <= 1000000.0/((now-old)/1ps); --> f in MHz |
9 | old := now; |
10 | end process; |
Mike schrieb: > müsste das nicht einen Befehl weiter vor, wegen der Zeit? Da vergeht keine Zeit: es ist die selbe steigende Flanke, die diese Berechnung auslöst. Und eine Flanke dauert genau 0ps... Und eine Zeile weiter vorn wäre diese Zuweisung (1.) sinnlos und würde (2.) eine Division durch Null ergeben, weil dann now=old wäre: freq <= 1000000.0/(( now-old )/1ps);
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.