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
Sorry, aber nach dem Post habe ich mehr Fragezeichen als vorher. Was bekomme ich hier nicht mit?
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.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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.