Wie misst man die Phasendifferenz zweier Signale gleicher Frequenz in einem FPGA?

8

Wie misst man die Phasendifferenz zweier Signale gleicher Frequenz in einem FPGA?

Angenommen, ich habe zwei 150-MHz-Signale (intern im FPGA), die synchron zueinander sind, aber durch eine konstante Phasendifferenz ausgeglichen sind. Wie könnte ich dies messen?

Ich habe bestehende Methoden eines Time-to-Digital-Wandlers auf einem FPGA untersucht, aber diese betreffen hauptsächlich zwei einmalige Start- und Stoppsignale und die Messung der Zeit zwischen diesen beiden Ereignissen. Ich frage mich, ob es eine bessere Methode gibt, wenn wir wissen, dass sich die Signale mit einer konstanten Phasendifferenz wiederholen.

cksa361
quelle
Sind Sie auf das FPGA-Gerät oder die FPGA-Familie beschränkt, die Sie verwenden können?
Jason Morgan
1
Mit welcher Genauigkeit möchten Sie den Phasenwinkel messen?
Jason Morgan

Antworten:

5

Verwenden Sie einen der PLL-Taktblöcke des FPGA, um eine etwas andere Frequenz zu erzeugen, z. B. 140 MHz oder was auch immer Sie tun können. XOR dies mit jedem der interessierenden Signale (theoretische Berücksichtigung möglicher Metastabilitätsprobleme, aber sich selbst davon zu überzeugen, dass es in der Zeit genug funktioniert). Vergleichen Sie die Phasen der beiden Ergebnisse mit niedrigerer Frequenz.

In der Tat entspricht dies der Funktionsweise eines Hetrodyn-Funkempfängers: Sie mischen das eingehende Signal mit einem lokalen Oszillator und erzeugen ein Ergebnis mit niedrigerer Frequenz, das für eine detaillierte Verarbeitung bequemer ist.

Da Sie im Grunde ein digitales Ein-Bit-System haben, erfolgt Ihr Ergebnis in diskreten Schritten, die durch die Frequenzdifferenz bestimmt werden. Je näher Ihre LO-Frequenz an der Eingangsfrequenz liegt, desto feiner ist das Ergebnis, aber desto seltener erhalten Sie eine Antwort. Die Phasen- und Arbeitszyklusstabilität des PLL-Blocks bei verschiedenen Verhältnissen wäre eine Untersuchung wert. Wenn Sie mehrere Messungen mitteln, erhalten Sie vermutlich eine bessere Antwort.

Chris Stratton
quelle
Sie benötigen dort eine Art Tiefpassfilter, um die untere von der oberen Frequenz zu trennen.
Dave Tweed
@ DaveTweed Eigentlich nicht - die höhere Frequenz ist theoretisch vorhanden, wenn Sie den Datenstrom von 140 oder 150 Msps pro Sekunde interpretieren, indem Sie rückwärts durch die Nyquist-Regel arbeiten, aber die wörtliche Darstellung wäre eine negative Frequenz, was in diesem Fall der Fall ist nicht zu unterscheiden. Es kann einfacher sein, über die digitale Logik nachzudenken, bei der Sie für eine Weile eine Ausgabe erhalten, die 1 ist, bis sie auf 0 und schließlich wieder auf 1 übergeht.
Chris Stratton
1
Ich schlage vor, Sie führen Ihre Idee durch einen Standard-Logiksimulator. Was Sie am Ausgang des XOR-Gatters sehen, ist eine Wellenform, die im Grunde genommen eine Frequenz von 290 MHz hat, deren Tastverhältnis jedoch von 0% bis 100% variiert und mit einer 10-MHz-Periode wieder zurück. Wenn Sie dieses Signal erneut abtasten (mit welcher Uhr?), Müssen Sie das sagen.
Dave Tweed
Ich hätte wahrscheinlich explizit Resample sagen sollen; effektiv ist es implizit in der Annahme enthalten, dass eine logische Synchronisation (zu einer der Uhren) verwendet wird, um das Ergebnis zu bewerten.
Chris Stratton
Ich kann verstehen, was Dave gesagt hat. Wie "sample" ich das XOR-Signal erneut (dh mit welcher Uhr erneut?)?
cksa361
4

Sie suchen einen Phasendetektor. Fast alle FPGAs verfügen über ein PLL-Modul, das hauptsächlich zur Erzeugung von Taktsignalen entwickelt wurde. Einige davon können mit einem internen Signal angesteuert werden. Ich bin nicht sicher, ob Sie das Phasendetektorsignal von der PLL abziehen können, aber ich bezweifle es sehr.

Sie können einen Phasendetektor in einem High-End-FPGA implementieren (siehe diesen Vertex-App-Hinweis ), aber das scheint eine Menge Arbeit zu sein, insbesondere für etwas, das eine relativ einfache analoge Operation ist, für die Standard-ICs existieren, wie z die analogen Geräte AD8302 . Aber Sie kennen Ihre Plattform besser als ich - vielleicht haben Sie keinen Zugriff auf Hardwareänderungen.

Jay Carlson
quelle
4

Xilinx-FPGAs verfügen über eine Funktion im Block "Digital Clock Manager", die einen programmierbaren Ausgangsversatz ermöglicht. Dieser Ausgangsversatz kann zur Laufzeit in kleinen Schritten geändert werden (10 pS, wenn ich mich richtig erinnere).

Sie haben 2 Uhren, wir nennen sie A und B. Uhr A ist Ihre Hauptuhr, von der fast Ihre gesamte Logik abgelaufen ist. Takt B wird durch ein DCM mit Versatz und dann zu einem T-Flip-Flop geleitet, wodurch ein Signal erzeugt wird, das an jeder Flanke von B umschaltet. Dieser Umschaltausgang wird dann zu einem D-Flip-Flop geleitet, das mit A getaktet ist.

Was Sie jetzt tun, ist, den Versatz auf B zu fegen und die Ergebnisse zu betrachten, wenn er von A abgetastet wird. Wenn Sie die Einstellung für den Taktversatz fegen, beginnt der Ausgang dieses D-Flip-Flops bei einem Wert und wechselt dann zu einem anderen .

In mancher Hinsicht ähnelt diese Methode dem, was @JasonMorgan vorgeschlagen hat - erfordert jedoch nicht viele optimierte logische Verzögerungen, um sicherzustellen, dass diese 360-Puffer eine konsistente Verzögerung von Kompilierung zu Kompilierung aufweisen (dies wird nicht der Fall sein).

Ich habe etwas sehr Ähnliches in einem Xilinx Spartan-3 gemacht und es hat sehr gut funktioniert.


quelle
Warum brauchst du das T-Flip-Flop?
cksa361
2
@ cksa361 FPGAs verfügen normalerweise über Clock-Routing-Ressourcen und Signal-Routing-Ressourcen, und (fast) niemals dürfen die beiden verwechselt werden. Es vermeidet nur viele Probleme. Das T-Flip-Flop ist im Grunde eine Möglichkeit, die "Informationen" der Uhr von einem Uhrennetz in ein Signalnetz zu verschieben, ohne etwas
1

Ich bin mir nicht sicher, ob das funktionieren würde, es ist nur eine Idee. Es wird jedoch die Notwendigkeit eines Hochgeschwindigkeits-Abtasttakts vermieden, um den zeitlichen Abstand zwischen Ihren Signalen zu messen.

Sie können die (ziemlich) deterministischen Verzögerungen innerhalb des Geräts und die große Anzahl von Gates nutzen, insbesondere wenn Sie in einer Umgebung mit eingeschränkter oder kontrollierter Temperatur arbeiten. Sie benötigen einen externen Schleifenfilter, eine CR-Schaltung und möglicherweise einen Schmidt-Puffer. Sie müssen Ihren Monteur anweisen, die Tore nicht zu optimieren.

Nehmen Sie Ihre Referenz und wenden Sie sie auf ein XOR-Gatter an. Nehmen Sie das gemessene Signal und verzögern Sie es, z. B. 360 Puffer in Reihe. Nehmen Sie die 360-Ausgänge der Puffer und leiten Sie sie (mit entsprechenden Einschränkungen) durch einen 360: 1-Mux (360-UND-Gatter und einen Decoder). Übergeben Sie den Ausgang des Mux in das XOR-Gatter. Übergeben Sie den Ausgang des XOR-Gatters in das Schleifenfilter, nehmen Sie den Eingang und takten Sie damit einen Zähler. Ein Steuerblock setzt den Zähler asynchron mit einer bestimmten Rate zurück, z. B. 1 ms. Der Steuerkreis durchläuft alle 1 ms den Mux und sucht nach der kleinsten Anzahl. Der Zustand des Mux zu diesem Zeitpunkt ist der Phasenwinkel in Grad.

Jason Morgan
quelle
0

Angenommen, Sie haben einen 600-MHz-Takt und einen Zähler. Beginnen Sie mit der Zählung mit der führenden Bearbeitung eines Signals und stoppen Sie den Zähler [Leseergebnis] mit der vorderen Flanke des zweiten Signals.
Die Auflösung ist eine Funktion der Differenz zwischen Abtast- und Taktfrequenz.
600/150 = 4, sodass Sie eine Phasenauflösung von 4 Schritten (oder 90 Grad) erhalten.

Sie möchten eine bessere Auflösung, während Sie bei einem FPGA bleiben? OK, aber das wird ein bisschen funky ...

Zuerst benötigen Sie 2 Schaltkreise, "Lead" und "Lag". Wir müssen auch unsere Signale mit "T" [Test] und "R" [Referenz] kennzeichnen. Die "Leitung" ist: T UND (NICHT R). "
Verzögerung " ist: R UND (NICHT T) Abhängig von Ableitung oder Verzögerung erzeugt eine davon ein Signal mit einer Impulsbreite proportional zur Phasendifferenz. Stellen Sie jeden Ausgang durch separate Tiefpassfilter, wahrscheinlich etwa 1 MHz.
Lesen Sie abschließend: http://www.latticesemi.com/~/media/Documents/WhitePapers/AG/CreatingAnADCUsingFPGAResources.PDF?document_id=36525
Hier erfahren Sie, wie Sie einen SAR-ADC in einem FPGA implementieren. Digitalisieren Sie die gefilterten "Lead" - und "Lag" -Signale: Das größte gibt Ihnen die Phasengröße und das Vorzeichen.

EDIT: Meine Logikgatterbeschreibung ist nicht korrekt. Suchen Sie einen Phasendetektor nach einem geeigneten Schaltplan

Alan Campbell
quelle
0

Verwenden Sie zwei PLL. Erzeugen Sie aus beiden Hochfrequenzsignalen eine möglichst niedrige Frequenz. Sagen wir 150MHz -> 15MHz. Die Phasendifferenz bleibt zwischen den beiden Niederfrequenzsignalen gleich. Messen Sie dann die Phase dieser langsamen Signale. (XOR sie oder verwenden Sie eine andere Logik)

Feindealpfa
quelle