Forum: FPGA, VHDL & Co. Frequenzteiler 50MHz -> 24,576MHz


von Thorsten H. (morgentau)


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!

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


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...

von Ottmar (Gast)


Lesenswert?

Muss der 50MHz clock exakt sein oder könnte er einfach 2 x 24,576MHz 
haben?

von Klaus (Gast)


Lesenswert?

Müssen die 50MHz sein, oder geht auch 24,576 * 2 ?

MfG Klaus

von Thorsten H. (morgentau)


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?

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


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.

von Thorsten H. (morgentau)


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...

von Thorsten H. (morgentau)


Lesenswert?

by the way: hat schon jemand ISE Design Suite  13 istalliert? Gerade 
frisch raus...

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


Lesenswert?

Thorsten H. schrieb:
> Nicht dass ich mich da verzettel mit sonem eher ungewöhnlichen Takt.
Ich lasse mir da ganz gern einfach den Synthesizer irgendwelche 
Zählerbereiche/Endwerte/Vergleichswerte/usw. ausrechnen. Dann muß ich 
mir nicht merken, dass das jetzt keine 20ns sondern 20,345ns sind...

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


Lesenswert?

Thorsten H. schrieb:
> by the way: hat schon jemand ISE Design Suite  13 istalliert?
Ohne Servicepack kommt mir keine Xilinx-SW auf den Rechner...  ;-)

von Duke Scarring (Gast)


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

von Thorsten H. (morgentau)


Lesenswert?

Cool, vielen Dank für die Hilfe an alle!  Ich düse gleich mal in den 
Elektronikshop meines Vertrauens und hau da ein 24,576MHz Oszillator 
drauf...Schönen Tag noch! T.

von J. S. (engineer) Benutzerseite


Angehängte Dateien:

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.

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


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...

von Zamir Tadic (Gast)


Lesenswert?

Wie kommt man zu einer solchen Tabelle?

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


Lesenswert?

Zamir Tadic schrieb:
> Wie kommt man zu einer solchen Tabelle?
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...

von Falk B. (falk)


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

von ./. (Gast)


Lesenswert?

Ist doch alles Quatsch.
Den Quarz gibts bei Segor.

von Zamir Tadic (Gast)


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.

von ./. (Gast)


Lesenswert?

Thorsten H. schrieb:
> Dazu braucht der Codec eine 24,576MHz Clock (512*48KHz).

Da gibts nicht viel zu probieren.

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


Lesenswert?

Zamir Tadic schrieb:
> Es setzt sich ja keiner hin und probiert x Versionen durch.
Wofür gibt es Computer zu Deutsch Rechner?  :-o

von Zamir Tadic (Gast)


Lesenswert?

Meines Wissens gibt es keinen Algorithmus, um das analytisch 
auszurechnen.

von Mike (Gast)


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.

von J. S. (engineer) Benutzerseite


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.

von Bert (Gast)


Lesenswert?

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

von mac4ever (Gast)


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 :)

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


Lesenswert?

mac4ever schrieb:
> for(a=1;a<1000;a++){
>  for(b=1;b<1000;b++){
Wobei es sinnvoll wäre, den Schleifenendwert (1000) durch den Wert aus 
dem Datenblatt der PLL/DLL zu ersetzen...  ;-)

von Mike (Gast)


Angehängte Dateien:

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.

von D. I. (Gast)


Lesenswert?

1
if (v < 1.0001 && v > 0.9999)

kann man so schöner machen:
1
double EPS = 1e-4;
2
if (Math.abs(v-1) < EPS)

von mac4ever (Gast)


Lesenswert?

Lothar Miller schrieb:
> mac4ever schrieb:
>> for(a=1;a<1000;a++){
>>  for(b=1;b<1000;b++){
> Wobei es sinnvoll wäre, den Schleifenendwert (1000) durch den Wert aus
> dem Datenblatt der PLL/DLL zu ersetzen...  ;-)

Absolut korrekt ... wie gesagt: Pseudocode

von J. S. (engineer) Benutzerseite


Angehängte Dateien:

Lesenswert?

Von 1-1000 muss das aber nicht laufen, wenn es nur die DIV / MUL der PLL 
beschreiben soll.

Wenn es aber auch manuell erzeugte Frequenzen beschreiben soll, müsste 
es wiederum mehr sein.

Habe die DB anbie gepostet. Viel Spass.

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.