Hi,
ich möchte gerne eine Frequenz [I/O Signal] um eine bestimmten Wert
verschieben. Es reicht wenn ich die Frequenz nur nach oben schieben
kann. Zudem sollte der Wert zur Laufzeit veränderbar sein. Die Frequenz
beträgt ca. 10 Mhz (den Wert weiß man nicht genau, da er sich ändern
kann) und die Verschiebung sollte so um die 0 - 100 Khz betragen können,
bei 50% duty cycle.
Zuerst dachte ich an sowas wie einen Frequenzgenerator + Mixer + Filter.
Dann dachte ich an CLK Generatoren, die das ja mit PLL machen, aber hab
leider nichts gefunden was man ich in der Richtung verwerten könnte.
Hat jmd. eine Idee wie man das Umsetzten könnte oder gibt es gar
irgenteine std. Lösung?
Arbeite mit einem Spartan3a und bevorzuge VHDL.
Mfg Marcus :)
Marcus schrieb:
Zudem sollte der Wert zur Laufzeit veränderbar sein.
Ich verstehe den Satz nicht. Eventuell bin ich einfach nur zu doof, aber
was genau ist gemeint?
Frequenzbereich verlagern ist allgemein als "Mischen" bekant, das geht
auch digital, auch in einem Spartan. Was mir Sorgen macht, ist die
kleine Verschiebung, denn der ausgangsfrequenzbereich darf eigentlich
nicht mit dem Zielfrequenzbereich überlappen, dies wird durch Filterung
gemacht. Geht ja auch digital, ist aber aufwendig.
Gruß, Jochen
Beschreibe doch mal das Problem, das Du lösen möchtest indem Du eine
Frequenz verschiebst. (Das ist ein sehr problematischer Ausdruck, aber
den lasse ich mal stehen).
Das Problem, das Jochen ansprach ist folgendes: Falls das Signal im
stationären Zustand (wenn also keine Veränderung von aussen erfolgt)
eben einfach ein Rechteck bestimmter Frequenz ist und die gewünschte
Veränderung (also die zeitliche Änderung von einem stationären Zustand
in den anderen) darin besteht, die Differenzfrequenz zu ändern, dann
kann mit der Stellgrösse auch die Filtergrenze verschoben werden. Falls
das Eingangssignal aber selbst eine Bandbreite hat, also im stationären
Zustand einer gewissen Änderung unterliegt, aber dennoch Rechteck bleibt
(sehen wir mal von der Frage ab, wie sich die Form während der Änderung
selbst verändert) und die Bandbreite grösser ist als die
Differenzfrequenz, dann ist das nicht möglich. Selbst wenn die
Bandbreite nur wenig geringer ist als die Differenzfrequenz wird ein
Filter extrem aufwendig.
Deswegen, beschreibe uns erstmal das Problem, ehe wir an Lösungen
arbeiten, die vielleicht garkeine sind.
Hallo,
danke für die schnelle reaktion.
Ich habe ein Regelsystem welches über diverse externe Komponenten (wie
Ventile) eine PLL bildet. Die Regelung soll per FPGA erfolgen. In den
FPGA kommen 2 Frequenzen rein, die dann über einen Phasenkomparator
verglichen werden etc.. Im Testaufbau funktioniert das auch schon. Die
eine Frequenz kommt von einem 10Mhz standart, die andere vom Aufbau.
Idealer weiße ist der Aufbau so eingestellt, dass die Frequenz auf 10Mhz
geregelt werden soll. Da es aber einige Parameter gibt ist das nicht
immer zu gewährleisten, jedoch kann man Sicherstellen das die Frequenz
immer leicht unter 10Mhz liegt. Deswegen möchte ich quasi sagen können
(zur Laufzeit, also nach dem syntetisieren), das die Regelung auf die
Aktuelle Frequenz (vom Aufbau kommend) regeln soll, indem ich die
Frequenz so lange nach oben verschiebe bis sie 10 Mhz erreicht hat.
Man könnte jetzt sagen, dass mein Regelsignal auf den Aktuellen Wert des
Phasenkomperators( + nachgeschalteten Filter) Regeln soll.
Jedoch denke ich das das Regelsystem genauer Regeln kann wenn das
Regelsystem auf einen Phasen unterschied von 0 regeln kann. Deswegen die
idee mit den Verschieben.
Ich hoffe es ist einiger maßen verständlich.
Mfg Marcus
Ich hab mal sowas gesehen. Einen VCO mit PLL laesst man mit dem Teiler
1:1 laufen. Zwischen VCO und feedback eingang des PLL Bausteins kommt
nun ein XOR, welches, die Funktion eines Mischers hat. Dort kann man nun
die Differenzfrequenz einspeisen, 100Hz oder 100kHz . Da war noch was,
womit man unterscheiden konnte, ob Addieren oder Subtrahieren....
Marcus schrieb:> 10 Mhz (den Wert weiß man nicht genau, da er sich ändern> kann) und die Verschiebung sollte so um die 0 - 100 Khz betragen können,> bei 50% duty cycle.
So, wie Du das beschreibst, geht das nur mit Flankenbeschleunigung über
die IO-Delays und einer kontinuierlichen Regelung. Ich habe das mal als
Ansatz für eine hochgenaue Steuerung entworfen, allerdings mit einem
besseren Chip. Du musst dazu die IO-Delays kontinuierlich verkürzen und
dann den Takt einmal springen lassen. Mit jedem Hopp hast Du quasi einen
Takt gewonnen. Bei Dir wären das 1:100 wenn ich richtig rechne. Die
Delays verteilen dann den Sprung gleichmäßig auf die Zeit.
Wenn die Kapazität der IO-Delaystrecke nicht für eine volle Taktperiode
reicht, musst Du mit Kombinatorik nachhelfen. Bei dem damals
eingesetzten Chip konnte man auf 50ps genau stellen und hatte eine
Reserve von ich glaube 31 steps. Damit wären wir bei 1,5ns, was nur für
einen 660 MHz Takt ginge. Mit etwas Hirnschmalz geht das auch noch
genauer, ich kam damals auf unter 20ps Präzision.
Für Deine 10MHz ist das zu schnell.
Also baust Du Dir eine Kombinatorik aus LUTs mit angeschlossenem
Multiplexer, der eine immer kürzere Strecke abtastet und dann wieder zum
Ausgangpunkt geht. Die Geschwindigkeit, mit der Du den MUX oder die
Delays umkonfigurierst, gibt den Frequenzaufschlag an. Das geht
natürlich in beide Richtungen. Das Ganze ist so eine Art Dopplereffekt
beim Entgegenlaufen der Welle. Mit der Methode entjittere ich in meiner
Workstation S/PDIF Takte und passe die Frequenz in Echtzeit an.
Marcus schrieb:> Es reicht wenn ich die Frequenz nur nach oben schieben> kann.
Kannst Du nicht eine PLL mit einem zweiten VCO verwenden?
Auf die Steuerspannung für den zweiten VCO addierst Du dann noch Dein
einstellbares Offset.
Für mich sieht hier eine analoge Lösung einfacher aus, als irgendwas mit
dem FPGA hinzubiegen. Vielleicht hab ich ja etwas übersehen...
Duke
Hallo,
hat ein wenig gedauert bis ich mich nun wieder diesem Problem widmen
kann.
Duke Scarring schrieb:> Kannst Du nicht eine PLL mit einem zweiten VCO verwenden?> Auf die Steuerspannung für den zweiten VCO addierst Du dann noch Dein> einstellbares Offset.
Das wird/ist auf jeden fall der Plan B! Immoment komme ich noch nicht
von meiner Einstellung runter, möglichst viel im FPGA zu machen.
Jürgen S. schrieb:> Für Deine 10MHz ist das zu schnell.>> Also baust Du Dir eine Kombinatorik aus LUTs mit angeschlossenem> Multiplexer, der eine immer kürzere Strecke abtastet und dann wieder zum> Ausgangpunkt geht. Die Geschwindigkeit, mit der Du den MUX oder die> Delays umkonfigurierst, gibt den Frequenzaufschlag an. Das geht> natürlich in beide Richtungen. Das Ganze ist so eine Art Dopplereffekt> beim Entgegenlaufen der Welle. Mit der Methode entjittere ich in meiner> Workstation S/PDIF Takte und passe die Frequenz in Echtzeit an.
Was du beschrieben hast würde ich gerne mal ausprobieren. Jedoch habe
ich das Prinzip und deine Rechnung noch nicht ganz verstanden.
Die Delaylines die man hat reichen von 0s bis eine CLK Periode?
Immer wenn ich durch alle Delaylines durch bin, habe ich ein Takt
gewonnen/verloren?
D.h. Die Frequenz mit der ich die Delaylines umkonfiguriere sollte
1/(Anzahl der Delaylines * Schrittdifferentz nach 1 Sekunde) sein?
Also z.b. bei +1MHz habe ich 10^6 schritte plus nach einer Sekunde mit
100 Delaylines => 100 MHz, mit der ich umkonfigurieren muss.
Wenn das soweit ok ist, dann habe ich noch ein Problem die Delaylines im
FPGA umzusetzten. Gibt es da einen Delayline Generator?
Unter einer Kombinatorik mit LUTs kann ich mir immoment nichts
vorstellen :(.
Marcus schrieb:> Die Delaylines die man hat reichen von 0s bis eine CLK Periode?> Immer wenn ich durch alle Delaylines durch bin, habe ich ein Takt> gewonnen/verloren?
Exakt.
Das Tempo, mit dem Du zusätzliche Periodenfragmente einfügst/wegsparst
bestimmt den Frequenzhub. Das Ganze muss natürlich im Rahmen der
Akzeptanz des annehmenden Geräts getan werden - gfs kann/muss man da
eine PLL dazwischenschalten:
http://www.96khz.org/oldpages/frequencyshifter2.htmMarcus schrieb:> Gibt es da einen Delayline Generator?
Nein :-)
Du hast bei PLDs, wofür das mal entwickelt wurde, nur die Kombinatorik
und einen Umschalter. Da geht auch bei FPGAs. Du formulierst eine look
up table auf Architekturebene und applizierst ein keep constraint, damit
sie erhalten bleibt. Dann erhälst Du eine geringe Verzögerung von
10-100ps.
In FPGAs hast Du zudem die Möglichkeit, konfigurierbare IO-Delays zu
benutzen. Damit kann man jeweils z.B. 50ps schieben. Das wäre hier
wahrscheinlich zu empfehlen.