FPGA Praktikum SS2000 2. Woche: Timingmodelle Synthetisierbares VHDL Aufgaben.
Tutorial Vivado/VHDL Teil 1 Erste Schritte mit VHDL auf ... · Tutorial Vivado/VHDL Teil 1 Seite 2...
Transcript of Tutorial Vivado/VHDL Teil 1 Erste Schritte mit VHDL auf ... · Tutorial Vivado/VHDL Teil 1 Seite 2...
Tutorial Vivado/VHDL
Teil 1
Erste Schritte mit VHDL auf dem FPGA
Prof. Dr.-Ing. Michael Karagounis
Dipl.-Ing. Rolf Paulus
Tutorial Vivado/VHDL 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 VHDL 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 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. Das Akronym VHDL steht für “Very High Speed Integrated Circuit Hardware Description
Language” und ist in den 80er Jahren aus einem Programm des amerikanischen
Verteidigungsministeriums entstanden.
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 VHDL 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/VHDL 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/VHDL 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 VHDL 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 VHDL 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 VHDL 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 VHDL Datei Starten Sie die Xilinx Vivado Design Software durch Doppelklick auf das entsprechende Icon
„Vivado 2017.2“ auf dem Desktop oder durch Auswahl des Menüs:
„Xilinx Design Tools“-> „Vivado 2017.2“->“Vivado 2017.2“
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/VHDL 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/VHDL 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“ „VHDL“, unter „File name“
den File-Namen, der auch gleichzeitig der Name der entity ist, und unter „File location“ „<Local to
Project“. Bestätigen Sie Ihre Eingaben mit dem Button „OK“.
Tutorial Vivado/VHDL 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 „Entity name“, der der gleiche wie der File-
Name ist, schon eingetragen ist. Diesen nicht ändern. Unter „Architecture name“ steht „Behavioral“,
den Sie jetzt ändern oder auch so lassen können. Unter „I/O Port Definitions“ können Sie die Ports
der Entity 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/VHDL Teil 1
Seite 9 von 17
Die Entity „teil1“ mit der Architecture „Behavioral“ taucht jetzt im „PROJECT MANAGER“ im Fenster
„Sources“ unter „Design Sources“ auf. Gleichzeitig wurde die Entity „teil1“ in der „Project Summary“
als „Topmodule name“ eingetragen.
Tutorial Vivado/VHDL Teil 1
Seite 10 von 17
Mit einem Doppelklick auf „teil1(Behavioral)(teil1.vhd)“ unter „Design Sources“ im Fenster
„Sources“ öffnet sich der Editor für das File „teil1.vhd“.
Innerhalb der Architecture-Definition können Sie eine Zuweisung zwischen den Eingangssignalen,
die von den Schaltern und Tastern erzeugt werden, und den Ausgangssignalen, die die LEDs treiben,
durchführen. Benutzen Sie hierfür den Zuweisungsoperator <=. Soll beispielsweise dem Signal A das
Signal B zugewiesen werden, kann der folgende VHDL Code verwendet werden: A<=B;
3.2. Generierung einer Testbench und Simulation
Zur Simulation des VHDL Moduls werden Stimulationsdaten benötigt, mit denen die Eingangssignale
des VHDL Moduls angesteuert werden. Hierfür wird eine spezielle VHDL 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 VHDL als File-type, einen sinnvollen Namen
für die Testbench Datei 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(Behavioral)(teil1_tb.vhd)“ und unter „Simulation Sources“ einen neuen Ordner
„sim_1“, der auch die beiden Dateien „teil1.vhd“ und „teil1_tb.vhd“ beinhaltet.
Tutorial Vivado/VHDL Teil 1
Seite 11 von 17
Ein Doppelklick auf „teil1_tb“ öffnet die neue Testbench-Datei im Editor..
Die Testbench hat keine Ports. Das VHDL-Modul „teil1“ muss als Component eingefügt und als
Submodul über die PORT MAP Anweisung instanziiert werden. Nach Apspeichern 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 „DUT“.
Tutorial Vivado/VHDL Teil 1
Seite 13 von 17
Setzen Sie in der Testbench-Datei innerhalb des process-Statements die Eingangssignale ihrer
VHDL-Entity nacheinander auf Eins mit Hilfe des Zuweisungsoperators <=. Wenn beispielsweise das
Signal A auf eins gesetzt werden soll, kann der folgende VHDL Code verwendet werden:
A<='1';
Tutorial Vivado/VHDL Teil 1
Seite 14 von 17
Nach jeder Signalzuweisung soll eine Wartezeit von 10 ns verstreichen. Nutzen Sie hierfür den wait-
Befehl in der folgenden Form:
wait for 10 ns;
Starten Sie die Simulation, indem Sie links im „PROJECT MANAGER“ auf „SIMULATION“->“Run
Simulation“->“Run Behavioral Simulation“ klicken. Wenn ihr VHDL 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/VHDL 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.vhd 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/VHDL 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/VHDL Teil 1
Seite 17 von 17
4. Anhang: Aufbau einer VHDL Datei
Jedes VHDL Modul wird in zwei Teilen beschrieben:
Entity:
– Die Entity beschreibt die äußere Schnittstelle eines Moduls, also die Eingangssignale
und Ausgangssignale.
Architecture:
– Die Architecture beschreibt die Funktion eines Moduls
– Für ein Modul können mehrere Architecture angelegt werden, z.B.:
• Eine nicht-synthesefähige Architecture zur Simulation
• Eine synthesefähige Architecture zur Synthese
• Eine Architecture aus Logik-Gattern, nach der Synthese
• Außerdem gibt es noch:
Package:
– Ein Package enthält Definitionen und Funktionen (ähnlich .h-Files bei C)
Beispiel: Einfaches VHDL Modul
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity or_and is
port (
a : in std_logic;
b : in std_logic;
c : in std_logic;
y : out std_logic);
end or_and;
architecture behavioural of or_and is
begin
y <= (a or b) and c;
end behavioural
Aufruf eines Package mit
Definition von Signaltypen
Entity-Beschreibung des Moduls
„OR_AND“ mit drei Eingängen A, B, C und
einem Ausgang Y
Architecture-Beschreibung des Moduls
„OR_AND“
Der Ausgang Y ergibt sich als boolesche
Gleichung aus den drei Eingängen