Verwenden beider Flanken einer Uhr

Ich programmiere einen Altera Cyclone IV mit Verilog und Quartus II. In meinem Design möchte ich beide Flanken einer Uhr verwenden, damit ich die Uhr durch einen ungeraden Faktor mit einem Arbeitszyklus von 50 % teilen kann. Hier ist ein Ausschnitt meines Codes:

  always @(posedge low_jitter_clock_i or negedge low_jitter_clock_i or posedge reset_i) begin
    if(reset_i) begin
      fixed_clock <= 1'b0;
      divider_dummy <= 'b0;
    end else begin
      fixed_clock <= fixed_clock_next;
      divider_dummy <= divider_dummy_next;
    end
  end

Wenn ich das jetzt kompiliere, wirft Quartus II den folgenden Fehler:

Verilog HDL Always Construct-Fehler bei adc_clocking.v(83): Die Ereignissteuerung kann nicht auf positive und negative Flanken der Variablen „low_jitter_clock_i“ testen

Wie kann ich sowohl die positive als auch die negative Flanke einer bestimmten Uhr in meinem Design verwenden?

Antworten (4)

Wenn Sie einem Register in einem flankensensitiven Always-Block zuweisen, definieren Sie ein Flip-Flop. FPGAs haben keine Flip-Flops, die an beiden Flanken eines Takts triggern können.

Um das zu tun, was Sie wollen, müssen Sie zwei separate Always-Blöcke haben, einen für jede Flanke der Uhr, und dann einen Weg finden, die Ausgänge der beiden Blöcke zu kombinieren, ohne Störungen zu erzeugen.

Beispielsweise könnte ein Always-Block Ihren programmierbaren Teiler enthalten. Entwerfen Sie es so, dass das Ausgangs-Tastverhältnis weniger als 50 % beträgt, wenn eine ungerade Zahl angegeben wird. Verwenden Sie den zweiten Always-Block (auf der anderen Taktflanke), um die Ausgabe des ersten Blocks um 1/2 Takt zu verzögern, und verknüpfen Sie dann die beiden Ausgaben mit ODER. Deaktivieren Sie die Ausgabe des zweiten Blocks für gerade Teilerwerte.

Der Grund, warum ich sowohl positive als auch negative Flanken der Uhr verwenden möchte, ist ein Tastverhältnis von 50 %.
Ja, das habe ich. Meine Antwort geht direkt darauf ein. Ich bin davon ausgegangen, dass Sie bereits wissen, wie man ein Tastverhältnis von 50 % erhält, wenn der Teilerwert gerade ist. Was ist nicht klar?
Keine Dual-Edge-Flip-Flops? Dafür gibt es keinen eigentlichen Grund. Es stellt sich nur heraus, dass niemand sie herstellt (oder zumindest niemand, den wir kennen). Wie Martin betont, gibt es ein CPLD, das Dual-Edge-Flipflops unterstützt: xilinx.com/products/silicon-devices/cpld/coolrunner-ii/…

Wenn dies für interne Logik ist, müssen Sie wahrscheinlich viel näher an den verfügbaren Flipflops schreiben. Außer Coolrunner-II ist mir keine programmierbare Logik mit von Natur aus zweiflankigen Registern bekannt.

Daher müssen Sie zwei alwaysBlöcke erstellen, einen für das Negedge und einen für das Posedge, und ihre Ausgänge mit etwas kombinatorischer Logik kombinieren.

Oder verwenden Sie eine PLL, um den Takt zu verdoppeln, und dann können Sie herkömmliche Single-Edge-Logik verwenden.

Am Ende habe ich mit der hier beschriebenen Methode ein Tastverhältnis von 50% für ungerade Teilungsfaktoren implementiert .

Wie Dave Tweed anmerkt, ist es, sofern ein FPGA keine Flip-Flop-Hardware enthält, die an beiden Flanken eines Taktgebers arbeiten kann, erforderlich, Ihre eigene Logik zu schreiben, um das gewünschte Verhalten mit herkömmlichen Single-Edge-Flip-Flops zu implementieren. Während es eine Reihe verschiedener Möglichkeiten gibt, eine Schaltung zu implementieren, die sich ähnlich wie ein Doppelflanken-Flip-Flop verhält, fügen solche Schaltungen im Allgemeinen einige Zeitbeschränkungen hinzu, die sich von denen unterscheiden, die mit Flip-Flops verbunden sind.

Ein einfacher Ansatz besteht beispielsweise darin, ein Modul zu haben, das zwei XORs mit 2 Eingängen und ein Paar "T"-Flipflops kombiniert (wobei der Zustand des Eingangs beim Eintreffen eines Taktimpulses angibt, ob diese Taktflanke den Ausgang umschalten soll), eins ausgelöst durch eine steigende Flanke und eine ausgelöst durch eine fallende Flanke. Der Ausgang des Moduls ist das xor der Ausgänge der Flipflops, und der Eingang beider Flipflops ist das xor des Ausgangs und des Eingangs des Moduls.

Eine auf diese Weise entworfene Schaltung arbeitet im Wesentlichen wie ein Doppelflanken-Flipflop, allerdings mit längeren Aufbau- und Ausbreitungszeiten, aber mit einer zusätzlichen zeitlichen Einschränkung. Ein normales Flip-Flop, das sich nicht auf einem Rückkopplungspfad befindet, hat nichts dagegen, wenn der Beginn einer Taktflanke eine Reihe von Runt-Impulsen aufweist, vorausgesetzt, dass sich der Takt auf einem gültigen Pegel stabilisiert und vorausgesetzt, dass die Einrichtungszeitbeschränkung, gemessen von vor dem ersten Runt-Impuls und die Haltezeit- und Takt-Aktivzeit-Beschränkungen, gemessen von der Zeit, zu der der Taktimpuls stabil aktiv ist, erfüllt sind. Das Verhalten des Flip-Flop-Ausgangs ist während der Zeit, in der die Uhr instabil ist, undefiniert, wird jedoch definiert, nachdem sich die Uhr stabilisiert hat. Das Double-Xor-Double-Flop-Modul würde die zusätzliche zeitliche Einschränkung hinzufügen, dass jede Taktflanke, die den Ausgang ändern würde, einen sicheren Abstand von jeder anderen Taktflanke haben muss, die dies tun könnte. Wird diese Einschränkung nicht erfüllt, z. B. durch drei sehr dicht aufeinanderfolgende Taktflanken, während die Eingabe nicht mit der Ausgabe übereinstimmt, kann die Ausgabe in einem unbestimmten oder metastabilen Zustand verbleiben (beachten Sie, dass Szenarien mit einer geraden Anzahl von Flanken kein Problem darstellen , da solche Szenarien nichts als Runt-Impulse beinhalten würden; der Fall mit drei Flanken (oder andere Fälle mit ungerader Zahl größer als eins) sind ein Problem, da es einen gültigen Impuls geben würde, der den Runt-Impulsen folgt.

Ein alternatives Schaltungsdesign wäre, die beiden Flip-Flops wie oben zu haben, aber ihre Ausgänge in einen Multiplexer einzuspeisen. Diese Schaltung würde durch Runt-Impulse nicht in einen schlechten Zustand versetzt, und ihre Taktbeschränkungen wären die gleichen wie die zugrunde liegenden Latches, aber sie hätte den Nachteil, dass ein Ausgang, der hoch ist und bleiben sollte (oder niedrig war und niedrig bleiben sollte). ) könnte also kurzzeitig an einer Taktflanke glitchen. In manchen Schaltungen wäre das egal, in anderen schon.

Es wäre wahrscheinlich für Logiksynthesewerkzeuge möglich, Double-Edge-Flip-Flops automatisch zu implementieren, indem analysiert wird, welche Zeitbeschränkungen als wichtig angegeben wurden, aber dies wäre etwas schwierig. Es würde auch das Risiko erhöhen, dass eine kleine Änderung an einem Design eine große Änderung in der Implementierung und somit eine signifikante und unerwartete Verhaltensänderung bewirken könnte.