Forum: FPGA, VHDL & Co. Frequenz in FPGA messen


von Jens Müller (Gast)


Lesenswert?

Folgende Frage. Ich habe ein FPGA Board das mit 100 MHz getaktet ist. 
Das Eingangssignal das anliegt, liegt in einem Bereich zwischen 7-18 
MHz. Die Frequenz des Eingangssignals soll detected werden. Mein 
Lösungsansatz wäre:
Counter für das Eingangssignal der bei jedem High hochgezählt wird.
Counter für die Taktrate des Boards auch bei jedem high hochzählen.

Anschließend wird der Counter des Eingangssignals ausgelesen wenn der 
Counter des Boardtaktes 100 Million (also nach einer Sekunde) erreicht 
hat. Die Anzahl des Eingangssignal Counters müsste doch dann die 
Frequenz des Eingangssignals beinhalten oder?

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


Lesenswert?

Jens Müller schrieb:
> Anschließend wird der Counter des Eingangssignals ausgelesen wenn der
> Counter des Boardtaktes 100 Million (also nach einer Sekunde) erreicht
> hat. Die Anzahl des Eingangssignal Counters müsste doch dann die
> Frequenz des Eingangssignals beinhalten oder?
Ja, dann hast du die Anzahl der Pulse pro Sekunde.

Allerdings solltest du dir Gedanken zur taktsynchronen Übergabe des 
Zählerstandes von der einen Taktdomäne (variabler Takt) in die 
Boards-Taktdomäne (100MHz) machen.

von Edi M. (Gast)


Lesenswert?

Lothar Miller schrieb:
> taktsynchronen Übergabe des
> Zählerstandes
Geht ja irgendwie nicht. Es ist ja taktaynchron. Gemeint ist sicher das 
übliche Einsynchronisieren.

Jens Müller schrieb:
> liegt in einem Bereich zwischen 7-18
> MHz.
wie genau soll der gemessen werden?

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


Lesenswert?

E. M. schrieb:
>> taktsynchronen Übergabe des Zählerstandes
> Geht ja irgendwie nicht.
Nein. Der Zähler kann durchaus asynchron laufen (und damit auch 
Frequenzen von z.B. 150MHz messen). Aber die Übergabe des Zählerstandes 
an das "restliche" FPGA muß synchronisiert werden.

> Gemeint ist sicher das übliche Einsynchronisieren.
Das wäre die 2. Möglichkeit, bei der das langsame Signal auf die 
FPGA-Domäne synchronisiert und dann die Flanken gezählt werden.

Wobei beim eingeschränkten Frequenzbereich von 7-18MHz vs. 100MHz die 2. 
Variante fairerweise wohl die überschaubarere ist... ;-)

> wie genau soll der gemessen werden?
Genauer als der 100MHz Takt geht das sowieso nicht. Wenn der 100ppm hat, 
dann ist auch das Messergebnis nur auf 100ppm genau.

von J. S. (engineer) Benutzerseite


Lesenswert?

Jens Müller schrieb:
> wenn der
> Counter des Boardtaktes 100 Million
Du musst keine 100 Mo Takte warten. Es reicht, solange zu zählen, bis Du 
genügend viele Countertakte zusammen hast, dass der Fehler klein genug 
wird. Der Fehler beträgt 1/7MHz x N. Einige Tausende Zählerfortschritte 
könnten also schon reichen.

Wenn Du mehr nimmst, wir es genauer, aber zu langsam. Willst Du es 
kontinuierlich haben und eine schnell ändernde Frequenz noch sehen, 
musst Du mehrere Zählperioden parallel auswerten.

von Edi M. (Gast)


Lesenswert?

Lothar Miller schrieb:
> Nein. Der Zähler kann durchaus asynchron laufen
Bezogen auf seinen Takt ist er synchron - das ist ja der Trick hierbei.

> Aber die Übergabe des Zählerstandes
> an das "restliche" FPGA muß synchronisiert werden.
Eben. Das war meine Aussage. Du nanntest es zuvor:

"taktsynchronen Übergabe des Zählerstandes"
Es handelt sich um eine asynchrone Übergabe!

Bei der Verwendung der Begriffe synchron und asynchron sollte man sich 
immer auf den Zieltakt ziehen, mit dem das Ereignis erfasst wird, um 
Missverständnisse zu vermeiden, da man je nach Blickrichtung sowl von 
synch als auch von asynch sprechen kann.

Beim Zählen ist es hier der alte Counterwert und der Trigger, die zu 
einem neuen Zählerwert vereint werden und zwar mit einem linksseitigen 
Takt -> synchron!

Beim Übergeben ist es der aktuelle Counterwert, der mit einem fremden 
Takt erfasst wird -> *asynchron.*

Du meinst zwar das Richtige, drückst es aber ungeschickt aus.

von Günter (. (dl4mea)


Lesenswert?

Lothar Miller schrieb:
>>> taktsynchronen Übergabe des Zählerstandes
>> Geht ja irgendwie nicht.
> Nein. Der Zähler kann durchaus asynchron laufen (und damit auch
> Frequenzen von z.B. 150MHz messen). Aber die Übergabe des Zählerstandes
> an das "restliche" FPGA muß synchronisiert werden.

Tät mich mal interessieren wie ich den auf 150MHz laufenden Zähler hier 
ordentlich auf die 100MHz-Ebene rüberkriegen würde, da zerbrech ich mir 
schon seit längerem den Kopf drüber

Danke, Günter (dl4mea)

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


Lesenswert?

Günter (dl4mea) schrieb:
> Tät mich mal interessieren wie ich den auf 150MHz laufenden Zähler hier
> ordentlich auf die 100MHz-Ebene rüberkriegen würde
Den Zähler an sich bekommst du nicht drüber!
Du speicherst ihn nach der Messung in der 150MHz Domäne ab und brauchst 
diesen Wert jetzt mindestens 3 Takte der 100MHz Domäne stabil. Solange 
braucht dann dein Handshake-Signal bis es einsynchronisiert ist. Danach 
kannst du in der 100MHz Domäne die (während dieser Zeit stabil 
anliegenden) Daten einfach übernehmen.

Etwa so:
1
signal d_valid     : std_logic;
2
signal d_valid_sr  : std_logic_vector[2 downto 0];
3
signal counter_150 : unsigned[15 downto 0];
4
signal buffer_150  : unsigned[15 downto 0];
5
signal buffer_100  : unsigned[15 downto 0];
6
7
8
process (clk_150) begin
9
   if rising_edge(clk_150) then
10
       counter_150 <= counter_150+1;
11
       :
12
       :
13
       if ( Messung fertig ) then
14
          d_valid <= '1';
15
          buffer_150 <= counter_150;  -- Wert im buffer muß ab hier solange stabil sein, 
16
                                      -- bis er in die 100MHz Domäne übernommen wurde
17
       end if;
18
   end if;
19
end process; 
20
21
process (clk_100) begin
22
   if rising_edge(clk_100) then
23
       d_valid_sr <= d_valid_sr(1 downto 0) & d_valid;
24
       :
25
       :
26
       if (d_valid_sr(2 downto 1)="01") then  -- steigende Flanke
27
          buffer_100 <= buffer_150;    -- stabile Daten übernehmen
28
       end if;
29
   end if;
30
end process;

von Günter (. (dl4mea)


Lesenswert?

in anderen Foren gibt es einen Danke-Button, aber hier nicht, also damit 
auf diese Weise mit Blumen: DANKE

von Edi M. (Gast)


Lesenswert?

Warum keinen aynchronen Fifo?? Da bekomme ich jeden Wert rüber.

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


Lesenswert?

E. M. schrieb:
> Warum keinen aynchronen Fifo?? Da bekomme ich jeden Wert rüber.
Klar. Es ging erst mal um den einfachen Weg. Und ein Fifo ist 
eigentlich irgendwie falsch an dieser Stelle, denn es gibt ja eigentlich 
keine laufend anfallenden Daten...

Günter (dl4mea) schrieb:
> also damit auf diese Weise mit Blumen: DANKE
Keine Ursache.   ;-)

von MJF (Gast)


Lesenswert?

Hallo,

kleine Anmerkung zum Abtasten von Zählern. Sinnvoll ist die Verwendung 
eines Gray-Zählers, da dieser asynchron abgestastet werden kann. 
Abtasten
bedeutet, dass der Ausgangswert des Gray-Zählers über zwei Register 
einsynchronisiert wird (Abbau von metastabilen Zuständen). Bei der 
Verwendung eines Gray-Zählers treten bei diesem Abtasten keine Fehler 
auf.


Der Referenz-Zähler tastet den Gray-Zähler am Anfang und am Ende einer 
Torzeit ab, die durch Zählen des Referenztakts bestimmt wird. Über die
Differenz kann die Frequenz des gezählten Signals bestimmt werden.

Gruss

Markus

von Martin K. (mkmannheim) Benutzerseite


Lesenswert?

Das ist aber noch keine zeitliche Verbesserung gegenüber dem FiFo, oder? 
In der SW macht man es so, dass man die Werte in eine pipeline schiebt 
und bei mehr als 2 Werten in der queue einen verwirft. Das entspräche 
bei einem FPGA einem FIFO.

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


Lesenswert?

Martin K. schrieb:
> Das ist aber noch keine zeitliche Verbesserung gegenüber dem FiFo, oder?
Nein, nur eine ressourcenmäßige...

> bei mehr als 2 Werten in der queue einen verwirft. Das entspräche
> bei einem FPGA einem FIFO.
Das "Verwerfen" kommt bei einem Fifo eigentlich nicht vor (bzw. darf es 
nicht). Ein Fifo funktioniert eigentlich nur, wenn die übernehmende 
Domäne im Mittel gleich schnell oder schneller als die ausgebende Domäne 
ist. Ein "Verwerfen" kanne erst bei einer zu hohen Senderbandbreite 
auftreten.

von Jens Müller (Gast)


Lesenswert?

Vielen Dank für die Antworten ! Ich hätte noch ne kleine Frage: Ich will 
den Takt nur einmalig zu Beginn in einer Art Initialisierungsphase des 
Boards Messen. Da muss ich mir doch keine Gedanken um die 
Synchronisierung machen da es sich nicht um ein kontinuierliches Signal 
handelt oder ?

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


Lesenswert?

Jens Müller schrieb:
> Da muss ich mir doch keine Gedanken um die
> Synchronisierung machen da es sich nicht um ein kontinuierliches Signal
> handelt oder ?
Jedes externe unbekannte (und damit asynchrone) Signal muß vor der 
Bearbeitung eingetaktet werden. Sonst passiert evtl. sowas:
http://www.lothar-miller.de/s9y/categories/35-Einsynchronisieren

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.