Hallo, vielleicht kann mir jemand von euch einen gezielten Tip in Sachen Taktteilung geben. Ich suche eine Möglichkeit mit einem Virtex4 FX20 einen Takt von 4.8 kHz zu erzeugen. Dieser wird für 2 mal 6-Channel ADCs benötigt. Mit DCMs wäre die Sache kein Problem, gibt allerdings einen Haken mit den Ausgangssignalen. Als Ausgangssignal hab ich ein 100MHz (onboard) und ein 1Hz (1PPS von GPS) Signal. Mit DCMs komme ich nicht bis 4.8 kHz, da nur ein Faktor von maximal 16 möglich ist. Als Entwicklerboard verwende ich das ML405. Als Lösung würde ich gerne eine Art Taktteilung auf Basis eines Zählers favorisieren. Leider gibts bei 100Mhz zu 4.8 kHz nur ungerade Teiler, d.h. ich würde irgendwann Timingfehler bekommen. Eine weitere Lösung wäre einen 76.8 kHz Oszillator mit aufs Board zu bringen. Dann klappts wieder mit ner DCM und dem Faktor 16. Wäre euch super Dankbar für ein paar Hinweise Viele Grüße
> d.h. ich würde irgendwann Timingfehler bekommen. Müssen die 4.8 kHz sooooooo genau sein? Mit 100MHz/20833 = 4800,07 Hz sollte das Design schon auch noch laufen. Oder bringen dich 70 milli Hertz um? Was wäre dan mit Frequenzschwankungen des Oszillators? 10 ppm sind schon scharfe Anforderungen. > 76.8 kHz Oszillator mit aufs Board zu bringen. > Dann klappts wieder mit ner DCM Lies mal das Datenblatt der DCM. IMHO sind die erst ab x MHz sinnvoll einsetzbar. Und wie gesagt: wenn der 76,8kHz-Oszillator 20 ppm Abweichung hätte, wärst du gleich weit wie mit dem Teiler. EDIT: Du weißt schon, dass man mit einem Zähler Frequenzen auch durch z.B. 23 teilen kann? Und wie man z.B. einen Teiler durch 20833 macht?
Super schnelle Antwort, danke. Ich geh noch mal bisschen mehr ins Detail Richtung Anwendung. Mit den 4.8 kHz werden Stom und Spannung in einem 60Hz Wechselspannungsnetz abgetastet. Das sind 80 Abtastungen pro Periode. Der Abtastzeitpunkt soll aber nicht mehr als 4us jittern. Wenn ich nun den Zähler bis 20833 laufen lasse und dabei die Drittel immer unter den Tisch fallen lasse, hätte ich pro Abtastung ein Abweichung von -3.3333..ns wenn ich mich nicht irre. Nach 80 Abtastungen wären das dann -266.666..ns, soweit OK. Das 1PPS Signal ist für die Synchronisierung zuständig, das kommt immer nach 80*60 Abtastungen. Bis dahin hätte ich dann 15.999..us Abweichung in der steigenden Flanke des ADC Clock Signals. Wahrscheinlich müsste ich versuchen aus dem 1PPS bzw 1Hz Signal irgendwas schnelleres erzeugen um dann schon eher zu synchronisieren. 60 Hz wäre optimal, da könnte pro Periode 1 mal synchronisiert werden. Wie könnte man aus 1Hz 60 Hz erzeugen? Hab den 20833er Zähler bereits umgesetzt und es stellt sich eine Frequenz von 4.799xx kHz ein.
1 | process (SysClk) |
2 | variable count : integer; |
3 | begin
|
4 | if (SysRst = '1') then |
5 | count := 0; |
6 | Clk_ADC <= '0'; |
7 | elsif rising_edge(SysClk) then |
8 | if (count = C_ADC_Clk_Divider_Counter) then |
9 | count := 0; |
10 | Clk_ADC <= not Clk_ADC; |
11 | else
|
12 | count := count + 1; |
13 | end if; |
14 | end if; |
15 | end process; |
> Hab den 20833er Zähler bereits umgesetzt...Frequenz von 4.799xx kHz... Der zählt vermutlich um 1 zu weit ;-) 100MHz / 20833 = 4800,0768 Hz 100MHz / 20834 = 4799,8464 Hz > Wie könnte man aus 1Hz 60 Hz erzeugen? Das wird dir auch nichts bringen, denn das 1 Hz ist ebenfalls asynchron zur Netzfrequenz... :-/ Wenn du es unbedingt sooo genau haben willst: Zähl einfach 2x auf 20833 und das 3. mal auf 20834. Dann hast du eine Frequenz von (4799,0768+4799,0768+4800,8464)/3 = 4800Hz So z.B.
1 | signal count : integer range 0 to 20384; |
2 | signal corr : integer range 0 to 2; |
3 | |
4 | process (SysClk) |
5 | begin
|
6 | if (SysRst = '1') then |
7 | corr <= 0; |
8 | count <= 0; |
9 | Clk_ADC <= '0'; |
10 | elsif rising_edge(SysClk) then |
11 | if ( (corr/=0 and count=20833-1) or (corr=0 and count=20834-1) ) then |
12 | count <= 0; |
13 | if (corr=2) then corr <= 0; |
14 | else corr <= corr+1; |
15 | end if; |
16 | Clk_ADC <= not Clk_ADC; |
17 | else
|
18 | count <= count + 1; |
19 | end if; |
20 | end if; |
21 | end process; |
BTW: du solltest integer immer mit range angeben, sonst werden 32Bit synthetisiert ;-)
Super Sache... werde ich gleich mal implementieren. Danke auch für den Tipp. :)
Die Stabilität des Taktes und die Grundgenauigkeit eines Quarzes lassen eine so exakte Teilung nicht zu. Das mag zwar examplarisch zu einem bestimmten Zeitpunkt und bei einer bestimmten Temperatur zutreffen. Reproduzierbarkeit, Langzeitstabilität und thermische Stabilität wird man dadurch nicht erreichen. Ich hoffe ich gehe recht in der Annahme, dass das "1pps" aus der Netzfrequenz hergeleitet wird. Dass ist es besser die Zeit von einem zum anderen "1pps" zu messen (100MHz-Takte zählen) und diesen dann rechnerisch für die näschten 80 Messungen einteilen. Das ist dann kurzeitstabil und gleicht sowohl die Netz-Frequenzschwankungen als auch die Quarzschwankungen aus. Im übrigen prinzipielle Überlegungen zu der Messaufgabe: Die Netzfrequenz ist aus sicht der Kraftwerke Lastabhängig. Daher schwankt diese über den Tag verteilt sehr. Nur im Langfristigen Mittel (über Tage oder sogar Wochen) werden die 50 Hz exakt eingehalten. Wir hatten einmal eine Digitaluhr direkt mit den 50 Hz aus dem Trafo getaktet aufgebaut. Die hatte über Monate keine Abweichung. Innerhalb eines Tages war die Abweichung zeitweise über eine halbe Minute. Daher 30s = 30 Mio us. Bei 12h in der diese Differenz zustande kahm sind 12h * 60min 60sec 50Hz = 2,16 Mio Perioden. Daraus ergibt sich eine mittlere Abweichung von fast 14us. "Im Verbundnetz der westeuropäischen Länder darf die Netzfrequenz nur um etwa 0,05 Hertz von der 50-Hertz-Norm abweichen", heißt es bei folgender Seite: http://members.magnet.at/alpha-channel/electro/Lastvert/inetz.htm Das sind immerhin 20us / Periode. Das das nicht so weit hergeholt ist, zeit die Uhr. Da muss ich die 4us maximalen Jitter mal grundlegend hinterfrage. Vielleicht sollte die Messaufgabe deshalb nicht auf die Frequenz sondern auf die Phasenlage bezogen betrachtet werden. Die Netz- und die Quarzfrequenzen sind von Sekunde zu Sekunde sehr stabil und ändern sich nur sehr wenig. Eine Messung des Synchronisationsintervalles läßt eine ausreichende Genauigkeitsbestimmung für die nächste Periode zu. Die Lösung des Problems in VHDL: Zeit Messen in dem man Takte zählt. Dann gibt es zwei Lösungsmöglichkeiten: 1. CPU 2. Tabellen (in RAM-Blöcken) Wahrscheilich ist die letztere die praktikablerere. Es müssen ja "nur" alle Frequenzen von 48,95 Hz bis 49,05 Hz abgedeckt werden. Die Quarzgenauigkeit spiel da schon keine nennenswerte Rolle mehr. Rechnerisch sollten es genau 250 Schritte sein um die 4us einzuhalten. Mit einer Tabelle von 512 Werten sollte man also hinreichen genau werden.
> Wahrscheilich ist die letztere die praktikablerere. Es müssen ja "nur" > alle Frequenzen von 48,95 Hz bis 49,05 Hz abgedeckt werden. Es ist ein 60Hz-Netz ;-) >> Mit den 4.8 kHz werden Stom und Spannung in einem 60Hz >> Wechselspannungsnetz abgetastet. Das sind 80 Abtastungen pro Periode. > Vielleicht sollte die Messaufgabe deshalb nicht auf die > Frequenz sondern auf die Phasenlage bezogen betrachtet werden. Unbeantwortet ist z.B. die Frage, warum die Abtastzeitpunkte so dermaßen genau an jeweils derselben Stelle sein müssen. Ich würde z.B. ganz pragmatisch die Zeit zwischen zwei Nulldurchgängen ermitteln, und dann die 80 Messungen (warum so ein unbinärer Wert? Von 360° kann der kaum kommen...) so aufteilen, dass die nächste Halbwelle phasengenau von Nulldurchgang bis Nulldurchgang mit 80 Messungen erfasst wird. > Zeit Messen in dem man Takte zählt. Und den ermittelten Wert durch 80 teilen, fertig.
Wunderschönen Guten Morgen, ich bedanke mich nochmal für die zahlreichen Antworten. Das 1PPS Signal stammt von einem GPS-Empfänger und ist auf 1us genau. Das Signal aus den 50 bzw. 60 Hz zu nehmen macht ja keinen wirklichen Sinn. Es soll ja Strom und Spannung (aller 3 Phasen) überwacht werden. Evtl muss zur Synchronisierung (80 Samples pro Periode) die 50 oder 60 Hz herangezogen werden.
Hier kommt die ganze Geschichte übrigens her: http://sharepoint.ucausersgroup.org/helpdesk/Lists/Help%20Desk%20Issues/Attachments/49/Implementation_prof_DigIF_spec_9-2LE_R2-0_040301-CB.pdf
> Das 1PPS Signal stammt von einem GPS-Empfänger und ist auf 1us genau. Das Hilft Dir dann leider nichts > Das Signal aus den 50 bzw. 60 Hz zu nehmen macht ja keinen wirklichen > Sinn. Es soll ja Strom und Spannung (aller 3 Phasen) überwacht werden. Das GPS hift vielleicht einen exakten Zeitstempel der Messung zuordnen zu können, aber um eine Synchronisation zu den 50Hz, bzw. 60Hz kommst Du nicht herum. Auch bei einem 3-Phasensystem kann man auf eine Phase synchronisieren. Die beiden anderen Phasen laufen ja nicht weg. Sonnst Misst Du alles, nur nicht eine Phase. > Evtl muss zur Synchronisierung (80 Samples pro Periode) die 50 oder 60 > Hz herangezogen werden. Nicht nur evtl..
> Mit DCMs komme ich nicht bis 4.8 kHz, da nur ein Faktor von
maximal 16 möglich ist.
100 MHz durch 25 gleich 4 MHz. Mit DCM mal 6 gleich 24 MHz. Dann durch
5000
teilen. Das Ergebnis müsste dann eigentlich 4,8 kHz lauten (und nicht
42,
wie ansonsten).
Ist ein interessanter Ansatz, leider klappts bei mir nicht. Der Ausgang CLKFX der PLL (DCM_Base) gibt keinen Mux von sich. CLKIN ist alles da...
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.