Verwirrung um Takte in FPGAs / Verilog

Ich habe gerade ein FPGA gekauft und lerne Verilog, aber ich bin auf einige Verwirrungen gestoßen, die meisten davon in Bezug auf die Uhr.

Meine erste Frage ist, wie funktioniert sequentielle Logik? Werden die Zuweisungen vorgenommen, eine pro Taktzyklus, oder breitet sich die Sequenzierung irgendwie mit maximaler Geschwindigkeit aus, die durch Gate-Verzögerungen bestimmt wird?

Meine zweite Frage ist, wie funktionieren Frequenzmultiplikatoren? Ich habe einen Artikel gesehen, der einen verwendet, um ein 250-MHz-Signal auf einem Chip zu erhalten, der mit nur 50 MHz getaktet ist. Wie ist das möglich? Wenn der Chip in der Lage ist, mit so höheren Frequenzen zu arbeiten (ich würde vermuten, dass er nur durch Gate-Verzögerungen begrenzt ist), warum wird der Chip dann nicht einfach mit einer höheren Frequenz getaktet?

Wie funktioniert die kombinatorische Logik in einem alwaysBlock? Ich dachte, dass Always-Blöcke bei Ereignissen wie positiven oder negativen Signalflanken ausgeführt werden und nacheinander ausgeführt werden, daher bin ich in diesem Punkt ziemlich verwirrt, da ich Blocking-Zuweisungen in Always-Blöcken gesehen habe.

Denken Sie immer daran, wenn Sie mit Verilog oder VHDL arbeiten, dass Sie eine Beschreibung der Hardware in etwas bereitstellen, das wie Code aussieht, und nicht wirklich codiert. alles passiert gleichzeitig, es sei denn, Sie bemühen sich, die Dinge sequenziell zu machen. Was die Taktmultiplikation betrifft, wird eine Suche nach Phasenregelkreisen (PLLs) aufschlussreich sein.
Ich denke, das Problem ist, dass ich die Natur der Hardware-Beschreibungssprachen zu sehr im Hinterkopf habe. Ich hatte erwartet, dass alles Module aus kombinatorischer Logik baut und von dort aus arbeitet (oder von oben nach unten, aber letztendlich bis zur Logikebene). Ich war sehr überrascht zu sehen, dass Verilog sequentielle Elemente enthält, also versuche ich immer noch, mein Gehirn darum zu wickeln und herauszufinden, wie es diese sequentielle Logik synthetisiert. Und ja, diese Suche war sehr aufschlussreich.
Sie müssen mit Ihrer Sprache in der Frage vorsichtiger sein. Verilog- Anweisungen können sequentiell ausgewertet (nicht ausgeführt) werden, aber in Kombinationslogik synthetisiert werden. Der Begriff sequential logicist sehr verwirrend, und es ist besser, von kombinatorischer Logik (AND, OR, NOT) oder synchroner Logik (Flip-Flops und Latches) zu sprechen.

Antworten (2)

Werfen Sie zunächst dieses Konzept von „Anweisungen“ weg. Sie existieren nicht in Verilog. Nichts wird ausgeführt. Verilog, VHDL, SystemVerilog usw. sind sogenannte Hardwarebeschreibungssprachen. Sie werden nicht hingerichtet. Sie werden nicht interpretiert. Sie definieren Hardwarekomponenten (Logikgatter, Flipflops, Register usw.) und ihre Verbindungen. (Ich nehme an, nicht ganz genau, aber das einzige Verilog, das Sie auf ein FPGA setzen können – synthetisierbares Verilog – wird nicht ausgeführt oder interpretiert. Prüfstände sind ein anderes Tier.)

Takte werden verwendet, um Flip-Flops und Register anzusteuern. Daten können an den Flanken des Takts in Flip-Flops und Register verschoben werden. Innerhalb eines Always @(posedge clk)-Blocks werden also alle Anweisungen gleichzeitig „ausgeführt“ und die Ergebnisse werden gemäß den Regeln zur Interpretation der HDL-Anweisungen an der Taktflanke in den Registern zwischengespeichert. Seien Sie jedoch sehr vorsichtig, wenn Sie = und <= verwenden. Die Bedeutung dieser beiden Zuweisungsoperationen ist innerhalb eines Always-Blocks sehr unterschiedlich. Die Grundidee ist, dass alle = Operationen zuerst in der Reihenfolge ihres Auftretens behandelt werden. Dies geschieht mit der Ausbreitungsgeschwindigkeit der Tore. Dann werden alle <= gleichzeitig behandelt und das Argument in einem Register gespeichert. Das einzige, was die Uhr in diesem Fall beeinflusst, ist genau, wann die Register aktualisiert werden.

Schnellere Takte können mit einem Gerät namens Phased Lock Loop (PLL) erzeugt werden. PLLs können in Verilog nicht synthetisiert werden, aber im Allgemeinen gibt es eine Möglichkeit, eine dedizierte PLL-Komponente auf dem von Ihnen verwendeten FPGA zu instanziieren. Eigentlich nehme ich das zurück, man kann sicherlich eine digitale PLL in Verilog machen, aber man kann damit nur Signale erzeugen, die niedriger als die Taktfrequenz sind. Eine PLL enthält einen spannungsgesteuerten Oszillator, einen oder mehrere Frequenzteiler, einen Phasenkomparator und einige Steuerschaltungen. Der Ausgang des VCO wird heruntergeteilt und mit der Eingangsfrequenz phasenverglichen. Die VCO-Steuerspannung wird angepasst, bis der heruntergeteilte VCO-Ausgang genau mit der Frequenz und Phase des Referenzsignals übereinstimmt. Wenn Sie den Teiler auf 5 stellen und 50 MHz als Referenzfrequenz verwenden, die PLL erzeugt ein 250-MHz-Signal, das genau mit der 50-MHz-Referenz phasenverriegelt ist. Dafür gibt es mehrere Gründe. Die Verwendung einer PLL ermöglicht die Erzeugung mehrerer Takte, sodass unterschiedliche Logik mit unterschiedlichen Geschwindigkeiten ausgeführt werden kann, z. B. für bestimmte Peripherieschnittstellen oder für langsame, komplexe kombinatorische Logik. Es kann dem Gerät auch ermöglichen, seine eigene Taktfrequenz zu steuern, um Energie zu sparen.

Blockierende Anweisungen innerhalb von Always-Blöcken erzeugen kombinatorische Logik. Auch diese Logik wird im Allgemeinen unabhängig von der Uhr immer "ausgeführt", da sie tatsächliche Logikgatter definiert. Es kann vorteilhaft sein, ein paar temporäre Variablen zu verwenden, aber es muss darauf geachtet werden, dass nicht so viel zusätzliche Logik vorhanden ist, dass die Timing-Anforderungen nicht erfüllt werden.

Eine letzte Klarstellung. Ist es sinnvoll, einen Always-Block zum Blockieren von Zuweisungen zu verwenden, wenn es keine Bedingung im Always gibt? Könnten nicht die gleichen Ziele mit Zuweisen erreicht werden, da die Zuweisungen immer dieselben wären?
Es wird dasselbe tun. Wenn Sie es in denselben Block einfügen, wird der Code jedoch leichter lesbar. Sie müssen nicht nach der Assign-Anweisung suchen, um zu sehen, was die Logik ist.
  1. Beides ist möglich und wird normalerweise als asynchrone versus synchrone Logik bezeichnet. Vielleicht möchten Sie sich damit etwas eingehender befassen, zumal Sie zumindest verschiedene Synchronschemata (z. B. Trigger auf Pegel oder Flanke) beschreiben können. Maximale Zuverlässigkeit wird oft mit Flanken-Triggerung erreicht, wegen Rennbedingungen mit Level-Triggerung. Daher ist FPGAa dafür optimiert.

  2. Verwendung einer PLL. Die meisten Designs verwenden mehrere Takte, und die Grenze ergibt sich aus der Art der Schaltung, die Sie synthetisieren. Für richtige flankengetriggerte synchrone Designs berechnet der Synthesizer es möglicherweise bereits für Sie (und für alles andere müssen Sie möglicherweise lernen, Warnungen oder Fehler manuell zu unterdrücken, weil er dazu nicht in der Lage ist).

  3. Siehe diese Frage .

Das beantwortet meine erste Frage nicht zu meiner Zufriedenheit. Mir ist immer noch unklar, ob sequentielle Anweisungen einmal pro Taktzyklus ausgeführt werden oder nicht.
Ich habe Ihre Frage möglicherweise als sequentielle Logik missverstanden. Meinten Sie aufeinanderfolgende Aufgaben? Und um die Missverständnisse meiner eigenen Anfänger zu vermeiden, verwenden Sie <= oder = ?
Ich war mir über das Verhalten beider nicht sicher, aber die obige Antwort erklärt es gut.