mikrocontroller.net

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


Autor: Thorsten H. (morgentau)
Datum:

Bewertung
0 lesenswert
nicht 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?Nav...) 
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!

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
CLKFX_MULTIPLY / CLKFX_DIVIDE
defines the multiplication factor for the frequency of the CLKFX and 
CLKFX180 outputs. Used in conjunction with the CLKFX_DIVIDE attribute.
Allowable values for CLKFX_MULTIPLY include integers ranging from 2 to 32.
Allowable values for CLKFX_DIVIDE include integers ranging from 1 to 32.

Ich würde Lösung Nr. ins Auge fassen...

Autor: Ottmar (Gast)
Datum:

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

Autor: Klaus (Gast)
Datum:

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

MfG Klaus

Autor: Thorsten H. (morgentau)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thorsten H. (morgentau)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Thorsten H. (morgentau)
Datum:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...  ;-)

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thorsten H. (morgentau)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jürgen Schuhmacher (engineer) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Juergen S. schrieb:
> Synchronistät
Hmmm, interessant...  :-o
http://www.freak-search.com/de/thread/166319/subst...
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...

Autor: Zamir Tadic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie kommt man zu einer solchen Tabelle?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ./. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist doch alles Quatsch.
Den Quarz gibts bei Segor.

Autor: Zamir Tadic (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ./. (Gast)
Datum:

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

Da gibts nicht viel zu probieren.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Zamir Tadic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meines Wissens gibt es keinen Algorithmus, um das analytisch 
auszurechnen.

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jürgen Schuhmacher (engineer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bert (Gast)
Datum:

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

Autor: mac4ever (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
for(a=1;a<1000;a++){
 for(b=1;b<1000;b++){
  c = (a*Quartztakt)/b;
  if(abs(zielwert - c) < max_abweichung)
   ausgabe(c); //printf, echo, ...
 }
}

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...  ;-)

Autor: Mike (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if (v < 1.0001 && v > 0.9999)

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

Autor: mac4ever (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jürgen Schuhmacher (engineer) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.