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!
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...
Muss der 50MHz clock exakt sein oder könnte er einfach 2 x 24,576MHz haben?
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?
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.
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...
by the way: hat schon jemand ISE Design Suite 13 istalliert? Gerade frisch raus...
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...
Thorsten H. schrieb: > by the way: hat schon jemand ISE Design Suite 13 istalliert? Ohne Servicepack kommt mir keine Xilinx-SW auf den Rechner... ;-)
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
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.
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.
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...
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...
@ 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
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.
Thorsten H. schrieb: > Dazu braucht der Codec eine 24,576MHz Clock (512*48KHz). Da gibts nicht viel zu probieren.
Zamir Tadic schrieb: > Es setzt sich ja keiner hin und probiert x Versionen durch. Wofür gibt es Computer zu Deutsch Rechner? :-o
Meines Wissens gibt es keinen Algorithmus, um das analytisch auszurechnen.
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.
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.
Könntest Du diese VBA-Funktion bitte posten? Würde mich interessieren.
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 :)
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... ;-)
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.
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) |
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 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.