Forum: FPGA, VHDL & Co. Erzielbare DCM Genauigkeit


von Burkhard K. (buks)


Angehängte Dateien:

Lesenswert?

Guten Tag,

für eine Audio-Anwendung (Hobbyprojekt) auf einem Artix-7 (Nexys 4) 
benötige ich zwei Clock-Domänen:

    * 100  MHz (vom ADC / 1 MSamples/s) - SYS_CLK
    * 52,2 MHZ (zum Audio Codec / 200 kSamples/s) - AC_CLK

(Der AC hier ist ein CS4344, der beliebige Samplefrequenzen, also auch 
die "krummen" 200 kSamples/s erlaubt).

Die 52,2 MHz werden mittels DCM (MMCME2) aus der SYS_CLK generiert und 
dienen zur Ableitung weiterer für den AC benötigten Takte:
    MCLK (Master Clock) = 25,6 MHz
    SCLK (Bit Clock)    = MCLK / 4
    LRCLK (Channel Sel.)= SCLK / 32 bzw. MCLK / 128 = 200 kHz

Die Signale aus der ADC Clock-Domäne durchlaufen einen Dezimator-FIR 
(M=5) - dessen Ausgang exakt die vom Audio Codec benötigten 200 
kSamples/s liefert (die Synchronisation zwischen den Domänen erfolgt 
über einen asynchronen FiFo)

Dieses Schema funktioniert in der Theorie wunderbar - nur die 
(versteckte) Vorbedingung lässt sich so auf dem FPGA nicht 
implementieren: Die vom DCM generierte Frequenz müsste exakt mit dem 
berechneten Wert (52,2 MHz) übereinstimmen, damit die beiden genau 
aufeinander abgestimmten Takte nicht auseinanderlaufen. In meiner 
jetzigen Implementierung stolpert das Ausgabe-Signal ca. alle 260 us, 
das Spektrum zeigt folgerichtig Nebenmaxima im Abstand von ca. 3,9 kHz.

Um max. einen Glitch pro Sekunde zuzulassen, müsste die AC_CLK bis auf 5 
ppm genau den geforderten 52,2 MHz entsprechen (unter der Voraussetzung, 
dass die Abweichung der SYS_CLK noch darunter liegt).

Lässt sich solche Genauigkeit erreichen? Im IP-Generator kann ich die 
Ausgabefrequenz max. auf 1 KHz genau spezifieren. Leider habe keine 
Möglichkeit die Ganggenauigkeit der DCM generierten Clock im ppm Bereich 
zu messen. Der IP Generator gibt einen "Phase Error" von ca 260 ps an - 
das entspräche ca 0,5 % - wäre also bereits um einen Faktor 100 größer 
als die oben hypothetisch geforderten 5 ppm.

Gibt es - ausser den ADC in die Clock-Domäne des Audio Codecs zu 
verlagern - noch eine anderen Lösung für obiges Dilemma?

Danke,
Burkhard

von Falk B. (falk)


Lesenswert?

@ Burkhard K. (Firma: Own my own) (buks)

>    * 100  MHz (vom ADC / 1 MSamples/s) - SYS_CLK
>    * 52,2 MHZ (zum Audio Codec / 200 kSamples/s) - AC_CLK

>Die 52,2 MHz werden mittels DCM (MMCME2) aus der SYS_CLK generiert

Wirklich? Das wäre ein recht krummer Teilerfaktor. Kann das dein DCM 
WIRKLICH? Oder liegt die Frequenz nicht eher daneben?

>    MCLK (Master Clock) = 25,6 MHz

>Die Signale aus der ADC Clock-Domäne durchlaufen einen Dezimator-FIR
>(M=5) - dessen Ausgang exakt die vom Audio Codec benötigten 200
>kSamples/s liefert (die Synchronisation zwischen den Domänen erfolgt
>über einen asynchronen FiFo)

AHA! Hier wird also gemogelt!

>Dieses Schema funktioniert in der Theorie wunderbar - nur die
>(versteckte) Vorbedingung lässt sich so auf dem FPGA nicht
>implementieren: Die vom DCM generierte Frequenz müsste exakt mit dem
>berechneten Wert (52,2 MHz) übereinstimmen, damit die beiden genau
>aufeinander abgestimmten Takte nicht auseinanderlaufen.

Das kann nur eine PLL.

>Um max. einen Glitch pro Sekunde zuzulassen, müsste die AC_CLK bis auf 5
>ppm genau den geforderten 52,2 MHz entsprechen (unter der Voraussetzung,
>dass die Abweichung der SYS_CLK noch darunter liegt).

PLL!

>zu messen. Der IP Generator gibt einen "Phase Error" von ca 260 ps an -
>das entspräche ca 0,5 % - wäre also bereits um einen Faktor 100 größer
>als die oben hypothetisch geforderten 5 ppm.

Vorsicht! Nicht statische Phasenfehler mit Frequenzfehlern vermischen!

>Gibt es - ausser den ADC in die Clock-Domäne des Audio Codecs zu
>verlagern - noch eine anderen Lösung für obiges Dilemma?

So ganz hab ich dein Problem noch nicht verstanden. Wenn du aus 100 MHz 
52,2 MHz ableitest und DARAUS per digitaler Teilung die Takte für deinen 
Audio-DAC, dann kann doch gar nix wegdriften. Denn dann sind alle Takte 
phasenstarr zueinander. Oder gibt es für den DAC eine extra Taktquelle?

von Burkhard K. (buks)


Lesenswert?

>>Die 52,2 MHz werden mittels DCM (MMCME2) aus der SYS_CLK generiert, keine 
weitere Taktquelle.
>
> Wirklich? Das wäre ein recht krummer Teilerfaktor. Kann das dein DCM
> WIRKLICH? Oder liegt die Frequenz nicht eher daneben?

Der IP-Generator Dialog sagt: Ja. Allerdings nur wenn ich ein MMCME2 
verwende, beim PLLE2_ADV bekäme ich 52,174 MHz:
1
------------------------------------------------------------------------------
2
-- "Output    Output      Phase     Duty      Pk-to-Pk        Phase"
3
-- "Clock    Freq (MHz) (degrees) Cycle (%) Jitter (ps)  Error (ps)"
4
------------------------------------------------------------------------------
5
-- CLK_OUT1____52.200______0.000______50.0______298.957____259.341
6
--
7
------------------------------------------------------------------------------
8
-- "Input Clock   Freq (MHz)    Input Jitter (UI)"
9
------------------------------------------------------------------------------
10
-- __primary_________100.000____________0.010

> So ganz hab ich dein Problem noch nicht verstanden. Wenn du aus 100 MHz
> 52,2 MHz ableitest und DARAUS per digitaler Teilung die Takte für deinen
> Audio-DAC, dann kann doch gar nix wegdriften. Denn dann sind alle Takte
> phasenstarr zueinander. Oder gibt es für den DAC eine extra Taktquelle?

Nein, alle Takte sind von der SYS_CLK abgeleitet. Das Problem liegt 
tatsächlich im Wegdriften der AC_CLK - nur fehlen mir leider die 
Messmittel um diesen Fehler direkt zu messen. Interessanterweise rechnet 
die Simulation mit einer Periode, die 52,20569 MHz entspricht - und sagt 
das Wegdriften damit ziemlich exakt vorher.

Gruß,
Burkhard

von Falk B. (falk)


Lesenswert?

@Burkhard K. (Firma: Own my own) (buks)

>> phasenstarr zueinander. Oder gibt es für den DAC eine extra Taktquelle?

>Nein, alle Takte sind von der SYS_CLK abgeleitet. Das Problem liegt
>tatsächlich im Wegdriften der AC_CLK

Ahhh!. Und warum? Warum nich aus AC_CLK? Weil die Frequenz zu klein ist?
Wenn AC_CLK wirklich wegdriftet, arbeitet der DCM nicht nicht mehr als 
PLL und dann ist der Wurm drin.

>- nur fehlen mir leider die
>Messmittel um diesen Fehler direkt zu messen.

Warum? Ein Oszi hast du doch hoffentlich! Teile SYS_CLK und AC_CLK auf 
eine gemeinsame Frequenz runter und schau dir die Phasenlage über Zeit 
an. Trigger auf das eine Signal und schau das andere dabei an.

von Klakx (Gast)


Lesenswert?

nur mal so zur Überprüfung? wie sind deine Teiler und Multiplikatoren 
bei der DCM, kommt da etwas plausibeles raus.

52,2 MHz = 52,2/100 * 100 MHz = 522/1000 * 100 MHz = 261/500 * 100 MHz

.. so richtig sehr ich das nur mit einer fractional-PLL machbar. Ggf. 
noch über einen digitalen Zählertaktteiler (vielleicht auch nicht).

wie lange läuft der Codec? geht es vielleicht mit asynchronen domänen + 
fifo?

ggf. schau dich nach externen PLLs um

von Gustl B. (-gb-)


Lesenswert?

http://www.xilinx.com/support/documentation/user_guides/ug472_7Series_Clocking.pdf

Seite 70/71. Fractional divide kann 1/8, also du kannst beim Teiler 
jetzt in achtelschritten gehen. Aber aus 100 MHz 52.2MHz machen geht 
damit noch nicht.

Aber wie ist das, Lothar hat ja eine DDFS auf seiner Seite, sagen wir 
wir machen jetzt mit DDFS 52.2 MHz oder 26.1 MHz, dann ist das natürlich 
kein sauberes Signal weil ich nicht viele Punkte habe.
Aber wenn ich dieses Signal nehme das da rumjittert und es in eine PLL 
reistecke, würde die das dann korrigieren (ggf. multiplizieren bei 26.1 
MHz) und hinten kämen 52.2 MHz raus?

Fände ich sehr cool wenn das ginge. Muss ich mal ausprobieren irgendwann 
und gucken ob die PLL lockt.

von Burkhard K. (buks)


Lesenswert?

Urgs,

Peinlicher Rechenfehler, 2*25,6 gibt natürlich 51,2 MHz (und nicht etwa 
52,2). 51,2 MHz sind wunderbar per PLL synthesierbar. Mit der richtigen 
Frequenz gibt es in der Simulation über 10 ms keine signifikante 
Verschiebung und die Implementierung auf dem FPGA zeigt keine Glitches 
mehr.


Gruß,
Burkhard

von Falk B. (falk)


Lesenswert?

Kaum macht man es richtig, schon funktioniert!

von Audiomann (Gast)


Lesenswert?

Wer ist denn da der Master? Der DAC?

von J. S. (engineer) Benutzerseite


Lesenswert?

Gustl B. schrieb:
> Seite 70/71. Fractional divide kann 1/8, also du kannst beim Teiler
> jetzt in achtelschritten gehen. Aber aus 100 MHz 52.2MHz machen geht
> damit noch nicht

Es geht über einen Umweg und das sogar bis auf wenige ppm genau. Siehe 
die DCM-Konfiguration wie in meinem Drum Computer. Man benutzt den 
Eingangsteiler von 2/4 und eine zweite DCM, wenn man den hohen Audiotakt 
braucht. Bei mir reicht sogar eine. Die lässt sich sogar noch analog auf 
den Chip oder einen externen Takt synchen.

100 MHz / 4 -> 25 MHz

25 x 29 / 59 -> 12,288 MHz. Das ist die benötigte Audio-Frequenz, denn 
1/64 davon sind fast genau 192kHz.

von Gustl B. (-gb-)


Lesenswert?

Wow cool das klappt sogar, mit DDFS was erzeugen und dann intern wirder 
in eine PLL füttern.

von J. S. (engineer) Benutzerseite


Lesenswert?


von Gustl B. (-gb-)


Lesenswert?

Ja genau wie in deinem meinem anderen Thread :-)

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.