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 always
Block? 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.
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.
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.
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).
Siehe diese Frage .
Nur Jeff
Leerer Stern
Joe Hass
sequential logic
ist sehr verwirrend, und es ist besser, von kombinatorischer Logik (AND, OR, NOT) oder synchroner Logik (Flip-Flops und Latches) zu sprechen.