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?
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.
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?
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.
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.
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.
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)
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; |
in anderen Foren gibt es einen Danke-Button, aber hier nicht, also damit auf diese Weise mit Blumen: DANKE
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. ;-)
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
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.
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.
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 ?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.