FB Elektrotechnik und Informationstechnik Prof. Dr.-Ing. Norbert Wehn Dozent: Uwe Wasenmüller Raum 12-213, wa@eit.uni-kl.de Versuch 4 Realisierung einer Ampelsteuerung auf einem FPGA-Board Bild 1: Zusatzleiterplatte Ampel HAUPT2 Ampel NEBEN 4 Ampel NEBEN 3 HAUPTSTRASSE Ampel HAUPT1 Bild2: Prinzipdarstellung Leiterplatte Ampel Seite 1 von 19
1. Ziel dieses Versuches In diesem Versuch werden Sie synthetisierbare VHDL-Modelle erstellen und die erforderlichen Schritte kennenlernen bis Ihr VHDL-Modell bzw. die entsprechende Schaltung auf einem Xilinx-FPGA des Laborboards untersucht werden kann. Bevor Sie Ihr VHDL-Modell synthetisieren können sind die Entwurfsschritte wie in den vorherigen Versuchen einschließlich der Verifikation mit einer Testbench durchzuführen. Nach erfolgreicher Verifikation werden Sie das Synthese-Werkzeug XST der Firma Xilinx verwenden sowie die Implementierungssoftware (Technology Mapping sowie Platzierung und Verdrahtung) der Firma Xilinx nutzen. Die erforderlichen Werkzeuge sind in der Xilinx-Entwicklungsumgebung ISE integriert. 2. Grundlagen zur Aufgabenstellung Bevor Sie das VHDL-Modell gemäß Spezifikation erstellen, studieren Sie im Skript nochmals die Seiten über die Synthese (getaktete Prozesse, endliche Automaten, Komponenten und Regeln für Synthetisierbarkeit). Machen Sie sich den Entwurfsablauf für die Implementierung einer digitalen Schaltung auf FPGA-Bausteinen nochmals klar. Vergewissern Sie sich, dass Sie das Kapitel Finite State Machines (FSM) des Skriptes vor Versuchsbeginn gelesen und verstanden haben. Weiterhin studieren Sie nochmals die Unterlagen über Automaten (ginf-8.pdf) und Schaltwerke (ginf-9.pdf) der Vorlesung Grundlagen der Informationsverarbeitung (EIT-EMS-314-V-2 bzw. 85-314). Die prinzipiell benötigten Informationen für die Werkzeuge von Xilinx sind in der hier vorliegenden Beschreibung zu finden. Weitergehende Informationen finden Sie in den Help- Funktionen der ISE Entwicklungsumgebung. Für diese Entwicklungsumgebung finden Sie ein Icon auf dem Desktop. Weiterführende Informationen zum Laborboard und zum darauf eingesetzten Xilinx-FPGA finden sie im Verzeichnis /docs Ihres Accounts auf den Laborrechnern. In diesem Verzeichnis finden Sie auch ein Dokument zum besseren Verständnis des Synthesereports (Hinweise_Synthesereport) sowie ein Dokument zur Hilfestellung beim Schreiben verständlichen VHDL Codes (Coding_Guidelines); ein Studium dieser beiden genannten Dokumente wird von Ihnen erwartet. Ein nochmaliges Studium des ModelSim Tutorials ist auch empfehlenswert. Die für diesen Versuch benötigten Funktionen der Xilinx Software ISE werden im vierten Abschnitt ausführlicher erläutert. Seite 2 von 19
3. Vorgehensweise ampel_top clk reset timer sec_puls clk reset ampel_sm led haupt1 haupt2 neben3 neben4 8 3 3 3 3 Entwerfen Sie die im Abschnitt 4 beschriebene Ampelsteuerung (ampel_sm) als FSM. Testen Sie Ihre Ampelsteuerung mit einer Testbench im Simulator ModelSim. Entwerfen Sie die im Abschnitt 4 beschriebene Einheit timer und testen Sie diese mit einer Testbench. Vervollständigen Sie die Gesamtschaltung (ampel_top) und führen Sie eine Verifikation der Gesamtschaltung durch. Mit Hilfe der Xilinx Tools synthetisieren Sie die Gesamtschaltung und führen Platzierung und Verdrahtung durch. Testen Sie Ihre implementierte Ampelschaltung durch Übertragung der Konfigurationsdaten des FPGA auf das Laborboard mit anschließender Ausführung. 4. Versuchsdurchführung Die gesamte Schaltung (ampel_top) besteht aus zwei Komponenten: einem Automaten (FSM) mit dem entity Namen ampel_sm und einer Schaltung zur Bereitstellung eines Sekundenimpulses mit dem entity Namen (timer). Sie werden nacheinander die VHDL Modelle ampel_sm, timer und ampel_top entwerfen und verifizieren. Die jeweilige entity declaration der drei genannten Schaltungsmodelle ist bereits im Versuchsverzeichnis vorhanden und darf nicht verändert werden. Die genannten VHDL Modelle müssen natürlich den Regeln für synthetisierbare VHDL Modelle entsprechen. Erst nach erfolgreicher Verifikation werden Sie die Schaltung synthetisieren sowie Platzierung und Verdrahtung durchführen. Alle erforderlichen Schritte nach der Verifikation werden mit Werkzeugen der Firma Xilinx durchgeführt und sind in späteren Abschnitten detailliert erläutert. Seite 3 von 19
Spezifikation der Ampelsteuerung (ampel_sm) Es soll eine Ampelsteuerung entworfen und auf einem externen Board getestet werden. Die Ampelsteuerung soll die in der nachfolgenden Abbildung gezeigten 8 Phasen einer Ampelanlage nacheinander anzeigen. Hierzu ist eine Modellierung einer FSM gefordert. Die gezeigten 8 Phasen der Ampel sind die möglichen Zustände der FSM. Die Ampelanlage besteht aus je 2 Ampeln für eine Hauptstraße und je 2 Ampeln für eine Nebenstraße. Die 2 Ampeln für die Hauptstraße zeigen jeweils die gleichen Leuchten. Das gleiche gilt für die 2 Ampeln der Nebenstraße. Daher sind im nachfolgenden Bild auch jeweils nur die Leuchten einer Hauptstraßen- bzw. Nebenstraßenampel dargestellt. Beachten Sie, dass für die jeweiligen Phasen auch eine Dauer in Sekunden angegeben ist. Eingänge der Schaltung sind ein Takt (clk), ein Sekundenimpulssignal (sec_puls) und ein asynchroner Reset (reset). Dieser Reset muss bei logisch 1 aktiv sein. Die Ausgänge heißen haupt1, haupt2, neben3 und neben4. Sie sind vom Typ std_logic_vector und jeweils 3 Bit breit. Liegt an einem Ausgang eine logische 1 an, bedeutet dies, dass das entsprechende Licht leuchten soll, entsprechend führt eine 0 zu einem nicht leuchtenden Licht. Die drei Bit entsprechen dabei grün/gelb/rot. Weisen Sie beispielsweise dem Signal haupt1 vom Typ std_logic_vector(2 downto 0) den Wert 001 zu, zeigt die Ampel die Rotphase an. Das FPGA wird mit 50 MHz getaktet; das ist aber für eine Ampel natürlich viel schneller als erforderlich. Daher wird durch das Signal sec_puls das Sekundenraster vorgegeben. Dieses Signal gibt im Abstand von einer Sekunde nur für die Dauer eines Taktes (also 20 ns lang) einen Impuls ( 1 ) aus. Das ermöglicht der Schaltung ampel_sm das Zählen von Sekunden. Sehen Sie hierfür einen Zähler mit geeigneter Bitbreite vor. Überlegen Sie, wie lange damit die längste Ampelphase dauern könnte. Verifizieren Sie Ihre Überlegung noch anhand der Simulation. Seite 4 von 19
Spezifikation des Timers (timer) Die oben beschriebene FSM arbeitet mit 50 MHz. Dieser Takt ist durch einen Quarz auf dem Board für das FPGA vorgegeben. Die Ampelphasen sollen jedoch im Sekundenraster definiert werden können. Es ist daher sinnvoll, ein Signal zu definieren, das der State Machine dieses Sekunden-Raster mitteilt. Dazu sollen Sie nun die Komponente timer entwickeln, die im Abstand von einer Sekunde einen Impuls von der Länge eines Taktes ausgibt. Der Eingang dieser Komponente ist der Takt des Boards (50 MHz) sowie der oben beschriebene asynchrone Reset(reset). Der Ausgang ist das Signal für den Sekundenimpuls sec_puls, welches für die Schaltung ampel_sm als Eingang dient. Eine Ampelphase soll exakt 1 Sekunde dauern, das heißt, Sie müssen aus dem Takt von 50 MHz das Signal sec_puls ableiten. Derartige Aufgaben lassen sich gut mit binären Zählern realisieren. Bedenken sie, dass binäre Zähler auch die 0 mitzählen. Implementierung der Spezifikation Implementieren Sie nun die Ampelschaltung mit der beschriebenen Funktionsweise. Dazu sind die Komponenten timer und ampel_sm notwendig. Es ist jeweils im Verzeichnis src ein VHDL-Code vorgegeben, in dem die Entity bereits spezifiziert ist. Ändern Sie die Namen nicht, diese müssen später mit den Vorgaben im User-Constraint- File (ucf-file) übereinstimmen, sonst funktioniert die Implementierung auf dem Board nicht. Erstellen Sie dann die Gesamtschaltung ampel_top bestehend aus diesen beiden Komponenten. Auch dafür finden Sie einen vorgegebenen VHDL-Quellcode, der entsprechend zu vervollständigen ist. Weiterhin sind auf dem Laborboard 8 LED vorhanden. Diese können beispielsweise für Fehlersuche verwendet werden. Bitte nutzen Sie diese LED Anzeigen, um ihre Gruppennummer binär codiert anzugeben. Kompilieren Sie jeweils die entsprechenden VHDL-Codes. Wenn das Kompilieren ohne Fehlermeldung erfolgt, kann mit der Simulation - wie im nachfolgenden Kapitel beschrieben - begonnen werden. Testen der Schaltung Simulieren Sie die Komponenten timer und ampel_sm jeweils für sich. Es ist viel zeitaufwändiger einen Fehler in der Gesamtschaltung zu finden als in den Einzelkomponenten. Schreiben Sie also jeweils eine einfache Testbench für beide Komponenten. Bei einem Takt von 50 MHz erhält die Schaltung ampel_sm jeweils nach 50 Millionen Takten einmal den Sekundenimpuls. In der Simulation dauert das aber sehr lange. Sie können die Taktfrequenz auch kleiner als 50 MHz machen. Überlegen Sie was in Ihrer Testbench zu ändern ist, damit die Sekundenimpulse immer noch einen Abstand von 1 Sekunde haben. Seite 5 von 19
Simulieren Sie dann, wenn Sie mit den Einzelergebnissen zufrieden sind, die Gesamtschaltung ampel_top. Sie sollten dabei die Auswirkung des reset sowie den zeitlichen Ablauf von mindestens einem kompletten Ampelzyklus (besser von zwei Ampelzyklen) simulieren. Schreiben Sie auch hier eine Testbench. Worin liegt das Problem bei der Simulation dieser Gesamtschaltung? Könnte man mit einem Trick bei der Komponente timer (siehe Hinweis zur Simulation von ampel_sm) die Simulation der Gesamtschaltung beschleunigen? Fahren Sie mit der nachfolgenden Implementierung des Designs erst fort, wenn alle Simulationsergebnisse zufriedenstellend sind. Die nachfolgenden Schritte werden in der Entwicklungsumgebung der Firma XILINX (ISE, Version 14) ausgeführt. Ein Projekt anlegen Starten Sie das Programm Xilinx ISE 14, dessen Icon auf dem Desktop abgelegt ist. Beachten Sie dabei, dass es auch eine ältere Version dieses Programmes auf dem Desktop gibt, die für unsere Zwecke nicht mehr verwendet werden kann. Das von uns verwendete FPGA wird dort noch nicht unterstützt. Wählen Sie in der ISE den Befehl File >> New Project. Geben Sie im folgenden Dialog einen Projektnamen und den Speicherort an. Der Speicherort muss sich auf dem Laufwerk Z: befinden (z.b. Z:\V5). Top-Level Source Type ist HDL. Es wird auf der Festplatte ein Verzeichnis mit diesem Namen angelegt, in dem alle später erzeugten Dateien zu finden sein werden. Seite 6 von 19
Bestätigen Sie mit Next. Seite 7 von 19
Ändern Sie in dem erscheinenden Fenster die Eigenschaften exakt wie nachfolgend dargestellt: In der neuen ISE-Version können Sie direkt das Evaluation Development Board auswählen. Dadurch werden Baustein und Gehäuse automatisch korrekt eingestellt. Diese Felder sind dann grau hinterlegt und nicht zusätzlich änderbar. Alternativ müsste man die nächsten 5 Felder mit den oben dargestellten Werten auswählen. Wählen Sie zusätzlich bei Simulator den im Labor verwendeten Modelsim-SE aus. Die ISE-Entwicklungsumgebung von XILINX enthält auch einen eigenen Simulator (ISIM), der aber nicht so leistungsfähig ist wie der Modelsim. Die Angaben bezüglich des Bausteins (Spartan 3AN, XC3S700AN, FGG484) müssen korrekt sein, sonst funktioniert die Schaltung später nicht. Bestätigen Sie dieses Fenster mit Next und das darauffolgende Fenster Project Summary mit Finish. Ihr Projekt ist nun erstellt. Sie sehen jetzt im Fenster den Project Navigator mit einem (noch) leeren Projekt. Seite 8 von 19
VHDL-Dateien einem Projekt hinzufügen Um dem Projekt VHDL-Dateien hinzuzufügen, gehen Sie wie folgt vor: - Klicken Sie im Menü: Project >> Add Source - Wählen Sie im Verzeichnis src wie oben dargestellt die zuvor von Ihnen erstellten VHDL-Quelldateien aus. Zusätzlich muss das so genannte ucf-file (user-constraint-file) ausgewählt werden, das von uns vorgegeben wurde. Dort stehen Anweisungen für das Layout wie z.b. die Position der IOs des FPGAs. Sie können diese Datei mit einem Texteditor anschauen, wenn Sie möchten. Seite 9 von 19
Die Namen der Signale der Entity in ampel_top.vhd müssen mit den im ucf- File angegebenen Namen übereinstimmen, sonst wird das Übersetzen mit Fehlermeldungen abgebrochen. Ohne das ucf-file wird Ihre Schaltung später auf dem Board nicht funktionieren. Es besteht sogar die Gefahr eines Hardwaredefektes, etwa wenn Ausgänge des FPGAs mit Ausgängen anderer Bausteine kollidieren und dadurch Kurzschlüsse entstehen. - Bestätigen Sie nach korrekter Auswahl der Dateien die Eingabe mit OK. Wurde eine Datei vergessen, kann diese nach der beschriebenen Vorgehensweise nachträglich hinzugefügt werden. Das nachfolgende Bild zeigt die ISE nachdem das Projekt komplett angelegt wurde, und bevor irgendeine Aktion gestartet wurde. Seite 10 von 19
Damit ist das Projekt nun vollständig angelegt und alle für uns notwendigen Angaben sind gemacht. Wir können nun mit der Implementierung beginnen. Das Programm ISE von Xilinx hat, wie Sie im oberen Teil des Fensters sehen können, die Hierarchie des Designs automatisch erkannt. Solange dort der Toplevel des Designs angewählt ist, können Sie im zweiten Teil des Fensters (Processes) alle notwendigen Schritte zum Erstellen des physikalischen Layouts (Synthese, Translate, Mappen, Place & Route) und zum Programmieren des FPGAs (Generate Programming File, Configure Target Device) sehen und durch Doppelklicken ausführen. Prinzipiell kann man mit einem Doppelklick auf Generate Programming File den ganzen Prozess automatisch ablaufen lassen. Oft werden dabei in dem einen oder anderen Schritt Fehler auftreten. Deshalb ist es sinnvoll, eine Vorstellung von den Aufgaben der einzelnen Programmteile zu haben. Fast alle Programmteile haben in Ihrem Kontextmenü einen Eintrag Properties, mit dem sich ihr Verhalten konfigurieren lässt. Seite 11 von 19
Im folgenden Fenster wurde alles bis Generate Programming File ausgeführt. Aktionen mit grünem Haken wurden problemlos ausgeführt, mit dem gelben Ausrufezeichen waren erfolgreich, es traten aber Warnungen auf. Synthesize Wählt man im Hierarchy die Toplevel-VHDL-Entity aus, so zeigt der Processes View zahlreiche Aktionen an. Die Synthese übernimmt die Übersetzung des VHDL Modells in eine Netzliste. Die Synthese eines VHDL-Modells unterliegt gewissen Einschränkungen im Sprachumfang und Modellierungsstil (siehe Skript). Es muss also damit gerechnet werden, dass bei der Synthese Fehlermeldungen in Konstrukten auftreten, die vom Simulator als korrekt akzeptiert wurden. Die Synthese gibt einen Bericht auf der Konsole aus, der sich auch später noch betrachten lässt (siehe nächste Seite). Wichtig sind dabei natürlich zunächst die Fehlermeldungen und Warnungen. Insbesondere die Warnungen über unvollständige Sensitivitätslisten sollten ernst genommen werden. Bei der Synthese werden die Sensitivitätslisten oftmals als vollständig angenommen, bei der Simulation stets entsprechend der Spezifikation. Dadurch kann es zu Abweichungen zwischen der simulierten und der implementierten Schaltung kommen. Darüber hinaus listet der Synthesis Report auf, welche Schaltungselemente für die Realisierung des VHDL-Modells verwendet wurden. Dies sollte auf Plausibilität Seite 12 von 19
geprüft werden. Weiterhin kann das Ergebnis der Synthese mit View RTL- Schematic als Schaltplan angezeigt werden. Will man später noch Reports zu den einzelnen Aktivitäten ansehen, geschieht das in den rechten Fenstern der ISE. Vorhandene Reports werden schwarz dargestellt, grau hinterlegte Reports sind (noch) nicht verfügbar. Die entsprechenden Aktionen wurden bisher nicht ausgeführt. Im Fenster oben links wird der gewünschte Report ausgewählt (hier Synthesis Report). Im Fenster unten links kann wie in einem Inhaltsverzeichnis zu bestimmten Kapiteln gesprungen werden (hier: HDL Compilation). Rechts ist das entsprechende Textfenster, in dem beliebig gescrollt werden kann. Suchen Sie damit die unten abgefragten Informationen im Synthese Report. Weitere generelle Hinweise zum Synthesereport finden sich im Verzeichnis /doc. Seite 13 von 19
Synthesesergebnisse: Bitte geben Sie untenstehend bei der Synthese erkannten Register (mit Anzahl der FlipFlops) und arithmetischen Einheiten (z.b. Zähler, Addierer, Vergleicher) mit Bitbreiten sowie die zugehörigen Signale an. Weiterhin geben Sie untenstehend die bei der Synthese erkannten FSM-Einheiten mit Angabe des Signals für den Zustand an. Geben Sie die Gesamtzahl der benötigten LUTs und FFs an. Geben Sie die maximal erreichbare Taktfrequenz an. Register: Arithmetische Einheiten FSM #LUTs: #FF: Max. Taktfrequenz: Seite 14 von 19
Implement Design: Translate Erst mit der Implementierung beginnt die Anpassung an die FPGA Technologie. Der erste Schritt Translate führt im Wesentlichen nur eine Konvertierung verschiedener Dateiformate durch und muss in diesem Versuch nicht weiter beachtet werden. Dieser Schritt kann wichtig sein, wenn mehrere Schaltungsteile, die in verschiedenen Formaten beschrieben sind (z.b. Netzliste und VHDL) zusammengeführt werden müssen (siehe Versuch 6). Map Dieser Schritt nimmt die eigentliche Technologieanpassung vor. Dabei wird die von der Synthese erzeugte abstrakte RTL-Netzliste mit den auf dem FPGA verfügbaren Elementen realisiert. Der dabei erstellte Map-Report enthält zahlreiche nützliche Informationen. Zum Beispiel kann man dem Abschnitt Design Summary entnehmen, wie viele LUTs und Flip-Flops benötigt werden. Place & Route Dies ist der aufwändigste Teil der Implementierung. Die Software versucht dabei, eine optimale Anordnung der Schaltungsteile im FPGA zu finden und diese dann mit den vorhandenen Ressourcen zu verdrahten. Bei den erzeugten Reports ist unbedingt der Pad-Report zu kontrollieren, ob die Einstellungen der IO-Pins korrekt sind. Es wird eine Datei designname.pad erzeugt, die schlecht lesbar ist. Es gibt weiter eine designname_pad.txt die so formatiert ist, dass sie mit einem Texteditor gut lesbar ist. Verwenden Sie diese Datei. In Ihr müssen alle Signale die in der Entity vorkommen in der Spalte Signal Name aufgeführt sein und in der Spalte Constraint als LOCATED markiert sein. Fehlt dieser Eintrag wurde die Pin- Location vom System automatisch vergeben und ist in unserem Fall falsch. Der Post Place & Route Static Timing Report informiert unter anderem, mit welcher Taktfrequenz die Schaltung höchstens betrieben werden kann. Überprüfen Sie, ob die Schaltung mit den vorgegebenen 50MHz funktioniert. Lassen Sie sich mit View/Edit Routed Design (FPGA Editor) das Layout der Schaltung im FPGA grafisch anzeigen. Nachdem man etwas hineingezoomt hat, sieht man die einzelnen Slices. Durch Doppelklick auf ein Slice kann man sich die Konfiguration des Slices anzeigen lassen. Der FPGA-Editor steht im kostenlosen WebPack nicht zur Verfügung. Seite 15 von 19
Generate Programming File Als letzter Schritt wird die generierte FPGA-Konfiguration so formatiert, wie sie im Konfigurationsspeicher des FPGAs vorliegen muss. Das Ergebnis nennt sich dann Konfigurationsbitstream oder kurz Bitstream und wird in Dateien mit der Endung *.bit gespeichert. Für diesen Versuch können dafür die Standardeinstellungen verwendet werden. Im Allgemeinen muss bei der Bitstreamgenerierung angegeben werden, wie sich der FPGA während und kurz nach der Konfiguration verhält. Nach fehlerfreiem Verlauf der oben beschriebenen Punkte kann das FPGA jetzt mit der Funktion unserer Ampel programmiert werden. Dazu verwenden wir das Programm impact wie nachfolgend beschrieben. Seite 16 von 19
Für die nachfolgenden Schritte muss das XILINX-Entwicklungsboard mit einem USB-Kabel an Ihrem Rechner angeschlossen und eingeschaltet sein! Das ist mit Xterminals nicht möglich! Starten Sie das Programm impact (Doppelklick oder rechte Maustaste -> Run). Nun wird die Programmierungskette eingestellt und die zu verwendenden Bitstreams ausgewählt. Doppelklicken Sie Boundary Scan und danach File -> Initialize Chain. Seite 17 von 19
(Wurde kein Baustein erkannt, haben Sie vielleicht vergessen das Board über USB- Kabel am Computer anzuschließen oder einzuschalten) Sie werden jetzt automatisch nach den Dateien gefragt, die für die Programmierung verwendet werden sollen. Bestätigen Sie mit Yes und weisen Sie dem FPGA das zuvor erzeugte Bitfile für die Ampel zu: Seite 18 von 19
Für den zweiten Baustein (xcf04s) geben Sie Bypass an. Er wird also nicht programmiert. Das nachfolgende Fenster Device Programming Properties bestätigen Sie einfach mit OK. Jetzt sollte das Fenster wie folgt aussehen: Führen Sie jetzt Program FPGA Only aus und nicht den ersten Punkt Flash und FPGA, damit würde die Standardkonfiguration zum Testen des Boards nach Einschalten gelöscht! Nach einer Änderung des VHDL-Codes ist die Generierung eines neuen Bitstreams beginnend mit der Synthese und der erneute Download auf das Board zwingend. Der Reset liegt auf dem Schiebeschalter rechts (SW0) und ist in der oberen Position (logic 1) aktiv. Bei aktivem Reset sollten alle Ampeln Rot anzeigen (fail save). Seite 19 von 19