Frage:
Help wollte erklären, welche Signale mit einer höheren Frequenz als die Uhr kommen und wie man damit umgeht
user8459
2012-04-25 07:37:01 UTC
view on stackexchange narkive permalink

Ich bekomme Verilog- und FPGA-Programmierung in die Hände. Also habe ich ein einfaches Modul geschrieben, das zwei Eingänge verarbeitet - ein Tastensignal und eine Uhr. Zu Beginn leuchten zwei LEDs auf, und wenn der Benutzer die Taste drückt und loslässt, werden diese beiden ausgeschaltet und zwei weitere aufleuchten. Hier ist mein bisheriger Code (Kritik ist sehr willkommen):

  `Zeitskala 1ns / 1psmodule led_flip_flop (Eingangsleitung clk, Eingangsleitungstaste, Ausgangsleitung [3: 0] led); Parameter state_on_idle = 3'b000; Parameter state_on_push = 3'b001; Parameter state_on_pop = 3'b010; Parameter state_off_idle = 3'b011; Parameter state_off_push = 3'b100; Parameter state_off_pop = 3'b101; reg led_sig; reg [2: 0] state; reg [2: 0] next_state; Anfangsbeginn led_sig = 1'b1; state = state_on_idle; next_state = state_on_idle; end always @ (posedge clk) begin // Taktsynchronisierte Rückkopplungsschleife für Zustandsänderungen. // Es ist noch kein Reset implementiert. state < = next_state; Ende // Taste drücken / loslassen & führte Ein / Aus-Flip FSM. immer @ (Status oder Schaltfläche) case (Status) state_on_idle: // LED leuchtet, Schaltfläche war unberührt. // Wenn die Taste jetzt gedrückt wird, // zum nächsten Zustand wechseln, um auf die Freigabe zu warten. begin led_sig = 1'b1; next_state = button? state_on_push: state_on_idle; end state_on_push: // LED leuchtet, Taste wurde gedrückt. // Wenn die Taste jetzt losgelassen wird, // in den nächsten Zustand wechseln, // der die LED ausschaltet und bei ausgeschalteten LEDs in den Leerlauf geht. begin led_sig = 1'b1; next_state = button? state_on_push: state_on_pop; end state_on_pop: begin // LED war an, Taste wurde gedrückt und losgelassen. // LED ausschalten, in den Ruhezustand wechseln. led_sig = 1'b0;
next_state = state_off_idle; end state_off_idle: begin // IDLE state bei ausgeschalteten LEDs. Knopf war unberührt. // Wenn die Taste gedrückt wird, // gehe zum nächsten Zustand, // der auf die Tastenfreigabe wartet, um // die LEDs einzuschalten. led_sig = 1'b0; next_state = button? state_off_push: state_off_idle; end state_off_push: begin // LEDs sind aus. Taste wurde gedrückt. Warten Sie, bis die Taste // losgelassen wird, um die LED (s) zu aktivieren. led_sig = 1'b0; next_state = button? state_off_push: state_off_pop; end state_off_pop: begin // LEDs waren aus, Schaltfläche angeklickt. Aktivieren Sie LED (s) und // gehen Sie mit Fernlicht in den Ruhezustand. led_sig = 1'b1; next_state = state_on_idle; end default: // Ein Foobar-Status ... Wiederherstellen. begin led_sig = 1'b1; next_state = state_on_idle; end endcase zuweisen led [0] = led_sig; zuweisen led [1] = ~ led_sig; zuweisen led [2] = led_sig; zuweisen led [3] = ~ led_sig; Endmodul  

Es wurde für das Spartan-6 LX9 FPGA synthetisiert. Hier sind die Schaltpläne:

Xilinx ISE generated schematics

Ich habe es manuell auf einem realen Gerät getestet und es scheint zu funktionieren. Also habe ich heute die Prüfstandsimulation geübt und den folgenden Prüfstand geschrieben:

  `Zeitskala 1ns / 1psmodule test_bench (); reg clk; reg button; Draht [3: 0] LED; led_flip_flop prog (clk, button, led); Anfangsbeginn # 20000 $ Ende; end initial begin clk = 0; für immer # 5 clk = ~ clk; Ende Anfang Anfangstaste = 0; für immer # ({$ random}% 11) button = ~ button; Endendmodul  

Bevor ich eine feste Verzögerung für die Anweisung button = ~ button hatte, sahen die Signale in der Simulation gut aus. Mit der zufälligen Verzögerung scheint es jedoch so zu sein, als könnten Tastendruck- und Entriegelungssignale zwischen die Taktblitze gelangen, und daher sehen die Signale folgendermaßen aus:

waves

Einige Wellen, die aussehen schlecht für mich rot markiert.

Soweit ich weiß, gibt es ein Problem, wenn das Signal von der Taste kurz ist und zwischen den Taktzyklen eingeht. Natürlich kann es nur Chuck Norris im wirklichen Leben schaffen, einen Knopf schnell genug zu drücken und loszulassen, um zwischen einer 66-MHz-Uhr zu gelangen, die die Flanken anhebt.

Dies warf jedoch einige Fragen in meinem Kopf auf. P. >

  1. Wenn externe Signale mit einer höheren Frequenz als der Taktfrequenz kommen (oder wenn die Verarbeitung eines Signals mehrere Taktzyklen dauert), welche generischen Ansätze gibt es, um solche Signale zu verarbeiten?
  2. Sollte der Takt immer dabei sein? Kann ich zum Beispiel dasselbe erreichen, ohne überhaupt eine Uhr zu verwenden?
  3. Wird dies als "Überqueren einer Uhrdomäne" bezeichnet?
  4. ol>

    Oder mache ich das vielleicht? etwas völlig falsch und albern?

    Jede Hilfe wird geschätzt. Vielen Dank!

Es wird normalerweise als schlechte Praxis angesehen, Drähte zu verwenden, um Ihren Ausgang zu speisen. In der Regel wird dies als schlecht angesehen.
Drei antworten:
The Photon
2012-04-25 10:05:16 UTC
view on stackexchange narkive permalink

Wenn externe Signale mit einer höheren Frequenz als der Taktfrequenz kommen (oder wenn die Verarbeitung eines Signals mehrere Taktzyklen dauert), welche generischen Ansätze gibt es, um solche Signale zu verarbeiten?

Wenn Sie all diese Ereignisse erkennen müssen, benötigen Sie eine schnellere Uhr. Möglicherweise können Sie einen extra schnellen Takt verwenden, um das Eingangssignal in ein Schieberegister einzuspeisen, und dann den langsameren Takt verwenden, um mehrere Abtastwerte des Eingangs auszulesen und parallel zu verarbeiten.

Wenn Sie extra sind Clever können Sie sich wahrscheinlich eine Möglichkeit vorstellen, mithilfe von Handshake-Signalen usw. eine taktlose Logik zu erstellen oder den Eingang mit dem Taktstift eines Zählers zu verbinden, um die Anzahl der Eingangsereignisse zu zählen. Diese Art von Logik funktioniert jedoch nicht gut mit FPGA-Designtools.

Sollte die Uhr immer beteiligt sein? Kann ich zum Beispiel dasselbe erreichen, ohne die Uhr zu verwenden?

In einem Fall, in dem Sie nicht alle eingehenden Ereignisse sehen müssen, aber wissen müssen, ob eines oder Seit der letzten Taktflanke sind weitere Ereignisse aufgetreten. Sie können beispielsweise versuchen, das eingehende Signal mit dem (asynchronen) Set- oder Reset-Eingang eines Flip-Flops zu verbinden oder zurückzusetzen. Verwenden Sie dann ein anderes Signal, um das Flip-Flop wieder in den Standardzustand zu versetzen, nachdem Sie die Änderung in Ihrer anderen Logik festgestellt haben.

Wird dies als "Überqueren einer Taktdomäne" bezeichnet?

"Crossing a clock domain" deckt Fälle ab, in denen Signale, die synchron mit einem Takt erzeugt werden, von einer Logik gelesen werden müssen, die von einem anderen Takt gesteuert wird. In diesem Fall ist Ihre Eingabe vollständig asynchron und hat überhaupt keine steuernde Uhr. Ich denke also nicht, dass dies nur ein Beispiel ist, aber es ist ein sehr ähnliches Problem.

Tony Stewart Sunnyskyguy EE75
2012-04-25 08:05:34 UTC
view on stackexchange narkive permalink
Der

-Tastenübergang hat viele Bounces. Daher wird ein "Switch De-Bounce" -Latch oder Filter benötigt.

Vielen Dank. Das wusste ich nicht über Knöpfe! Verdammter Strom, der alles vermasselt! Ich habe hier eine nette Erklärung mit einigen Codebeispielen nachgeschlagen - http://www.fpga4fun.com/Debouncer.html
Tatsächlich ist ein Sprung von <0,5 ms außergewöhnlich. Wir haben uns früher mit einem Sprung von 10 ms befasst. Vielen Dank an die Mechaniker.
Einverstanden 10ms Debounce wird allgemein von dem akzeptiert, was ich gesehen habe. Vergessen Sie nicht, dass Ihr Schalter heute zwar nur 4 oder 5 ms lang springt, aber mit zunehmendem Alter möglicherweise viel länger springt. Abhängig von den Fertigungstoleranzen können verschiedene Schalter unterschiedlich stark abprallen.
ajs410
2012-04-26 04:08:14 UTC
view on stackexchange narkive permalink

Wenn externe Signale mit einer höheren Frequenz als der Taktfrequenz kommen (oder wenn die Verarbeitung eines Signals mehrere Taktzyklen dauert), welche generischen Ansätze gibt es, um solche Signale zu verarbeiten?

Ein Ansatz besteht darin, eine schnellere Uhr zu verwenden. Die meisten FPGAs (einschließlich Ihres Spartan 6) verfügen über eine dedizierte Logik zum Generieren verschiedener Takte aus einem Quellentakt. Xilinx hat sie in der Vergangenheit DCM (Digital Clock Managers) genannt, obwohl ich denke, dass Spartan 6 eine tatsächliche PLL und DCM-ähnliche Blöcke hat (kann heutzutage als etwas anderes bezeichnet werden).

Diese sind nett. Sie können einen 12-MHz-Quarz auf Ihre Leiterplatte legen, um die Emissionen zu minimieren, und dann können Sie im FPGA den Takt auf z. 96 MHz (eine Multiplikation von 8x)

Sie können auch versuchen, die Taktlogik an der fallenden und der ansteigenden Flanke zu takten. Dies würde Ihnen das effektive Erscheinungsbild eines 2x-Takts (auch als DDR bezeichnet) geben, aber Ihre Logik wird kompliziert, da Sie das Design zwischen Logik mit fallender und steigender Flanke aufteilen müssen.

DCMs können auch Takte erzeugen das sind 90, 180 oder 270 Grad phasenverschoben zur eingehenden Uhr. Wenn Sie also wirklich ein Signal schneller abtasten müssen, als das FPGA verarbeiten kann, können Sie den 90-Grad-Takt verwenden und denselben DDR-Trick ausführen. Dies würde Ihnen vier Möglichkeiten geben, ein eingehendes Signal mit dem schnellstmöglichen FPGA-Takt abzutasten. Dies wird jedoch erneut kompliziert, da Sie jetzt die Logik zwischen zwei Sätzen steigender und fallender Flanken aushandeln.

.

Sollte die Uhr immer beteiligt sein? Kann ich zum Beispiel dasselbe erreichen, ohne überhaupt eine Uhr zu verwenden?

Sie könnten der reinen kombinatorischen Logik eine Chance geben. Aber im Allgemeinen ist es ein zeitlicher Albtraum. FPGAs haben ein Meer von Flip-Flops und sind sehr wichtig, um einen zeitlichen Abschluss zu erreichen. Es ist wirklich die beste Vorgehensweise, alles zu stempeln, was Sie sich leisten können, um zu stempeln. FPGA-IOBs (die Eingangs- / Ausgangspuffer, die Signale an die Außenwelt senden oder empfangen) verfügen über integrierte Flip-Flops, um das Erreichen des Timing-Abschlusses zu vereinfachen.

Ich bin mir nicht einmal sicher, wie Sie es tun Dies würde ohne Taktung geschehen.

.

Wird dies als "Überqueren einer Uhrdomäne" bezeichnet?

Fast. Das Überqueren einer Taktdomäne erfolgt, wie oben erwähnt, wenn Ausgang und Eingang keinen gemeinsamen Takt haben. Der Grund dafür ist, dass diese Uhren normalerweise asynchron sind. Als Ingenieur sollten Sie immer berücksichtigen, dass sich asynchrone E / A zum ungünstigsten Zeitpunkt nicht ändern können.

Tasteneingaben sind asynchron, sodass sie unter denselben Problemen leiden wie das Überqueren von Taktdomänen . Das Problem mit einem asynchronen Signal besteht darin, dass Flip-Flops Parameter haben, die als Setup- und Haltezeiten bekannt sind. Die Einrichtungszeit gibt an, wie lange das Signal vor der Taktflanke stabil sein muss. Die Haltezeit gibt an, wie lange das Signal nach der Taktflanke stabil sein muss. Wenn Sie eine Setup- oder Hold-Verletzung haben, kann das Flip-Flop metastabil werden. Dies bedeutet, dass Sie keine Ahnung haben, wie die Ausgabe aussehen wird. Bei der nächsten Taktflanke fixiert es sich in der Regel von selbst. (Flip-Flops können auch metastabil werden, wenn während der Taktflanke eine Spannung zwischen Vih und Vil angelegt wird, aber das ist im FPGA kein Problem.) Ich glaube, ich habe auch einmal irgendwo gelesen, dass die Haltezeit in FPGAs normalerweise als solche angesehen wird 0, und der Hauptgrund dafür, dass Sie keinen Timing-Abschluss erhalten, ist eine unzureichende Einrichtungszeit.

Um asynchrone Eingaben zu verarbeiten, verwenden wir Synchronisierer. Im Wesentlichen setzen wir mehrere Flip-Flops zwischen den asynchronen Eingang und die Logik, mit der er verbunden ist. Wenn das erste Flip-Flop metastabil wird, wird es das zweite Flip-Flop nicht vermasseln ... hoffentlich. Es kann zwar immer noch, aber die mittlere Zeit zwischen Ausfällen kann Jahre betragen. Wenn dies nicht ausreicht, setzen Sie noch mehr Flip-Flops ein, um die MTBF auf akzeptable Werte zu reduzieren.

In Bezug auf "Crossing Clock Domains" benötigen Sie den Synchronizer nur dann, wenn Ihre Uhren asynchron zueinander sind . Einer der Vorteile des DCM besteht darin, dass es mehrere perfekt synchronisierte Taktfrequenzen erzeugen kann. Wenn Sie also eine "große" Berechnung haben, deren Abschluss lange dauert, können Sie einen 12-MHz-Takt verwenden, während der 96-MHz-Takt die Eingänge abtastet. Da beide vom DCM stammen, stimmt jede 12-MHz-Flanke perfekt mit einer 96-MHz-Flanke überein, sodass kein Synchronisierer verwendet werden muss.

BEARBEITEN: Antwort auf Kommentar

Uhren können mein Flip-Flop also nicht asynchron passieren, offensichtlich, weil es immer nur ein Signal geben kann (reine Physik). Die Synchronisation wird also benötigt, um einen Takt zu handhaben, der zwischen den anderen Taktzyklen "tickt". Wenn dies korrekt ist, was passiert, wenn meine Logik (kombinierte Gate-Verzögerung) größer als der Eingangstakt ist? Werde ich lautlos verschraubt, "verschwindet" das Signal auf dem Weg durch die Tore oder geht der Eingangstakt verloren?

Ich werde etwas wählerisch in Bezug auf das Sprache hier, weil es manchmal wichtig ist, Unterscheidungen zu treffen. Die Uhren sind zueinander asynchron, aber jedes Flip-Flop ist mit seiner eigenen Uhr synchronisiert. Das asynchrone Signal ist die Ausgabe der Uhr in einer Domäne und die Eingabe einer Uhr in der anderen Domäne

Angenommen, Sie haben zwei Kristalle mit 48 MHz auf einer Platine. Sie sind nicht beide genau 48 MHz. Wenn Sie also zwei Serien-Flip-Flops mit den beiden Kristallen und einem Wechselrichter am Ende takten, um sie bei jedem Zyklus umzuschalten, wird das erste Flip-Flop schließlich ein Signal ausgeben, das die Rüstzeit des Eingangs des zweiten Flip-Flops relativ zu verletzt die Uhr des zweiten Flip-Flops; Aber bis zur Uhr des ersten Flip-Flops läuft alles nach Plan. Die zweite Uhr wird für einen Zyklus fehlerhaft sein; es kann hoch gehen, es kann niedrig gehen, es kann irgendwo dazwischen gehen, es kann anfangen, in eine Richtung zu gehen und dann nach der Hälfte des Taktzyklus abrupt zu einer anderen wechseln usw. Nach dem nächsten zweiten Takt wird es wahrscheinlich seine Eingabe korrekt abtasten und aktualisieren Sie seine Ausgabe ... wahrscheinlich. Aus diesem Grund setzen sie für eine wirklich hohe Zuverlässigkeit mehr Flip-Flops in den Synchronizer ein, denn dann haben Sie wahrscheinlich * wahrscheinlich * wahrscheinlich = alles andere als sicher.

Das ist für ein Beispiel etwas erfunden, aber es ist leicht zu sehen, wie Diese Uhren würden einen periodischen metastabilen Vorfall haben, der eine Funktion des Unterschieds in den Kristallgeschwindigkeiten ist. Bei Dingen wie Schaltflächen geschieht dies grundsätzlich völlig zufällig. Dies ist auch der Grund, warum einige Protokolle irgendwie ihre eigene Uhr tragen (z. B. RS232, USB hat implizite Uhr in den Daten; I2C, SPI haben explizite Taktverfolgung), um das Überqueren von Taktdomänen zu vermeiden.

.

Wenn Ihr Design synthetisiert / abgebildet / platziert / geroutet wird, geben die Tools die maximale Laufzeitverzögerung für jede Logik an, die ein Flip-Flop in Ihrem Design berührt. Wenn Sie diese Frequenz überschreiten, haben Sie gegen die Regeln verstoßen und das FPGA ist nicht verantwortlich. Tatsächlich möchten Sie im Allgemeinen etwas langsamer fahren. Was Sie also tun, ist den Designtools mitzuteilen (für Xilinx wird eine Einschränkungsdatei verwendet): "Wenn Sie Ort und Route ausführen, versuchen Sie, alles höchstens 19 ns voneinander entfernt zu halten" (~ 52 MHz), dann verwenden Sie tatsächlich eine 48 MHz-Kristall (20,8 ns), was 1,8 ns Durchhang (ca. 9%) ergibt.

Wenn Sie Ihr Design mit der gewünschten Geschwindigkeit routen lassen, wird dies als "Erreichen des Timing-Abschlusses" bezeichnet. Bei komplexeren Designs müssen Sie überlegen, wo zusätzliche Flip-Flops platziert werden müssen, um den Prozess zu leiten und die Taktrate zu erhöhen. Der Pentium 4 ist ein extremes Beispiel; Die Pipeline-Stufen 5 und 20 existierten nur, um zu ermöglichen, dass sich Signale über den Chip ausbreiten und die Taktrate sehr hoch wird. Da das FPGA über ein DCM verfügt, kann das DCM, wenn Sie ein sehr großes Stück Logik in einer Stufe (z. B. einen sehr großen Decoder oder Mux) takten müssen, einen "langsamen Logik" -Takt ausführen, um diesen Teil zu handhaben, und dann habe eine "schnelle Logik" Uhr für die anderen Teile. Dies hilft auch beim Stromverbrauch für jede Phase, die mit dem langsamen Logiktakt ausgeführt wird.

Für reine kombinatorische Logik geben die Tools die maximale Verzögerung von Pad zu Pad an. Das heißt, wie viel Zeit ein Signal benötigt, um vom Eingangsfeld durch die gesamte Logik und zurück zum Ausgangsfeld zu gelangen. Das Problem mit einer solchen Logik ist, dass sie kein Konzept der Vergangenheit hat. Es kann sich nicht erinnern, ob das Licht an oder aus war. Sie könnten wahrscheinlich Ihre eigenen Feedback-Elemente entwerfen (z. B. SR-Latch), vielleicht sogar die Set / Resets der integrierten Flip-Flops verwenden, aber an diesem Punkt beginnen Sie, sequentielle Logik zu werden, also können Sie genauso gut den Sprung wagen und Holen Sie sich alles zuverlässig getaktet.

Das ist ausführlich, vielen Dank! Ich habe noch eine dumme Frage, wenn ich darf. Uhren können mein Flip-Flop also nicht asynchron passieren, offensichtlich, weil es immer nur ein Signal geben kann (reine Physik). Die Synchronisation wird also benötigt, um einen Takt zu handhaben, der zwischen den anderen Taktzyklen "tickt". Wenn dies korrekt ist, was passiert, wenn meine Logik (kombinierte Gate-Verzögerung) größer als der Eingangstakt ist? Werde ich lautlos geschraubt, "verschwindet" das Signal auf dem Weg durch die Tore oder geht der Tick des Eingangstakts verloren? Mir ist nicht klar, was "Timing-Albtraum" genau bedeutet. Danke!
Ich habe meine Antwort mit einer Antwort auf Ihren Kommentar bearbeitet, da sie nicht in einen Kommentar passt.


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...