Forum: FPGA, VHDL & Co. Frequenz verschieben


von Marcus (Gast)


Lesenswert?

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

von Jochen F. (jamesy)


Lesenswert?

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

von Hmm (Gast)


Lesenswert?

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.

von Marcus (Gast)


Lesenswert?

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

von Jochen F. (jamesy)


Lesenswert?

Sorry, aber nach dem Post habe ich mehr Fragezeichen als vorher. Was 
bekomme ich hier nicht mit?

von Viktor N. (Gast)


Lesenswert?

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

von Jürgen S. (engineer) Benutzerseite


Lesenswert?

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.

von Duke Scarring (Gast)


Lesenswert?

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

von Marcus (Gast)


Lesenswert?

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

von Jürgen S. (engineer) Benutzerseite


Lesenswert?

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

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

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.