Forum: FPGA, VHDL & Co. Frequenz eines Signals einfach ermitteln


von frequenz (Gast)


Lesenswert?

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!

von Duke Scarring (Gast)


Lesenswert?

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

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


Lesenswert?

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

von Karl Könner (Gast)


Lesenswert?

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.

von Manfred (Gast)


Lesenswert?

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.

von user (Gast)


Lesenswert?

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;

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


Lesenswert?

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;

von Mike (Gast)


Lesenswert?

Lothar Miller schrieb:
> old := now;

müsste das nicht einen Befehl weiter vor, wegen der Zeit?

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


Lesenswert?

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
Noch kein Account? Hier anmelden.