Hallo zusammen,
ich hab ein kleines vielleicht auch simples Problem. Ich programmiere
seit kurzem VHDL.
Ich möchte ein Takt einlesen und daraus, mit Hilfe von VHDL, die
Periodendauer bzw. Frequenz bestimmen. Ich habe die Quartus Software von
Altera und dazu einen Cyclone II FPGA.
Hat von euch jemand eine Idee, wie ich von einem bestehenden Takt, der
sich bei Gelegenheit auch ändert, die Frequenz bzw. die Periodendauer
bestimmen kann?
Besten Dank für ihre Anregungen.
Gruß BK
@ BK (Gast)
>Ich möchte ein Takt einlesen und daraus, mit Hilfe von VHDL, die>Periodendauer bzw. Frequenz bestimmen. Ich habe die Quartus Software von
Das ist keine Fragen von VHDL, sondern generell. Du musst einen kleinen
FrequenzZÄHLER bauen. Na, klingelts?
MFG
Falk
Hallo Falk,
ich möchte am Ende der Programmierung den Frequenzwert des Takts. Diesen
Wert möchte ich dann in VHDL weiter verarbeiten. Geht das mit einem
Frequenzzähler?
Wenn ja, wie sieht dieser in VHDL aus? Kannst du mir da ein wenig
helfen?
Danke.
@ BK (Gast)
>Wert möchte ich dann in VHDL weiter verarbeiten. Geht das mit einem>Frequenzzähler?
Sicher.
>Wenn ja, wie sieht dieser in VHDL aus? Kannst du mir da ein wenig>helfen?
Helfen ja, aber vorkauen nicht.
Mach doch mal einen prinzipiellen Vorschlag, wie das Ganze aussehen
müsste. Über die Umsetzung in VHDL reden wir später.
MFG
Falk
Ich hab mir da mal ne eigene Lösung überlegt. Ich hab doch einen
Systemtakt. Diesen verwende ich als den Referenztakt. Sprich, von diesem
Takt weiß ich ja schon meine Periodendauer bzw. meine Frequenz. Den
Systemtakt erhalte ich von meinem FPGA. Diesen Referenztakt vergleiche
ich nun mit meinem Externen Takt, von dem ich meine Frequenz wissen
möchte. Bei jedem Positiven Event meines Referenztakts zählt ein Zähler
(Zähler 1) hoch. Ein zweiter Zähler (Zähler 2) zählt meine positiven
Flanken meines externen Takts.
1. positive Flanke von ext. Takt ---> Zähler 1 startet
2. positive Flanke von ext. Takt ---> Zähler 2 stoppt
Dann Werte ich aus wie weit mein 1. Zähler gezählt hat und rechne dies
dann auf die Frequenz um.
Bsp.: Referenztakt : 50MHz, Periodendauer = 20ns
Zähler1 zählt bis 1000000 wenn das externe Signal eine Frequenz von
50Hz hat.
Somit habe ich den Frequenzwert binär in meinem System, oder?
Das wäre eine Idee von mir!
Was meinst du dazu????
MfG BK
@ BK (Gast)
>Das wäre eine Idee von mir!>Was meinst du dazu????
Schon mal guter Ansatz, wenn gleich noch einige kleine Fehler drin sind.
Richtig ist, dass du zwei Zähler brauchst. Einen Referenzzähler, welcher
die sog. Torzeit (Messzeit) generiert. Dein zweiter Zähler ist der
eigentliche Frequenzzähler, welcher die unbekannte Frequenz misst.
Gestartet werden beide Zähler gleichzeitig, gestoppt wird dein zweiter
Zähler, wenn der Referenzzähler den Maximalstand erreicht hat.
Ein kleine Stolperfalle besteht dabei in der Asynchronität der beiden
Takte. Das muss durch RICHTIGES (tm) Synchronisieren berücksichtigt
werden.
Zwei Zähler in VHDL zu beschreiben ist ja kein Thema. Der Rest ist auch
nicht so schwer, oder?
MFG
Falk
Hallo nochmal,
> Gestartet werden beide Zähler gleichzeitig, gestoppt wird dein zweiter> Zähler, wenn der Referenzzähler den Maximalstand erreicht hat.
Wieso benötige ich einen Maximalstand? Genügt es nicht, wenn ich den
Referenzzähler solange laufen lass, bis eine Periode vom zweiten Zähler,
mit der zu messenden Frequenz, abgelaufen ist - sprich nach zwei
positiven Clock'events? Dann weiß ich doch, wieviele Perioden von meinem
Referenzsignal in der Periode meines zu messenden Signals abgelaufen
sind.
Bsp.: Mein erster Zähler (Takt mit 50MHz) hat bis 1000000 gezählt bis
eine Periode der zu messenden Frequenz abgelaufen ist (Zähler2: Abfrage
auf die zweite pos. Flanke entspricht doch einer Periode). Daraus lässt
sich dann über 20ns (50MHz) * 1000000 (Wert des 1.Zählers) = 20ms die
Frequenz von 50Hz des Eingangstakts errechnen.
Oder?
MfG BK
@ BK (Gast)
>Wieso benötige ich einen Maximalstand? Genügt es nicht, wenn ich den>Referenzzähler solange laufen lass, bis eine Periode vom zweiten Zähler,>mit der zu messenden Frequenz, abgelaufen ist - sprich nach zwei
Im Prinzip schon. Das wäre eine Periodendauermessung. Die ist nur
sinnvoll, wenn die zu messende Frequenz sehr vie niedriger als die
Referenzfrequenz ist, in deinem Beispiel 50 Hz zu 50 MHz.
MFG
Falk
@ BK (Gast)
>Die zu messenden Frequenzen bewegen sich zwischen 10Hz und 200Hz. Nur>das Referenzsignal hat 50MHz. Kann ich dann mit meiner Idee zum Erfolg>kommen?
Ja. Dann brauchst du sogar nur einen Zähler.
MFG
Falk
200Hz mit einem FPGA zu messen, müsste gerade so hinhauen, würde ich mal
sagen. Ein Tipp: Mit festen Periodendauern arbeiten und damit einfach
Reziprokwerte für die Bestimung der Frequenz erhalten.
Hallo Falk,
du machst mich neugierig. Wie funktioniert das dann mit einem Zähler?
Ich brauch doch eigentlich zwei (für Referenz und ext. Takt), oder?
Aber wie funktioniert das mit einem Zähler? Könntest du mir das kurz
beschreiben?
Besten Dank.
@ BK (Gast)
>du machst mich neugierig. Wie funktioniert das dann mit einem Zähler?>Ich brauch doch eigentlich zwei (für Referenz und ext. Takt), oder?
Das hast du doch eben selber beschrieben?! Lies mal deine Postings.
MFG
Falk
> Lies mal deine Postings.
Ja, ich kenne meine Postings.
Da hab ich aber von zwei Zählern gesprochen und nicht von einem.
Ein Zähler für das Referenzsignal. Ein weiterer zweiter Zähler für den
externen Takt (der zu messenden Frequenz).
Aber wieso nur ein Zähler?
@ BK (Gast)
>Ja, ich kenne meine Postings.
Wirklich? Und was ist damit?
"Wieso benötige ich einen Maximalstand? Genügt es nicht, wenn ich den
Referenzzähler solange laufen lass, bis eine Periode vom zweiten Zähler,
mit der zu messenden Frequenz, abgelaufen ist - sprich nach zwei
positiven Clock'events? Dann weiß ich doch, wieviele Perioden von
meinem"
Du musst nur die Flanken des Messignals synchronisieren und als
START/STOP für deinen Zähler verwenden.
MFG
Falk
@ Falk
Ok. entschuldige du hast recht.
> Du musst nur die Flanken des Messignals synchronisieren und als> START/STOP für deinen Zähler verwenden.
Wie synchronisiere ich die Flanken des Messsignals? Blöde frage, hab ich
aber noch nie gemacht. Wie funktioniert das?
MfG
BK
> process(clk50M)> begin> if risig_edge(clk50M) then> sig_delay <= sig_int;> if sig_int='1' and sig_delay='0' then> sig_edge <='1';> else> sig_edge <='0';> end if;> end if;> end process;
Das sig_delay hat doch dann immer den gleichen wert wie sig_int?!
Somit bekomm ich doch gar nie sig_edge <= '1'. Oder täusche ich mich da?
@ BK (Gast)
>Das sig_delay hat doch dann immer den gleichen wert wie sig_int?!
Nöö.
>Somit bekomm ich doch gar nie sig_edge <= '1'. Oder täusche ich mich da?
Ja. Wir sind hier bei VHDL, nicht bei einer normalen Programmiersprache.
sig_delay und sig_int sid zwei verschiedene Signale. sig_delay ist um
einen Takt gegenüber sig_int verzögert.
MFG
Falk
Ok. Werd ich jetzt gleich mal ausprobieren. Wenns nicht so ganz klappt,
dann meld ich mich Mitte der Woche nochmals hier.
Vielen Dank fürs erste und viele Grüße.
MfG BK