www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Periodendauer bzw Frequenz von einem Takt bestimmen


Autor: BK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ 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

Autor: BK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ 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

Autor: BK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ 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

Autor: BK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  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

Autor: BK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die zu messenden Frequenzen bewegen sich zwischen 10Hz und 200Hz. Nur 
das Referenzsignal hat 50MHz. Kann ich dann mit meiner Idee zum Erfolg 
kommen?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ 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

Autor: FPGA-Guru (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: BK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ 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

Autor: BK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  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

Autor: BK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ BK (Gast)

>Wie synchronisiere ich die Flanken des Messsignals? Blöde frage, hab ich
>aber noch nie gemacht. Wie funktioniert das?

Etwa so.
--

signal sig_sync: std_logic;
signal sig_int: std_logic;
signal sig_delay: std_logic;
signal sig_edge: std_logic;

-- Signal synchroisieren

process(clk50M)
begin
  if risig_edge(clk50M) then
    sig_sync <= messignal;
    sig_int <= sig_sync;    --nur das Signal darf intern verwednet werden
  end if;
end process;

-- steigende Flanke erkennen

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;

MfG
Falk

Autor: BK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  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

Autor: BK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.