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
Die zu messenden Frequenzen bewegen sich zwischen 10Hz und 200Hz. Nur das Referenzsignal hat 50MHz. Kann ich dann mit meiner Idee zum Erfolg kommen?
@ 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
@ BK (Gast) >Wie synchronisiere ich die Flanken des Messsignals? Blöde frage, hab ich >aber noch nie gemacht. Wie funktioniert das? Etwa so.
1 | --
|
2 | |
3 | signal sig_sync: std_logic; |
4 | signal sig_int: std_logic; |
5 | signal sig_delay: std_logic; |
6 | signal sig_edge: std_logic; |
7 | |
8 | -- Signal synchroisieren
|
9 | |
10 | process(clk50M) |
11 | begin
|
12 | if risig_edge(clk50M) then |
13 | sig_sync <= messignal; |
14 | sig_int <= sig_sync; --nur das Signal darf intern verwednet werden |
15 | end if; |
16 | end process; |
17 | |
18 | -- steigende Flanke erkennen
|
19 | |
20 | process(clk50M) |
21 | begin
|
22 | if risig_edge(clk50M) then |
23 | sig_delay <= sig_int; |
24 | if sig_int='1' and sig_delay='0' then |
25 | sig_edge <='1'; |
26 | else
|
27 | sig_edge <='0'; |
28 | end if; |
29 | end if; |
30 | end process; |
MfG Falk
> 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
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.