Post on 03-Sep-2019
transcript
Tutorial Vivado/Verilog
Teil 1
Erste Schritte mit Verilog auf dem FPGA
Prof. Dr.-Ing. Michael Karagounis
Dipl.-Ing. Rolf Paulus
Tutorial Vivado/Verilog Teil 1
Seite 2 von 17
1. Motivation
Das Ziel dieses Tutorials ist es, erste praktische Erfahrungen im Umgang mit dem FPGA als
konfigurierbaren Logikbaustein zu sammeln und die Xilinx Vivado Entwicklungsumgebung im
Zusammenspiel mit der Hardwarebeschreibungssprache Verilog kennenzulernen.
Auf Grund der zunehmenden Komplexität digitaler Systeme, kann der althergebrachte Entwicklungs-
ansatz basierend auf Schaltplänen aus Logikgattern und anderen Bauteilen nur noch in äußerst seltenen
Fällen sinnvoll eingesetzt werden. Heutzutage werden digitale Schaltungen hauptsächlich mit Hilfe von
Hardwarebeschreibungssprachen (engl. Hardware Description Language HDL) entworfen. Weltweit
gesehen haben sich die Sprachen VHDL und Verilog als Standards in Industrie und Forschung
durchgesetzt. Während sich in Europa die Nutzung von VHDL etabliert hat, erfreut sich insbesondere in
den USA aber auch in Asien Verilog weiterhin großer Beliebtheit. Verilog wurde Mitte der1980ern von
der amerikanischen Firma „Gateway Design Automatio“ als erste HDL überhaupt entworfen und
vermarktet. In den 1990ern Jahren wurde die Firma von Cadence aufgekauft und die
Entwicklungswerkzeuge in den eigenen Design-Flow integriert.
Digitale Schaltungen werden hauptsächlich als integrierte Bausteine in CMOS Halbleitertechnologie
gefertigt. Hierfür werden Masken erzeugt, die bei Belichtungsschritten in lithographischen Prozessen
eingesetzt werden, um Transistorstrukturen im Halbleitermaterial zu definieren und Metallstrukturen
festzulegen, mit denen die Transistoren untereinander verdrahtet werden. Der Großteil der
Produktionskosten entfällt dabei auf die Masken für die Transistorgeometrien, während die Masken für
die Metalllagen ungleich günstiger ausfallen. Aus diesem Grund wurde bereits ziemlich früh versucht,
die Produktionskosten durch eine sogenannte Maskenprogrammierung zu senken. Bei diesem
Herstellungskonzept werden generische Masken für Transistorstrukturen gefertigt, die für möglichst
viele verschiedene Projekte wiederverwendbar sind, während die anwendungsspezifische Funktionalität
der Schaltkreise durch kundenspezifische Metallisierungsmasken erreicht wird. Als Erweiterung dieses
Konzeptes wurden in den 80er Jahren feldprogrammierbare Bausteine sogenannte FPGAs (Field
Programmable Gate Array) entwickelt, die im Feld also beim Kunden vor Ort und durch den Kunden
selbst programmiert werden können. Da bei Verwendung von FPGAs die Wartezeit für die Produktion
entfällt und der Baustein direkt programmiert werden kann, werden Entwicklungszeiten dramatisch
reduziert. Außerdem bietet die Möglichkeit zur Programmierung zusätzliche Flexibilität, die
insbesondere bei der Behebung von Entwicklungsfehlern kostengünstig genutzt werden kann.
Auf dem Weltmarkt haben sich SRAM basierte FPGA Bausteine der Fa. Xilinx und Fa. Altera durchsetzen
können. Der Vorteil von SRAM Bausteinen ist die Möglichkeit zur Reprogrammierung, da die
Speicherinhalte im SRAM jederzeit überschrieben werden können. Der Nachteil der SRAM Technologie
besteht darin, dass beim Ausschalten die Speicherinhalte verloren gehen und nach jedem Einschalten
wieder neu konfiguriert werden müssen. Hierfür werden nichtflüchtige Speicher wie z.B. Flash oder
PROM auf Systemebene vorgesehen, aus denen beim Bootvorgang die Hardwarekonfiguration geladen
wird. Während des Entwicklungsvorgans wird die Konfiguration meist direkt vom PC über ein JTAG- oder
ein USB-Kabel in den Baustein geladen.
Die Nutzung von Verilog bietet gerade im Zusammenhang mit FPGAs viel Freiraum für Kreativität und
kann interessierten Studierenden große Freude bereiten. Ich wünsche Ihnen deswegen sowohl bei der
Vorbereitung als auch bei der Durchführung des Versuchs viel Freude und viel Erfolg!
Tutorial Vivado/Verilog Teil 1
Seite 3 von 17
2. Nexys 4 Board von Digilent
Das Tutorial wird an Hand des Nexys 4 Boards durchgeführt. Das zentrale Element auf dieser Platine ist
der Xilinix FPGA Artix7 Baustein, der über c.a. 101440 konfigurierbare Logikzellen und 300 I/O Pins
verfügt. Darüber hinaus existieren auf dem Board weitere periphere Bausteine, die Ihnen nach Bedarf in
jedem Versuch zu gegebener Zeit vorgestellt werden.
Von besonderer Bedeutung für die Durchführung des Tutorials ist der Strom, der über den USB-Stecker
zugeführt wird. Dafür muss Jumper JP3 auf USB stehen. Bevor Sie den FPGA konfigurieren können,
müssen Sie zuvor sicherstellen, dass das Board über ein USB Kabel mit dem PC verbunden ist. Achten Sie
auch darauf, dass der Power-Schalter auf der Position ON steht. Wenn das Board richtig angeschlossen
ist, leuchtet eine rote LED unter dem Powerschalter.
Das Board sieht die Möglichkeiten vor, den FPGA entweder über einen Baustein mit nichtflüchtigem
Baustein auf der Platine zu programmieren, über eine SD-Card, über einen USB-Stick oder über die USB
Verbindung direkt vom PC. Im Rahmen des Praktikums wird der FPGA meist direkt vom PC über USB
konfiguriert. Die verschiedenen Programmiermodi werden über den
Jumper JP1 festgelegt.
Für die Programmierung über USB muss sich der Jumper JP1 in der Mittenposition
JTAG befinden. Bitte prüfen Sie nach, ob das der Fall ist und
entfernen Sie eventuell zusätzliche Jumper bzw. korrigieren Sie die
Jumper Position, wenn nötig.
Power
Stecker
und
Schalter
USB
Stecker
FPGA
VGA
Taster
Jumper
Programmiermodus
Kippschalter
LEDs
Hexadezimal-
anzeige
Tutorial Vivado/Verilog Teil 1
Seite 4 von 17
Im Rahmen des 1. Teils werden wir uns hauptsächlich mit den Kippschaltern, den Tastern und den LEDs
beschäftigen, die auf dem Board vorhanden sind.
3. Aufgabenstellung
Der FPGA soll so konfiguriert werden, dass es möglich ist, die LEDs auf der Platine durch die Kippschalter
und Taster ein- und auszuschalten. Sowohl die LEDs als auch die Schalter und Taster sind mit Pins des
FPGAs verbunden. Die genaue Pin-Position können Sie dem Datenplatt entnehmen, welches ebenfalls
auf die Lernplattform geladen worden ist. Ihre Aufgabe ist es, ein Verilog Modul zu schreiben, dass dafür
sorgt, dass eine LED immer nur dann von dem FPGA-Pin getrieben wird und dadurch leuchtet, wenn der
entsprechende Schalter gekippt bzw. Taster gedrückt wird. Die Zuweisung zwischen den Schaltern bzw.
Tastern und den LEDs sei dabei die folgende:
Schalter/Taster LED
SW0 LD0
SW1 LD1
SW2 LD2
SW3 LD3
BTNU LD4
BTNR LD5
BTND LD6
BTNL LD7
Für diese Aufgabe werden Sie die Webpack Vivado Design Software nutzen, die auf der Xilinx
Homepage nach einer Registrierung kostenlos zum Download bereitgestellt wird und auf den
Arbeitsplatzrechnern bereits vorinstalliert wurde. Nachdem Sie das Verilog Modul geschrieben haben,
werden Sie das Modul mit Vivado kompilieren und simulieren. Anschließend werden Sie eine
Konfigurationsdatei erstellen, aus der hervorgeht, welches Signal der Entity ihres Verilog Moduls auf
welchen FPGA-Pin gelegt werden soll. Im nächsten Schritt wird zuerst die Synthese und dann das Place
& Route angestoßen. Schließlich wird eine sogenannte Bit-Datei generiert. In dieser Bit-Datei sind alle
Informationen enthalten, die für die Programmierung des Bausteins benötigt werden. Diese Bit-Datei
wird über das USB-Kabel in den FPGA gesendet.
3.1 Generierung des Projektes und Erstellung der Verilog Datei Starten Sie die Xilinx Vivado Design Software durch Doppelklick auf das entsprechende Icon
„Vivado“ auf dem Desktop oder durch Auswahl des Menüs:
„Xilinx Design Tools“-> „Vivado“->“Vivado“
Erzeugen Sie ein neues Projekt entweder durch das Menü „File“->“New Project“ oder durch „Quick
Start“-> „Create Project“. Es öffnet sich der Wizard „Create a New Vivado Project“, der einfach nur
mit Next bestätigt wird.
Es öffnet sich ein Fenster, in dem Sie den Namen des Projektes und den Speicherort bestimmen
können. Pflegen Sie die entsprechenden Informationen ein und drücken Sie anschließend den
„Next“ Button.
Tutorial Vivado/Verilog Teil 1
Seite 6 von 17
In der nächsten Maske selektieren Sie „RTL Project” und „Do not specify sources at this time“ und
drücken den Next-Button.
Tutorial Vivado/Verilog Teil 1
Seite 7 von 17
In der nächsten Maske selektieren Sie unter „Boards“ die Option „Nexys4“, drücken Sie
anschließend den „Next“ Button.
Es erscheint eine „New Project Summary“, die Sie mit Klick auf „Finish“ bestätigen
Wählen Sie links im Flow Navigator unter „PROJECT MANAGER“ den Menü-Punkt „Add Sources“.
Es öffnet sich ein Fenster des „Add Sources Wizard“. Selektieren Sie „Add or create design sources“
als „Source Type“ und drücken Sie den Next-Button.
Drücken Sie in der nächsten Maske „Add or Create Design Sources“ den Button „Create File“. In dem
sich öffnenden Fenster „Create Source File“ wählen Sie unter „File type“ „Verilog“, unter „File
name“ den File-Namen, der auch gleichzeitig der Name des Moduls ist, und unter „File location“
„<Local to Project“. Bestätigen Sie Ihre Eingaben mit dem Button „OK“.
Tutorial Vivado/Verilog Teil 1
Seite 8 von 17
Ihre Eingaben werden in das Fenster „Add or Create Design Sources“ eingetragen. Hier jetzt den
Finish-Button drücken.
Es öffnet sich ein Fenster „Define Module“, in dem der „Module name“, welcher der gleiche wie der
File-Name ist, schon eingetragen ist. Diesen nicht ändern. Unter „I/O Port Definitions“ können Sie
die Ports des Moduls mit Namen und Richtung und auch Busse eintragen. Diese können jedoch auch
nachträglich im Editor hinzugefügt werden. Anschließend den OK-Button drücken.
Tutorial Vivado/Verilog Teil 1
Seite 9 von 17
Das Modul „teil1“ taucht jetzt im „PROJECT MANAGER“ im Fenster „Sources“ unter „Design
Sources“ auf. Gleichzeitig wurde das Modul „teil1“ in der „Project Summary“ als „Topmodule name“
eingetragen.
Tutorial Vivado/Verilog Teil 1
Seite 10 von 17
Mit einem Doppelklick auf „teil1.v“ unter „Design Sources“ im Fenster „Sources“ öffnet sich der
Editor für das File „teil1.v“.
Innerhalb des Moduls können Sie eine Zuweisung zwischen den Eingangssignalen, die von den
Schaltern und Tastern erzeugt werden, und den Ausgangssignalen, welche die LEDs treiben,
durchführen. Benutzen Sie hierfür den Zuweisungsoperator assign. Soll beispielsweise dem Signal A
das Signal B zugewiesen werden, kann der folgende Verilog Code verwendet werden: assign A=B;
3.2. Generierung einer Testbench und Simulation
Zur Simulation des Verilog Moduls werden Stimulationsdaten benötigt, mit denen die
Eingangssignale des Verilog Moduls angesteuert werden. Hierfür wird eine spezielle Datei generiert,
die man als Testbench bezeichnet. Wählen Sie wieder im „PROJECT MANAGER“ „ADD Sources“ und
selektieren Sie „Add or create simulation sources“, Next-Button. Im nächste Fenster „Add or Create
Design Sources“ „Create File“ anklicken. Nun wählen Sie wieder Verilog als File-type, einen
sinnvollen Namen für die Testbench Datei z.B. teil1_tb.v und die File-Location als Local to Project,
OK-Button. Anschließend Finish-Button. In dem sich öffnenden Fenster „Define Module“ alles so
lassen wie es ist und „OK“ drücken. Den Hinweis mit „Yes“ bestätigen. Nun gibt es im Fenster
„Sources“ weitere Einträge: Unter „Design Sources“ „teil1_tb (teil1_tb.v)“ und unter „Simulation
Sources“ einen neuen Ordner „sim_1“, der auch die beiden Dateien „teil1.v“ und „teil1_tb.v“
beinhaltet.
Tutorial Vivado/Verilog Teil 1
Seite 11 von 17
Ein Doppelklick auf „teil1_tb“ öffnet die neue Testbench-Datei im Editor. Geben Sie hier die für die
Simulation nötigen Verilog Konstrukte an. Beispielhafter Code ist auf der nächsten Seite gegeben.
Definieren Sie Signale SW und BTN vom Typ reg für die Eingabetasten und Schaltern und ein Signal
LED vom Typ wire für die LEDs.
Das Verilog-Modul „teil1“ wird als Instanz in die Testbench eingefügt werden. Die Ports der Instanz
werden hierbei mit den Signalen SW, BTN und LED der Testbench verbunden.
Innerhalb eines initial Blockes, der bei der Simulation nur ein einziges Mal durchlaufen wird, setzen
zunächst die Eingangssignale für Schalter und Buttons auf Null und dann anschließend nacheinander
auf Eins.
Wie im Beispiel gezeigt kann hierfür der Zuweisungsoperator ‚=‘ verwendet . Wenn beispielsweise
das Signal A auf eins gesetzt werden soll, kann der folgende VHDL Code verwendet werden:
A='1';
Nach jeder Signalzuweisung soll eine Wartezeit von 10 Zeiteinheiten verstreichen. Nutzen Sie hierfür
den Lattenzaunoperator in der folgenden Form: #10;
Nach der Speicherung der Testbench Datei ist jetzt der „Top module name“ in der „Project
Summary“ auf „teil1_tb“ gesetzt, und auch in den „Sources“ steht teil1_tb als Top-Modul oben und
„teil1“ darunter als Submodul.
Tutorial Vivado/Verilog Teil 1
Seite 14 von 17
Starten Sie die Simulation, indem Sie links im „PROJECT MANAGER“ auf „SIMULATION“->“Run
Simulation“->“Run Behavioral Simulation“ klicken. Wenn ihr V Modul und die Testbench frei von
Syntax Fehlern sind, öffnet sich nach einer gewissen Bearbeitungszeit der Waveform Viewer.
Überprüfen Sie durch visuelle Inspektion die Plausibilität des Simulationsergebnisses. Zoomen Sie in
der Darstellung raus, um die komplette Waveform zu sehen.
Um die Simulation zu beenden, mit der rechten Maustaste auf das blaue Feld „SIMULATION –
Behavioral Simulation – Functional – sim_1 – teil1_tb“ klicken -> „Close“ -> „OK“.
3.3. Festlegung der Pin Belegung
Für die Zuordnung der FPGA-Pins zu den Ports der Entity wird ein .xdc-File benötigt. Bei modernen
FPGAs reicht die Pinnummer alleine nicht aus, um einen Ein- bzw. Ausgang zu beschreiben. Auch die
Syntax des xdc-Files ist kompliziert. Daher gibt es vom Hersteller des Boards ein vorgefertigtes xdc-
File, das nun als Constraints-File dem Projekt hinzugeführt wird. Anschließend kann es dann editiert
werden, um die FPGA-Pins mit den Signalen der Entity zu verbinden. Dafür muss zunächst das File
„Nexys-4-Master.xdc“ mit dem „Windows Explorer“ in den Projektordner „.srcs\Sources_1\new“
kopiert werden. Nun über „Add Sources“ -> „Add or create constraints“ -> Next -> „Add Files“ das
File Nexys-4-Master.xdc auswählen und „OK“ -> „Finish“ drücken. Unter Sources findet man jetzt
das neue Constraints-File:
Tutorial Vivado/Verilog Teil 1
Seite 15 von 17
Ein Doppelklick auf “Nexys-4-Master.xdc” öffnet den Editor.
Ermitteln Sie aus der Dokumentation des FPGA Boards die Bezeichnung der Pins an denen die LEDs,
die Schalter und die Taster angeschlossen sind. Zum Beispiel lautet der Name für SW0 im xdc-File
sw[0] und hat den FPGA-Pin U9. Alle Pins sind jedoch kommentiert und werden daher momentan
nicht benutzt. Die verwendeten Pins müssen nun auskommentiert werden und die Namen
umbenannt werden. Beispiel sw(0) Original:
Auskommentiert und umgewandelt:
Dies muss nun für alle verwendeten Switches, Buttons und LEDs durchgeführt werden.
3.4. Implementierung und FPGA Konfiguration
teil1_tb.v ist immer noch als Top Level Modul angegeben. Für die Implementierung muss das nun
geändert werden, indem unter „Project Summary“ -> Top module name auf „teil1_tb“ geklickt wird.
Es öffnet sich ein Fenster „Settings“, indem der „Top module name“ auf „teil1“ geändert wird.
Tutorial Vivado/Verilog Teil 1
Seite 16 von 17
Anschließend „OK“ -> „Yes“ -> „OK“. Eventuell kommt eine gelbe Meldung „Elaborated Design is
out-of-date. Design sources were modified.” Hier dann auf „Reload” klicken.
Klicken Sie nun im „Flow Navigator“ unter „SYNTHESIS“ „Run Synthesis“ -> „OK“. Die Synthese
startet. Ganz oben rechts in der Ecke des Fensters kann man erkennen, dass die Synthese läuft. Ist
sie fertig, wird angezeigt „Synthesis Complete“ mit einem grünen Haken dahinter. Gleichzeitig öffnet
sich ein Fenster „Synthesis Completed“. Hier kann jetzt der nächste Schritt, Run Implementation,
ausgewählt und mit „OK“ gestartet werden -> „OK“.
Es öffnet sich ein Fenster „Implementation Completed“. Hier „Generate Bitstream“ auswählen ->
„OK“ -> „OK“. Es öffnet sich ein Fenster „Bitstream Generation Completed“. Nun das Board über
USB mit dem Computer verbinden und einschalten. Jetzt in dem Fenster „Bitstream Generation
Completed“ „Open Hardware Manager“ auswählen -> „OK“.
In einem grünen Balken wird angezeigt „No hardware target is open“. Hier auf „Open target“ klicken
-> „Auto Connect“. In dem grünen Balken erscheint nun „There are no debug cores“. Hier auf
„Program device“ klicken. Es öffnet sich ein Fenster „Program Device“, in dem das Bitstream-File
„teil1.bit“ schon ausgewählt ist. Hier auf Program klicken. Der FPGA wird nun programmiert.
Überprüfen Sie die Funktionalität des Boards nach erfolgreicher Programmierung, indem Sie die
Schalter und Taster auf dem Board drücken und nach den aufleuchtenden LEDs Ausschau halten.
Tutorial Vivado/Verilog Teil 1
Seite 17 von 17
4. Anhang: Aufbau einer Verilog Datei
Anders als bei VHDL wird ein Verilog Modul in einer einzigen Struktur beschrieben. Es erfolgt keine
Aufteilung zwischen Entity und Architecture.
Die Verilog Datei beginnt mit dem Schlagwort module und dem Namen des Moduls. Es schließt sich die
äußere Schnittstelle in runden Klammern an mit einer Auflistung der Ein- und Ausgangssignale. Achtung
Die Liste der Eingang- und Ausgangssignale endet mit Semikolon. Anschließend wird der Porttyp d.h.
input, output oder inout festgelegt.
Beispiel: Einfaches Verilog Modul
module or_and (a,b,c,y);
input a;
input b;
input c;
output y;
assign y <= (a | b) & c;
endmodule
Abschluss des Moduls mit dem Schlagwort endmodule
ohne Semikolon.
Liste endet mit Semikolon
Funktionale-Beschreibung des Moduls „or_and“
Der Ausgang y ergibt sich aus der Veroderung der
Signale a,b und der anschließenden Verundung mit
dem Signal c.
Schnittstellen-Beschreibung des Moduls
„or_and“ mit drei Eingängen a, b, c und
einem Ausgang y
Definition des Porttyps