Verilog 101: Ihre ersten Hardware-Beschreibungs-Module erstellen
In diesem Artikel studieren wir die grundlegende Struktur eines Verilog-Moduls, schauen uns Beispiele für die Verwendung des Verilog-"wire"-Datentyps und seiner Vektorform an und berühren kurz einige Unterschiede zwischen VHDL und Verilog.
In diesem Artikel studieren wir die grundlegende Struktur eines Verilog-Moduls, schauen uns Beispiele für die Verwendung des Verilog-"wire"-Datentyps und seiner Vektorform an und berühren kurz einige Unterschiede zwischen VHDL und Verilog.
Verilog und VHDL sind zwei Sprachen, die häufig zur Beschreibung digitaler Schaltungen verwendet werden. AAC hat eine Serie technischer Artikel, die die grundlegenden Konzepte von VHDL diskutieren. Dieser Artikel dient als Einstiegspunkt für unsere Serie zu Verilog.
Brauche ich sowohl Verilog als auch VHDL?
Bevor wir unsere Diskussion beginnen, lassen Sie uns eine offensichtliche Frage adressieren: Brauchen wir wirklich beide dieser beiden Sprachen?
Sowohl Verilog als auch VHDL sind leistungsstarke Werkzeuge, die zum Design komplexer digitaler Schaltungen verwendet werden können. Obwohl es einige Unterschiede zwischen diesen beiden HDLs gibt, sind Sie frei, entweder eine zu meistern und zu verwenden. Ich glaube jedoch, dass Sie an einem bestimmten Punkt davon profitieren werden, zumindest ein grundlegendes Verständnis beider Sprachen zu haben. Manchmal brauchen wir als Designer einen Code-Ausschnitt, um eine Idee für die Codierung eines Projekts zu bekommen. Wir surfen stundenlang im Netz und finden schließlich, was wir brauchen, aber es ergibt keinen Sinn für uns – es ist in der HDL geschrieben, die uns völlig fremd ist. Ohne ein grundlegendes Verständnis der Sprache können wir die Techniken möglicherweise nicht vollständig verstehen.
Verilog-Evolution
Verilog wurde Anfang 1984 von Gateway Design Automation entworfen (etwa drei Jahre nachdem VHDL vom US-Verteidigungsministerium initiiert wurde). Mit der Unterstützung des DoD wurde VHDL 1987 zum IEEE-Standard. Verilog schaffte es erst 1995 in die Szene. Heute sind sowohl VHDL als auch Verilog beliebte HDLs und FPGA-Design-Tools unterstützen meist beide Sprachen.
Das Wort "Verilog" ist ein Kofferwort aus "verification" und "logic", da die Sprache zunächst als Simulations- und Verifikationswerkzeug vorgeschlagen wurde. Lassen Sie uns mit Verilog-Konzepten und -Syntax beginnen.
Beispiel 1
Als erstes Beispiel schreiben wir den Verilog-Code für die in Abbildung 1 dargestellte Schaltung.

Abbildung 1. Schaltung_1
Es gibt zwei Eingänge und einen Ausgang. Die Ports sind alle ein Bit breit. Die Funktionalität der Schaltung ist es, die beiden Eingänge zu UND-verknüpfen und das Ergebnis auf den out1-Port zu legen.
Eine mögliche Verilog-Beschreibung für das Schaltung_1-Modul ist:

Zeilen 1 und 8
Diese beiden Zeilen verwenden die Keywords "module" und "endmodule", um anzugeben, dass die dazwischenliegenden Zeilen (Zeilen 2 bis 7) alle eine Schaltung namens "Schaltung_1" beschreiben. Dieser Name ist willkürlich und erlaubt uns, später auf diese Schaltung zu verweisen.
Zeilen 2 bis 6
Diese Zeilen spezifizieren das Interface von "Schaltung_1" mit seiner Umgebung. Die Eingangs- und Ausgangsports werden mit den Keywords "input" und "output" beschrieben. Diese Keywords werden von einem weiteren Keyword "wire" gefolgt und dann dem Namen des Ports (siehe Abbildung 1). Was spezifiziert das Keyword "wire"? "Wire" ist ein Verilog-Datentyp, der einen physischen Draht im Design repräsentiert. Wir werden die Verilog-Datentypen in einem zukünftigen Artikel ausführlicher diskutieren, aber für jetzt wissen wir, dass es in unserem Modul drei Drähte namens a, b und out1 geben würde und da diese in der Portdeklaration spezifiziert sind, entsprechen sie dem Modul-Interface.
Zeile 7
Diese Zeile verwendet den bitweisen AND-Operator, also &, um die Funktionalität der Schaltung zu beschreiben. Das Keyword "assign" legt a&b auf den Ausgangsport out1. Diese Art der Zuweisung wird Continuous Assignment genannt. Sie heißt so, weil die Zuweisung immer aktiv ist, wann immer ein Operand auf der rechten Seite sich ändert, a&b evaluiert und out1 zugewiesen wird. Wir können uns ein Continuous Assignment als kombinatorische Schaltung vorstellen, deren Output kontinuierlich abhängig von seinen Inputs aktualisiert wird. In unserem Beispiel ist diese kombinatorische Schaltung ein einfaches AND-Gatter. Es gibt auch prozedurale Assignments in Verilog HDL, die in zukünftigen Artikeln diskutiert werden.
Jetzt können wir ein Softwarepaket wie Xilinx ISE verwenden, um den obigen Code zu verifizieren. Sie finden ein Verilog-basiertes Tutorial dieser Software hier (PDF).
Vergleich von Beispiel 1 mit dem VHDL-Code
Abbildung 2 unten zeigt die Verilog- und VHDL-Beschreibungen für das Schaltung_1-Modul.

Abbildung 2. Vergleich der Verilog- und VHDL-Beschreibungen für Schaltung_1.
Wie Sie sehen können, müssen wir beim Codieren in VHDL einige Bibliotheken einbinden. Diese Bibliotheken geben die Definition für die Datentypen und Operatoren. In Anbetracht der Hinzufügung dieser Bibliotheken und des allgemeinen Formats von VHDL beobachten wir, dass der VHDL-Code ausführlicher ist. Diese Ausführlichkeit ist jedoch nicht ohne Vorteile. Zum Beispiel kann das Bibliotheksmanagement-Feature von VHDL hilfreich sein, wenn höhere Systeme modelliert werden. In zukünftigen Artikeln werden wir gelegentlich die Vor- und Nachteile dieser beiden HDLs diskutieren.
Verilog hat ein Vier-Werte-System
Es gibt vier grundlegende Werte, die in den meisten Verilog-Datentypen verwendet werden. Die in Listing 1 definierten Drähte können einen der folgenden Werte annehmen:
- 0: für logic low oder eine false-Bedingung
- 1: für logic high oder true-Bedingung
- z: für den High-Impedance-Zustand (kann verwendet werden, um den Output eines Tri-State-Buffers zu beschreiben)
- x: für einen don't-care oder unbekannten Wert (wenn ein Eingang nicht initialisiert ist oder zwei oder mehr konfliktäre Outputs verbunden sind).
Der VHDL std_logic-Datentyp kann neun verschiedene Werte annehmen, aber seine häufig verwendeten Werte sind '0', '1', 'Z' und '-' ('-' bezeichnet ein don't-care).
Beispiel 2
Als weiteres Beispiel schreiben wir den Verilog-Code für die Schaltung (die wir Schaltung_2 nennen) in Abbildung 3.

Abbildung 3. Schaltung_2
Der folgende Verilog-Code beschreibt diese Schaltung:

Die im obigen Code verwendeten Elemente sind ähnlich denen in Beispiel 1, außer dass ein internes Signal in Zeile 10 des Codes definiert ist. Das Keyword "wire" wird verwendet, um den Datentyp dieser Verbindung zu spezifizieren. Wie oben diskutiert, würde der "wire"-Datentyp zu einem physischen Draht im Design übersetzt.
Der obige Code verwendet auch einige neue Verilog-bitweise Operatoren: ~ für NOT und | für OR-Operation. Ein weiterer nützlicher bitweiser Operator ist ^ für die XOR-Operation. Abbildung 4 zeigt sowohl die Verilog- als auch die VHDL-Beschreibungen für das Schaltung_2-Modul. Solche Vergleiche können Ihnen helfen, die Unterschiede und Ähnlichkeiten zwischen diesen beiden Sprachen zu sehen.

Abbildung 4. Vergleich der Verilog- und VHDL-Beschreibungen für Schaltung_2.
Beispiel 3
Für unser drittes und letztes Beispiel geben wir den Verilog-Code für das in Abbildung 5 gezeigte Schaltbild.

Abbildung 5. Schaltbild für Beispiel 3.
Wie Sie sehen können, gibt es eine bestimmte Beziehung zwischen den blauen Eingangsports und den roten: die entsprechenden Eingänge werden mit dem AND-Operator kombiniert. Das Ergebnis wird einem Ausgangsport zugewiesen. In solchen Fällen können wir die Signale gruppieren und als Vektor behandeln. Dies macht den Code kompakt und lesbar.
Mit dem Vektor-Konzept in Verilog können wir den Code in Listing 1 einfach erweitern, um die obige Schaltung zu beschreiben (siehe Code in Listing 3 unten).

Beachten Sie, dass der Indexbereich der Vektoren entweder aufsteigend ([0:2] wie oben verwendet) oder absteigend ([2:0]) sein kann. Obwohl das aufsteigende Format oben verwendet wird, ist es meistens weniger fehleranfällig, die absteigende Form zu verwenden. Dies liegt daran, dass der absteigende Stil unserer Wahrnehmung entspricht, dass die linkeste Position einer Binärzahl den höchsten Index hat. Beachten Sie, dass Vektoren auch in VHDL verwendet werden.
Abbildung 6 unten zeigt eine ISE-Simulation des Codes in Listing 3.

Abbildung 6. ISE-Simulation von Beispiel 3s Code.
In diesem Artikel diskutierten wir, dass es eine gute Idee ist, sowohl VHDL als auch Verilog zu lernen, wir studierten die grundlegende Struktur eines Verilog-Moduls und lernten den Verilog-"wire"-Datentyp und seine Vektorform kennen. Wir berührten auch kurz einige Unterschiede zwischen VHDL und Verilog. Der nächste Artikel in unserer Verilog-Serie wird das Design kombinatorischer Schaltungen in Verilog diskutieren.
Eingebettet
- Code-Ready Containers: Praktischer Leitfaden für Cloud-native Prozessautomatisierung mit Red Hat OpenShift
- Praktischer Leitfaden zu keramischem 3D-Druck: Techniken, Materialien, Design-Tipps
- TJBot starten: Bauen, konfigurieren und per Sprache steuern
- Schritt-für-Schritt: RAK 831 LoRa Gateway auf Raspberry Pi 3 deployen
- LoRa-Gateway mit RAK831-Modul auf Raspberry Pi 3 bauen – Schritt-für-Schritt-Anleitung
- Edge AI Inferencing meistern: Praktischer Leitfaden für verwertbare Erkenntnisse
- Entdecken Sie die Eagle Group: Ihr Partner für hochwertige Metallfertigung
- Cat®-Maschinen optimieren: Der ultimative My.Cat.com-Leitfaden
- Node-RED auf PLCnext mit Docker deployen: Schritt-für-Schritt-Anleitung
- Erste Go-Applikation auf PLCnext bauen: Einsteiger-Guide