17
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 Erste Schritte mit Verilog ... · Tutorial Vivado/Verilog Teil 1 Seite 8 von 17 Ihre Eingaben werden in das Fenster „Add or reate Design Sources“

  • Upload
    others

  • View
    30

  • Download
    0

Embed Size (px)

Citation preview

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 5 von 17

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 12 von 17

Tutorial Vivado/Verilog Teil 1

Seite 13 von 17

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