Frequenzteiler 50MHz -> 24,576MHz

OP #2088738
Lesenswert?

Hallo,
auch wenn so einige Beiträge ztum Thema Frequenzteiler hier im Forum 
kursieren, brachten diese mich bei der Lösung meines Problems nicht 
weiter.

Ich möchte einen Audiocodec (TI PCM3010, 
http://focus.ti.com/docs/prod/folders/print/pcm3010.html) an meinen 
Spartan3E 
(http://www.digilentinc.com/Products/Detail.cfm?NavPath=2,400,790&Prod=BASYS2) 
hängen (möchte nicht diese PMOD Converter in 12Bit) .
Dazu braucht der Codec eine 24,576MHz Clock (512*48KHz).

Dazu gibt es nun mehrere Möglichkeiten:

Variante 1:
Ich bastel mir einen externen Oszillator mit der gewünschten Frequenz 
dran. Das halte ich aber für Unsinn, da mehrer Clocks vermutlich Chaos 
verursachen...

Variante 2:
Ich baue mir eine Divider-Component mit Teilungsfaktor 1536/3125 = 
1/2,0345052

Da ich noch relativer Neuling bin, bräuchte ich einen Hinweis, wie ein 
Teiler mit solch einem ungeraden Verhältnis zu realisieren ist?!?!

Ich habe schon synthesefähige Teiler programmiert auf der Basis eines 
einfachen Counters (wenn counter = Zielwert, dann mach mir ne neue 
Flanke).
Diese Taktik funktioniert allerdings bei einem ungeraden Verhältnis 
nicht mehr so leicht....

Variante 3:
Ich nutze meinen funktionierenden Teiler, teile auf 1kHz runter und 
multilpliziere (wie auch immer das gehen soll) mit 24576.
Geht das? Wenn ja, Tips?


Bitte um paar schlaue Ratschläge und Meinungen, Erfahrungswerte ;-)
Merci!
Moderator (Firma: Titel) Persönliche Seite #2088795
Lesenswert?

Thorsten H. schrieb:
> Variante 1:
> Ich bastel mir einen externen Oszillator mit der gewünschten Frequenz
> dran. Das halte ich aber für Unsinn, da mehrer Clocks vermutlich Chaos
> verursachen...
Du hast auch mit 50MHz und einem wie auch immer gearteten 24,576MHz Takt 
schon dieses befürchtete Chaos mit den Taktdomänen...

> Variante 2:
> Ich baue mir eine Divider-Component mit Teilungsfaktor 1536/3125 =
> 1/2,0345052
> Da ich noch relativer Neuling bin, bräuchte ich einen Hinweis, wie ein
> Teiler mit solch einem ungeraden Verhältnis zu realisieren ist?!?!
So ohne Weiteres gar nicht. Ein Ansatz wäre Das Auslassen von einzelnen 
Takten (Clock-Skipping).
Aber vermutlich kannst du hier nicht mehr mit Clock-Skipping arbeiten, 
denn damit bekommst du einen recht hohen Jitter...

> Variante 3:
> Ich nutze meinen funktionierenden Teiler, teile auf 1kHz runter und
> multilpliziere (wie auch immer das gehen soll) mit 24576.
Nein.

Sieh dir mal Clock-Manager an (DCM, PLL, DLL oder wie die immer heißen).
Für Spartan3 kannst du ein Verhältnis von 1536/3125 allerdings nicht 
einstellen:
1
CLKFX_MULTIPLY / CLKFX_DIVIDE
2
defines the multiplication factor for the frequency of the CLKFX and 
3
CLKFX180 outputs. Used in conjunction with the CLKFX_DIVIDE attribute.
4
Allowable values for CLKFX_MULTIPLY include integers ranging from 2 to 32.
5
Allowable values for CLKFX_DIVIDE include integers ranging from 1 to 32.

Ich würde Lösung Nr. ins Auge fassen...
OP #2088820
Lesenswert?

Hallo Danke für die schnellen Antworten schon mal!


Klaus schrieb:
> Müssen die 50MHz sein, oder geht auch 24,576 * 2 ?
>
> MfG Klaus


ja, die 50MHz liefert der on-Board Oszillator, kann alternativ 25Mhz 
oder 100Mhz gejumpert werden.
Oder mein Ihr ich soll einen anderen Oszillator dranhängen (24,576MHz) 
und mein ganzes Projekt (nicht nur das I2S-Audio-Interface) mit diesem 
Takt versorgen?
Moderator (Firma: Titel) Persönliche Seite #2088821
Lesenswert?

Ottmar schrieb:
> Muss der 50MHz clock exakt sein
Klaus schrieb:
> Müssen die 50MHz sein
Ich würde mal so frei behaupten:
das FPGA Board hat genau diesen 50MHz Oszillator eingebaut.

EDIT: richtig getippt... ;-)

Thorsten H. schrieb:
> Oder mein Ihr ich soll einen anderen Oszillator dranhängen (24,576MHz)
> und mein ganzes Projekt (nicht nur das I2S-Audio-Interface) mit diesem
> Takt versorgen?
Das wäre das einfachste:
nur 1 Takt mit 24,576MHz (oder 24,576MHz*2 oder 24,576MHz*4).
Aber eben nur 1 Takt.
OP #2088828
Lesenswert?

Lothar Miller schrieb:
> Das wäre das einfachste:
> nur 1 Takt mit 24,576MHz (oder 24,576MHz*2 oder 24,576MHz*4).
> Aber eben nur 1 Takt.

mmm...klingt plausibel!
Macht das denn auch Sinn für andere Componeten? Nicht dass ich mich da 
verzettel mit sonem eher ungewöhnlichen Takt. Oder ist das total 
wurscht?
Ich will ja schliesslich Audio verarbeiten und keine HF-Anwendungen...
Gast #2088928
Lesenswert?

Thorsten H. schrieb:
> Macht das denn auch Sinn für andere Componeten? Nicht dass ich mich da
> verzettel mit sonem eher ungewöhnlichen Takt.

Problematisch wird es wieder dann, wenn Du gleichzeitig verschiedene 
Takte für verschiedene Komponenten brauchst. Ansonsten ist es den 
Registern im FPGA ziemlich wurscht, wie schnell die getaktet werden. Der 
Takt kommt von außen. Die Taktrate wird dem Tool mitgeteilt und das Tool 
sagt dann, passt oder passt nicht.

Duke
Persönliche Seite #2095889
Lesenswert?

Wenn es nicht 100% genau sein muss, sondern es auf Synchronistät 
ankommt, dann kannst Du 2 PLLs im FPGa vernetzen. Nach einer Anzahl von 
Takten, die dem KGV entspricht, ist das Ganze dann periodisch. Anbei 
eine Lösung für einen 50MHz Quarz mit maximalem Fehler von 0,014%.

Die Tabelle ist von der Verdrahtung her von hinten zu lesen.
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #2096349
Lesenswert?

Juergen S. schrieb:
> Synchronistät
Hmmm, interessant...  :-o
http://www.freak-search.com/de/thread/166319/substantiv_von_synchron
Mir wäre da auf Anhieb kein Substantiv zu "synchron" eingefallen...
Ich hätte der Einfachheit halber "Synchronität" gesagt.

> Wenn es nicht 100% genau sein muss, sondern es auf Synchronistät
> ankommt
Meintest du da eher "Jitterfreiheit" o.ä.?
Denn synchron zueinander im Sinne des Wortes können diese beiden Takte 
per Definition niemals sein...
#2096504
Lesenswert?

@  Lothar Miller (lkmiller) Benutzerseite

>Ich würde als ersten Ansatz die Brute-Force-Methode nehmen:
>Alle 32*32*32*32/2 möglichen Verhältnisse ausprobieren und die mit dem
>geringsten Fehler ausgeben...

Hmmm, geht einfacher. Einfach Zähler und Nenner bei jeweils eins 
loslaufen lassen, Wert berechnen. Ist er zu groß, Nenner um eins 
vergrößeren. Ist er zu klein, Zähler um eins vergrößern. Geht 
hundertfach schneller und konvergiert. Den Beweis müssen aber andere 
liefen ;-)

MFG
Falk
Gast #2096547
Lesenswert?

Mir ging es nicht darum, ob es einen Quarz gibt, oder wie man sonst zu 
so einem Verhältnis gelangt, sondern wie der Autor diese Verhältnisse 
bestimmt hat. Es setzt sich ja keiner hin und probiert x Versionen 
durch.
Gast #2098186
Lesenswert?

Brute Force geht eigentlich ganz gut. Die 4 verschachtelten Schleifen 
(mit kleinen Optimierungen um Spiegelungen auszuschließen) sind auf 
meinem Rechner praktisch sofort fertig. Hier das Ergebnis:

10/23 26/23: 24.574669187145556 0.9999458490863263
10/21 32/31: 24.577572964669738 1.000064004096262
13/23 20/23: 24.574669187145556 0.9999458490863263
16/21 20/31: 24.577572964669738 1.000064004096262
17/21 17/28: 24.57482993197279 0.9999523898100907

Rechenzeit: <16ms

Die krummen Teiler (z.B. 1.5) über CLKDV habe ich mal weggelassen.
Persönliche Seite #2098600
Lesenswert?

Das sind aber nur 3 lösungen, wenn du mal 1/3 und 2/4 vergleichst. :-)

> sondern wie der Autor diese Verhältnisse bestimmt hat.
Nicht viel anders, als o.g.Läuft über eine VBA-Funktion in Access.

Ich berücksichtigte allerdings auch die optimalen und erlaubten 
Zwischenfrequenzen für den Oszillator und rechne den optimalen Quarz 
aus. Manchmal kommt man mit einem 16er z.B. besser hin, als z.B. mit 
einem 50er.
Gast #2258801
Lesenswert?

Bert schrieb:
> Könntest Du diese VBA-Funktion bitte posten?
> Würde mich interessieren.

Das wird jetzt zwar ein unqualifizierter Beitrag, aber egal ...
Ich bin absolut verwundert, wie einfallslos man sein muss, um diese 
Funktion als interessant zu bezeichnen ...
Wenn es schon an solchen Problemen scheitert, dann ... ich will gar 
nicht weiter darüber nachdenken.

Aber hier mein Vorschlag mit etwas Pseudocode:
1
for(a=1;a<1000;a++){
2
 for(b=1;b<1000;b++){
3
  c = (a*Quartztakt)/b;
4
  if(abs(zielwert - c) < max_abweichung)
5
   ausgabe(c); //printf, echo, ...
6
 }
7
}

Ich lasse also nur Ergebnisse anzeigen, die im Bereich von 
max_abweichung um meine Zeilfrequenz liegen. Die "Spiellerei" mit der 
Aufteilung auf 2 PLLs sollte man ebenfalls mit grundlegenden 
mathematischen Operationen hinbekommen. Außer für Primzahlen :)
Gast #2258882
Lesenswert?

Dieses Problem zu lösen ist nicht wirklich anspruchsvoll. Man muss sich 
nur überlegen was passiert wenn man 2 DCM verkettet. Ich habe mal meinen 
Code für die Ergebnisse weiter oben angehängt.

Ist in Java und absolut hässlich ;). Es müsste noch für halbe Teiler und 
Tests auf zulässige Zwischenfrequenzen erweitert werden. Sollte sich 
aber problemlos auf andere Programmiersprachen übertragen lassen.
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren