Takt für serielles Signal rekonstruieren

Angenommen, ich habe ein serielles Signal (Beispiel unten), das ohne ein begleitendes Taktsignal übertragen wird. Ich möchte eine Schaltung finden (unter Verwendung diskreter Komponenten / ICs, möglicherweise eines FPGA, aber nicht eines Mikrocontrollers), um den Takt für dieses Signal zu rekonstruieren .

Die größte Herausforderung besteht darin, dass die Frequenz dieses seriellen Signals im Laufe der Zeit variiert. Das Signal wird von einem drahtlosen ASIC empfangen. Wenn der ASIC-Sender eingeschaltet ist, erzeugt der Empfänger ein Signal, wie unten gezeigt.

Außerdem kann der ASIC nach einigen Sekunden zeitweise (und asynchron) abschalten, und ein anderer Sender wird online gehen. Die Nennfrequenz jedes gegebenen Senders kann aufgrund von Konstruktionsproblemen irgendwo zwischen 35 und 65 KHz liegen.

Je nachdem, wie viel Leistung der Sender hat, habe ich gesehen, dass der Takt eines einzelnen ASICs im Dauerbetrieb um bis zu 2 kHz von nominal 50 kHz abweicht. Ich habe noch nie eine merkliche Frequenzverschiebung innerhalb von weniger als 20 Datenframes gemessen, aber ich habe keine tatsächliche Zahl für die Änderungsrate der Taktfrequenz ....

Geben Sie hier die Bildbeschreibung ein

Es gibt ein Startbit pro Rahmen und ein Paritätsbit und ein Stoppbit am Ende. Es können bis zu 13 aufeinanderfolgende Nullen im Rahmen vorhanden sein. Es gibt immer 4 Nullzyklen zwischen Rahmen, die von einem einzelnen ASICs-Sender kommen. Aufeinanderfolgende Frames kommen von einem einzelnen Sender, aber wie ich bereits erwähnt habe, kann der Sender periodisch ausfallen, und ein anderer kann mit einer anderen Taktfrequenz online gehen.

Was ich suche, ist eine Schaltung zur Wiederherstellung der Uhr unter Verwendung einer Kombination aus digitaler Logik und diskreten analogen Komponenten (kein Mikrocontroller!), Die sehr robust ist, sich an eine driftende Uhr anpassen und sich auf Frequenzen einrasten kann diese große Bandbreite. Außerdem würde ich gerne ein Design finden, das sich gut auf höhere Frequenzen skalieren lässt, da zukünftige ASICs einen viel schnelleren Sendetakt haben werden (ich habe bis zu 20-mal schneller gehört).

Ein FPGA wird verwendet, um den Datenstrom zu decodieren (und den zurückgewonnenen Takt zu verwenden, tatsächlich wurde dies bereits implementiert, bevor die Verfügbarkeit des Takts angenommen wurde) und kann als solcher als Teil der Taktrückgewinnungsschaltung verwendet werden, wenn dies hilfreich ist.

Entschuldigung für die Verwirrung, ich hoffe, es wurde alles geklärt.

Klingt so, als ob das eigentliche Problem die flockige Leistung ist, der der ASIC ausgesetzt ist. Eigentlich ist es überraschend, dass das einzige Ergebnis eine unterschiedliche Geschwindigkeit wäre. Wenn sich ein Oszillator so stark ändert, sollten auch viele andere Dinge schief gehen. Zeigen Sie in jedem Fall den Verlauf Ihres Signals über die Zeit an. Ohne das ist es zu schwer zu sagen, was Sie wirklich haben.
Ich habe keine Kontrolle über die Ausgabe des ASIC, das ist eine Aufgabe für jemand anderen. Ich werde jedoch daran arbeiten, ein Datenbeispiel zum Posten zu bekommen.
Ich habe einige Ideen aufgeschrieben, aber ich habe eine Frage an Sie, abgesehen von dem, was Olin gesagt hat: Müssen Sie wirklich die Uhr wiederherstellen, um das RZ-Signal zu decodieren?
Ich habe das Timer-Peripheriegerät eines Mikrocontrollers verwendet, um das Signal mithilfe einer Zustandsmaschine in Software zu decodieren. Es wird jedoch eine neue Version des ASIC entwickelt, die ein schnelleres Signal haben wird, das mit benutzerdefinierter digitaler Logik verarbeitet werden muss, also würde ich Ich möchte eine Vorstellung davon bekommen, wie man die Uhr mit einer Schaltung und nicht mit einem Algorithmus wiederherstellt.
Nun, das ist kein RZ. Sie benötigen eine PLL, um die Uhr ordnungsgemäß wiederherzustellen.
@JayKeegan Um diese neue Frage zu beantworten, muss ich wissen, welche Hardware Sie am RX-Ende verwenden können/hoffen. FPGA, Mikrocontroller, ASIC...
Einige Quellen, die ich gelesen habe, beschreiben ein solches Signal als RZ, andere zeigen ein Signal mit positiven und negativen Bits, die um 0 Volt zentriert sind. Könnten Sie erläutern, wie eine PLL verwendet wird, um die Uhr wiederherzustellen?
Der zurückgewonnene Takt und der Datenstrom ähnlich dem gezeigten werden an ein FPGA gegeben, um Berechnungen durchzuführen und die decodierten Daten auf einem parallelen Bus auszugeben.
Und noch etwas - wie schnell kann sich die Datenrate ändern? Wenn die Änderung sofort erfolgen kann, haben Sie wirklich große Probleme. Nehmen wir an, die Extreme sind 33 kHz und 66 kHz für Perioden von 33 us und 16 us. Nehmen wir nun an, Sie erhalten eine „1“ in einem Zeitraum von 16 us, gefolgt von einer 0 von 33 us und einer 1 zu einem beliebigen Zeitraum. Soweit Sie wissen, könnten die 33 us 0 2 16 us 0 sein. Wenn die Änderung der Frequenz (und Periode) augenblicklich sein kann, gibt es keine Möglichkeit zu sagen.
Die Uhr eines einzelnen Geräts variiert während des Betriebs nicht allzu sehr, ich denke, plus oder minus 2 kHz sind die Spitzenwerte. Aber ich denke, aufgrund von Herstellungs- / Designproblemen fällt die nominale Taktfrequenz eines einzelnen Sendergeräts irgendwo in diesen angegebenen Bereich. Ein einzelner Empfänger muss also in der Lage sein, sich auf Frequenzen irgendwo in diesem Bereich zu synchronisieren. Dies ist wie ein erster Versuch, einen ASIC für diese Anwendung in dem Universitätslabor zu produzieren, in dem ich assistiere.
woah woah woah, du hast geschrieben "Die größte Herausforderung besteht darin, dass die Frequenz dieses seriellen Signals mit der Zeit variiert." Das heißt nicht , dass die Geräte unterschiedlich sind, also bekomme ich unterschiedliche Frequenzen. Das Problem ist dann etwas anders. Und ich frage noch einmal: Welche Hardware erwarten Sie, um diese Uhr wiederherzustellen? Wenn ich das richtig verstehe, entwerfen Sie einen ASIC, ist das so?
Gibt es ein bekanntes Muster am Anfang eines Frames? Wenn ja, was ist es? Wie viele Nullen dürfen innerhalb eines Frames maximal hintereinander auftreten? Ihre vom Startmuster abgeleitete Uhr muss stabil und genau genug sein, um mit den maximal aufeinanderfolgenden Nullen fertig zu werden.
Kommen auch aufeinanderfolgende Frames vom selben Gerät? Beträgt der Abstand zwischen den Frames immer 4 Zeitschlitze oder ist das ein Minimum? Hat ein Frame immer die gleiche Anzahl von Bits?
Ich werde alle erforderlichen zusätzlichen Klarstellungen hinzufügen, sobald ich mit den Leuten, mit denen ich arbeite, klar bin. Ich entschuldige mich für die Verwirrung in dieser Frage, ich bin ziemlich neu auf diesem Gebiet (undergrad EE).
Tut und Vladimir Cravero, WhatRoughBeast. Ich habe die Frage bearbeitet. Ich hoffe, das verdeutlicht alles, was gefragt wurde. Ich denke, Dave Tweed hat bereits eine gute, sehr detaillierte Antwort eingereicht

Antworten (4)

Das Wiederherstellen einer Uhr aus einem intermittierenden Strom von Impulsen ist eine nicht triviale Konstruktionsübung. Ich versuche im Allgemeinen, die Taktflanke auf die Impulse zu zentrieren, dann kann die Taktflanke verwendet werden, um das Vorhandensein / Fehlen des Impulses in einem Flip-Flop zu erfassen. Eine hybride Digital/Analog-Schaltung demonstriert das Konzept deutlicher:

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Die allgemeine Idee besteht darin, ein Gatterpaar zu verwenden, um einen "Hochpump"-Impuls und einen "Herunterpump"-Impuls für jeden Eingangsimpuls zu erzeugen. Solange diese beiden Impulse die gleiche Länge haben (die Taktflanke trat genau in der Mitte des Eingangsimpulses auf), wird es keine Nettoänderung der VCO-Frequenz geben. Aber wenn der Impuls in Bezug auf den Takt ein wenig zu früh kommt (was bedeutet, dass der Takt langsam ist), wird der "Hochpump"-Impuls breiter sein als der "Herunterpump"-Impuls, wodurch die VCO-Steuerspannung erhöht wird. Das Gegenteil tritt auf, wenn der Eingangsimpuls verspätet ist, wodurch die Steuerspannung verringert wird. Der VCO sollte so konfiguriert werden, dass der Frequenzbereich, den er über den Bereich der Steuerspannung erzeugen kann, dem erwarteten Bereich der Datenraten entspricht.

Da Sie mit einem FPGA arbeiten, kann eine sehr ähnliche Sache rein im digitalen Bereich durchgeführt werden. Wir gehen davon aus, dass Sie einen Hochgeschwindigkeitstakt (z. B. 10–50 MHz) zur Verfügung haben. Wir ersetzen die Ladungspumpe durch einen binären Aufwärts-/Abwärtszähler, ersetzen den VCO durch einen DDS, und anstatt uns auf analoge Impulsbreiten zu verlassen, tasten wir die Phase des DDS an den ansteigenden und abfallenden Flanken der Eingangsimpulse ab.

Im folgenden Diagramm sind alle "schlaffen" Takteingänge mit dem internen Hochgeschwindigkeitstakt des FPGA verbunden. Alle Pins mit [] am Ende ihres Namens repräsentieren Mehrdrahtbusse.

schematisch

Simulieren Sie diese Schaltung

Die asynchrone RZ-Eingabe wird durch einen zweistufigen Synchronisierer und dann einen Flankendetektor geleitet. Die Register U3 und U4 erfassen die oberen Phasenbits des DDS (U2) jeweils an den ansteigenden und abfallenden Flanken des RZ-Impulses. Wenn wir den Phasenwert als vorzeichenbehaftete Binärzahl behandeln, erfasst die steigende Flanke einen negativen Wert, während die fallende Flanke eine positive Zahl erfasst. Wir addieren diese beiden Zahlen zusammen, und wenn wir perfekt synchron sind, heben sie sich auf und das Ergebnis ist Null. Wenn sich die Uhr jedoch verspätet, wird die negative Zahl größer und die Summe negativ. Wir nehmen daher einfach das Vorzeichenbit am Ausgang des Addierers (U5) und verwenden Gatter, um den Wert in unserem Zähler (U1) entweder zu erhöhen oder zu verringern, um die Uhr zu beschleunigen oder zu verlangsamen. Beachten Sie, dass Sie Ich möchte diesen Zähler so konfigurieren, dass er nur den interessierenden Frequenzbereich abdeckt. Mit anderen Worten, es hat sowohl einen Mindestwert als auch einen Höchstwert, über den hinaus es nicht gezählt wird.

Der "Übertrag" vom DDS ist ein einen Takt breiter (Systemtakt)-Impuls, der mit der Rate der RZ-Daten auftritt und auf die Mitten der Bits ausgerichtet ist.

Ich danke Ihnen sehr. Dies ist die Erklärungsebene, die ich zu finden gehofft hatte, da es sich, wie Sie sagten, um ein "nicht triviales" Designproblem handelte. Ich weiß es zu schätzen, dass Sie auch zwei verschiedene Methoden demonstrieren.
Gern geschehen. Ich habe viel Erfahrung mit der Generierung von Präzisionsuhren und Zeitbasen in FPGAs aus verschiedenen Arten von Referenzen.

Wenn die Uhr variieren kann und Sie sie wiederherstellen müssen, sollten Sie auf jeden Fall eine Uhrwiederherstellungsschaltung bauen.

Mit dem RZ-Signal kann das ganz einfach sein, da die Uhr, wie Sie sagen, die ganze Zeit im Signal vorhanden ist. Wenn Sie alle Einsen empfangen, empfangen Sie tatsächlich das Taktsignal ... Aber wenn eine Null empfangen wird, erhalten Sie den negierten Takt. Zunächst schlage ich einen Flankendetektor vor, das ist eine Schaltung, die jedes Mal einen Impuls ausgibt, wenn das Eingangssignal die Polarität ändert. Ein triviales Beispiel ist ein Hochpassfilter, also ein Reihenkondensator mit einem Widerstand gegen Masse. Ihre Impulse haben immer noch gemischte Polarität, aber Sie können einfach einen Vollwellengleichrichter verwenden, damit Sie bei jedem Übergang Ihres Signals einen positiven Impuls erhalten. Nun, das ist fast eine Uhr, Sie müssen es nur noch mit ein paar Flip-Flops durch zwei teilen und Sie sind fertig.

Um alle Flanken zu erkennen, können Sie auch ein XOR-Gatter verwenden: ein Eingang zum RZ-Signal, der andere zum selben Signal verzögert "ein bisschen". Wenn und nur wenn die Eingänge unterschiedlich sind, das passiert, wenn Sie einen Übergang haben, ist der Ausgang hoch. Sie müssen noch durch zwei teilen.

Ich weiß, dass ich keine praktische Lösung vorgeschlagen habe, aber ich hoffe, dass meine Eingaben Ihnen helfen können.

Es hört sich so an, als ob diese Antwort geschrieben wurde, bevor das Bild zur Frage hinzugefügt wurde. Es muss überarbeitet werden, um der Situation des OP zu entsprechen.
@DaveTweed Ich weiß, es scheint mir, dass das OP immer noch nicht geklärt hat, was er fragt, insbesondere zur Taktvariabilität. Ich werde meine Antwort überarbeiten (oder löschen), wenn die Frage endgültig ist.

Angesichts der Frequenzen, die Sie sich ansehen, würde ich vorschlagen, das Problem im digitalen Bereich zu lösen. Wenn es eine "nette" Möglichkeit gibt, zwei Impulse zu identifizieren, die einige Zeitschlitze voneinander entfernt sein sollen (z. B. soll die Lücke zwischen den Frames länger sein als jede Lücke innerhalb eines Frames und die Zeit vom Beginn eines Frames an). bis zum Beginn des nächsten sollten immer genau zwanzig Zeitschlitze sein), dann sollten Sie in der Lage sein, herauszufinden, wo die Rahmengrenzen liegen, wenn Sie Ihre eingehenden Daten mit einer Uhr abtasten, die mindestens doppelt so schnell ist wie die Datenrate. Daraus sollten Sie in der Lage sein, die Position einzelner Zeitfenster innerhalb eines Rahmens herauszufinden.

Ein großer Vorteil der Verlagerung solcher Dinge in die digitale Domäne ist, dass Daten nachträglich analysiert werden können. Wenn zum Beispiel jeder Frame zwanzig Zeitschlitze hat, der erste und der sechzehnte immer Impulse haben und es keine Lücke von vier oder mehr Zeitschlitzen ohne Impuls gibt, dann könnten Sie Hardware verwenden, um alle 15 us aufzuzeichnen, ob es einen Impuls gab oder nicht. Achten Sie auf eine Zeit ohne Pulse, die lang genug ist, um eine Lücke zwischen den Bildern zu bilden, und verfolgen Sie die letzte beobachtete Zeit dieser Art. Wenn eine Inter-Frame-Lücke (außer der ersten) beobachtet wird, speichern Sie die Anzahl der Takte zwischen ihr und der vorherigen und greifen Sie dann Daten von geeignet beabstandeten Stellen im Puffer.

Es könnte möglich sein, einen Mikrocontroller zu verwenden, um einen Großteil der Analyse durchzuführen; 50 kHz ist ein wenig schnell, aber vielleicht praktikabel, wenn der Controller über Hardwareunterstützung zum Erfassen der Daten verfügt oder nichts anderes tun muss. Die Erfolgsaussichten eines Mikrocontrollers könnten besonders gut sein, wenn z. B. immer neun Impulse pro Frame vorhanden sind (wenn die Hardware ein Byte pro Impuls mit seiner ungefähren Länge speichert, dann wenn die aktuelle Lücke und die eine neun vorige länger sind als alle dazwischen liegenden, dann bilden die dazwischenliegenden acht wahrscheinlich einen Datenrahmen, und die Taktrate sollte 1/20 ihrer Summe betragen). Die Auswahl des besten Ansatzes würde etwas mehr Wissen darüber erfordern, was der eingehende Datenstrom darstellt, welche Teile davon fest oder variabel sind, wie sauber oder nervös er sein kann usw.

Versuche dies. Angenommen, die Daten haben eine Amplitude +/- V1. Verwenden Sie zwei Komparatoren, einen auf Vl / 2, den anderen auf -Vl / 2. Invertieren Sie den zweiten und dann die beiden Signale ODER. Sie können dies mit einem halben Quad-Komparator und einem halben Quad-NOR-Gatter tun. (Dies setzt voraus, dass die Periode der Daten viel größer ist als die Laufzeit der Logik und dass das Signal-Rausch-Verhältnis der Daten angemessen hoch ist.)

Vielen Dank für Ihre Hilfe, bitte sehen Sie sich die Bearbeitung an. Ein Null-Bit wird nur als 0 Volt dargestellt, nicht als negative Spannung, die auf Null zurückkehrt.
OK. Wie Vladimir betonte, ist das nicht RZ. Für das, was Sie tun, würde ich angesichts der weiten Frequenzausschläge keine PLL empfehlen. Verwenden Sie stattdessen die Fähigkeiten des FPGA, um einen neuen Takt zu synthetisieren. Etwa so: Messen Sie mit einem Hochfrequenztakt die Periode zwischen steigenden Flanken. Da Sie die ungefähren Grenzen der Datenhäufigkeit kennen, legen Sie Ober- und Untergrenzen für das fest, was erfasst werden kann. Verwenden Sie die gemessene Periode, um die Periode einer Zählerkette einzustellen, die den neuen Takt erzeugt. Immer wenn Sie eine gültige Datenzelle erhalten, aktualisieren Sie die Taktfrequenz.
Okay, das klingt nach einem guten Ansatz. Irgendeine Idee, wie viel Varianz in der Taktfrequenz von einem PLL-Ansatz toleriert werden könnte?
Das Problem bei der Durchführung über eine PLL ist der VCO. Sie können tatsächlich einen sehr breiten Frequenzhub (wie mehrere Größenordnungen) erhalten, aber während Sie dies tun, steigt der Jitter auf der wiederhergestellten Uhr. Außerdem müssen Sie die Ladungspumpe in den Integrator modifizieren, wenn sich die Frequenz ändert, um die Schleifendämpfung gleich zu halten. In deinem Fall aber eigentlich kein Problem. Der Hauptgrund, warum ich den FPGA-Ansatz vorgeschlagen habe, ist jedoch, dass Sie bereits ein FPGA haben, sodass keine zusätzlichen Schaltkreise erforderlich sind.
In Ihrem Fall könnten Sie wahrscheinlich eine angemessene Leistung aus einem 74HC4046 mit einem AD537 VFC herausholen. Viel würde von der längsten Strecke aller Nullen oder aller Einsen abhängen, auf die Sie stoßen.