Tutorial als PDF - CES
Tutorial als PDF - CES
Tutorial als PDF - CES
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Einführung in Werkzeuge zum Entwurf digitaler<br />
Schaltungen<br />
24. November 2008
Inhaltsverzeichnis<br />
1 Einführung 3<br />
1.1 Das XILINX-Werkzeug . . . . . . . . . . . . . . . . . . . . . . 3<br />
1.1.1 Schaltplan . . . . . . . . . . . . . . . . . . . . . . . . . 4<br />
1.1.2 Simulation . . . . . . . . . . . . . . . . . . . . . . . . 4<br />
1.1.3 Synthese . . . . . . . . . . . . . . . . . . . . . . . . . . 4<br />
1.2 FPGA-Entwurfsumgebung . . . . . . . . . . . . . . . . . . . . 4<br />
1.3 Entwurfsablauf . . . . . . . . . . . . . . . . . . . . . . . . . . 5<br />
1.4 Entwurfsbeispiel . . . . . . . . . . . . . . . . . . . . . . . . . 5<br />
1.5 Betriebssystemumgebung . . . . . . . . . . . . . . . . . . . . 7<br />
2 Strukturbeschreibung 9<br />
2.1 Neues Projekt . . . . . . . . . . . . . . . . . . . . . . . . . . . 9<br />
2.2 Schaltplan erstellen . . . . . . . . . . . . . . . . . . . . . . . . 10<br />
2.3 Symbole erstellen . . . . . . . . . . . . . . . . . . . . . . . . . 12<br />
2.4 Symbole einfügen . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />
2.5 Verdrahten . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18<br />
3 Verhaltensbeschreibung 23<br />
4 Synthese 26<br />
5 Simulation 27<br />
5.1 Erstellen der Testbench . . . . . . . . . . . . . . . . . . . . . 27<br />
5.2 Verhaltenssimulation . . . . . . . . . . . . . . . . . . . . . . . 29<br />
5.3 Post-Route Simulation . . . . . . . . . . . . . . . . . . . . . . 30<br />
6 Praxistest 32<br />
6.1 Symbol TUTORIAL . . . . . . . . . . . . . . . . . . . . . . . 33<br />
6.2 Schaltplan ENVIRONMENT . . . . . . . . . . . . . . . . . . 33<br />
6.3 Symbole USB INTERFACE und LED INTERFACE . . . . . 34<br />
6.4 Platzieren und Verdrahten . . . . . . . . . . . . . . . . . . . . 35<br />
6.5 Randbedingungen und FPGA-Konfiguration . . . . . . . . . . 35<br />
6.6 Generieren des Programming Files . . . . . . . . . . . . . . . 36<br />
6.7 Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37<br />
1
7 Anhang 40<br />
7.1 VHDL-Code für GGT . . . . . . . . . . . . . . . . . . . . . . 40<br />
7.2 VHDL-Code für COMPARATOR . . . . . . . . . . . . . . . . 42<br />
7.3 VHDL-Code für LED INTERFACE . . . . . . . . . . . . . . 43<br />
7.4 VHDL-Code für USB INTERFACE . . . . . . . . . . . . . . 44<br />
7.5 Pinzuordnung . . . . . . . . . . . . . . . . . . . . . . . . . . . 45<br />
2
Kapitel 1<br />
Einführung<br />
Ziel dieses Praktikums ist es, einen Einblick in den Entwurf hoch integrierter<br />
Schaltungen (VLSI = Very Large Scale Integration) zu gewinnen. Im Rahmen<br />
des Praktikums werden dazu Schaltungen entworfen, getestet und synthetisiert.<br />
Der Schwerpunkt des Hardwareentwurfes liegt auf der so genannten High-<br />
Level-Synthese. Darunter versteht man das (weitgehend) automatische Erzeugen<br />
der Gatterbeschreibung ausgehend von einer algorithmischen Verhaltensbeschreibung.<br />
Den hardwarenäheren Teil dieser Aufgabe - die sogenannte Low-Level-Synthese<br />
- überlassen wir automatischen Verfahren, die von den verwendeten Entwurfswerkzeugen<br />
angeboten werden. Sie erzeugen die vollständige Layoutbeschreibung der zu<br />
entwickelnden Schaltung. Diese Beschreibung kann direkt zur Fertigung der<br />
Schaltung verwendet werden. Da aber für die vollkundenspezifische Fertigung<br />
von Schaltungen sehr komplexe und teure Technologieprozesse benötigt werden,<br />
ist die Erstellung eines solchen Chips im Rahmen des Praktikums leider<br />
nicht möglich. Auch in der Industrie werden oft für das Prototyping der<br />
zu entwerfenden Schaltungen FPGA-Bausteine (Field Programmable Gate<br />
Array) eingesetzt. Die FPGA-Technologie ermöglicht eine sehr schnelle und<br />
billige Fertigung einer Schaltung und wird heute nicht nur für Prototyping<br />
verwendet. In diesem Praktikum werden bei der Schaltungsimplementierung<br />
die FPGA-Bausteine und die entsprechenden Entwurfswerkzeuge der Firma<br />
Xilinx benutzt. Neben dem Entwurf der Hardware wird später auch noch<br />
der Entwurf von Software Gegenstand des Praktikums sein.<br />
1.1 Das XILINX-Werkzeug<br />
Sämtliche Schaltungen dieses Praktikums werden im Projektmanager von<br />
XILINX ISE (Integrated Synthesis Environment) erstellt. ISE stellt eine<br />
komplette Entwicklungsumgebung zur Verfügung.<br />
3
1.1.1 Schaltplan<br />
Für den grafischen Entwurf wird der Schematic Editor von Xilinx benutzt.<br />
Dieser Editor erlaubt es hierachisch strukturierte, vernetzte Schaltungen zu<br />
entwerfen und daraus VHDL-Beschreibungen zu generieren.<br />
1.1.2 Simulation<br />
Zur Simulation von VHDL und anderen Beschreibungssparchen wird der<br />
ISE-Simulator verwendet. Zusätzlich zur Verhaltens- oder Sturkturbeschreibung<br />
können Dateien im ”Standard-Delay-Format” hinzugezogen werden, die Informationen<br />
über die Verzögerungszeiten der Gatter beinhalten.<br />
1.1.3 Synthese<br />
Eine der Hauptaufgaben des Xilinx ISE ist die Erzeugung einer FPGA-<br />
Implementierung aus einer VHDL-Beschreibung. Die Transformation besteht<br />
aus mehreren Schritten, die innerhalb des Xilinx-Werkzeuges ausgeführt<br />
werden:<br />
Analyse Syntaktische und semantische Analyse des VHDL-Quelltextes.<br />
Synthese Übersetzung der (algorithmischen) Verhaltensbeschreibung auf<br />
Register-Transfer-Ebene.<br />
Abbildung (Mapping) Auflösen der Schaltungshierarchie und Aufteilung<br />
der Schaltungslogik auf spezifische Komponenten des FPGA-Bausteins<br />
(CLB, IOB, etc.).<br />
Platzierung (Place and Route) Platzieren der durch das Abbilden bestimmten<br />
Komponenten auf bestimmte Positionen auf dem Chip (Placement)<br />
und Verdrahtung der FPGA-Komponenten wie gefordert (Routing).<br />
Post-Synthese-Simulation Erzeugung einer VHDL-Gatterebenenbeschreibung<br />
mit Verzögerungszeiten, um eine zeitbehaftete Simulation<br />
zu ermöglichen.<br />
Konfiguration Erzeugen einer FPGA-Konfiguration, mit der ein<br />
Xilinx FPGA geladen, d.h. konfiguriert werden kann.<br />
1.2 FPGA-Entwurfsumgebung<br />
Für das Praktikum Entwurf eingebetter Systeme wird die FPGA-Lösung<br />
X2SUSB der Firma Cesys verwendet. Dabei handelt es sich um eine Platine,<br />
die mit einem Xilinx Spartan II FPGA bestückt ist. Zur Kommunikation mit<br />
dem Rechner steht eine USB 1.1 Schnittstelle zur Verfügung. Es gibt zur<br />
Erzeugung von Taktsignalen einen Taktgenerator und zur Kommunikation<br />
4
mit dem FPGA selbst einen Erweiterungs-Stecker mit 96 Pins, die direkt an<br />
den FPGA angeschlossen sind. Für dieses <strong>Tutorial</strong> wird an den Erweiterungsstecker<br />
eine sogenannte Indikatorplatine gesteckt, die mittels LEDs angelegte Werte<br />
anzeigt. Im Anhang dieser <strong>Tutorial</strong>s findet sich das Datenblatt der Platine.<br />
1.3 Entwurfsablauf<br />
Die Funktion der einzelnen Werkzeuge soll anhand des Entwurfs eines einfachen<br />
Beispiels erläutert werden. Das Beispiel ist dabei so gewählt, dass möglichst<br />
alle im Praktikum benötigten Funktionen angesprochen werden.<br />
Abbildung 1.1 zeigt den allgemeinen Entwurfsablauf: Ausgangspunkt eines<br />
Schaltungsentwurfes ist eine verbal formulierte Aufgabe. Der erste Entwurfsschritt<br />
besteht in der Entwicklung der Struktur der zu erzeugenden Schaltung. Die<br />
zur Lösung der Entwurfsaufgabe benötigten Module müssen in die Schaltung<br />
eingefügt und miteinander verbunden werden. Danach sind die verwendeten<br />
Module durch ihre jeweilige Verhaltensbeschreibung zu definieren.<br />
Anschließend kann für die hierarchische Schaltungsbeschreibung durch Simulation<br />
überprüft werden, ob das Verhalten der entworfenen Struktur der gegebenen<br />
Aufgabe entspricht (ISE-Simulator). Ist dies nicht der Fall, müssen entweder<br />
die Verhaltensbeschreibungen einzelner Module oder aber die gesamte Struktur<br />
verändert werden.<br />
Im folgenden zweiten Schritt wird aus der Verhaltens- und Strukturbeschreibung<br />
mit Hilfe des Synthesewerkzeuges zunächst eine Gatterbeschreibung und<br />
dann eine FPGA-Konfiguration generiert. Hierbei wird die Hierarchie des<br />
Entwurfs aufgelöst, die Schaltung auf eine Chipfläche verteilt und dann<br />
verdrahtet. Das erzeugte Layout dient <strong>als</strong> Grundlage für den Herstellungsprozess<br />
des Chips.<br />
Bevor dieser jedoch gefertigt wird, kann mit einer Post-Synthese-Simulation<br />
(erneut wird der ISE Simulator verwendet) das Verhalten der Schaltung<br />
getestet werden. In diesem Simulationsschritt wird die Schaltung auf dem<br />
hardwarenächsten Niveau getestet und alle Randbedingungen, die zum Synthesezeitpunkt<br />
bekannt sind, fließen in die Simulation mit ein. So kann überprüft werden, ob<br />
die Schaltung immer noch die gestellte Aufgabe löst. Gegebenenfalls müssen<br />
Schaltungselemente neu platziert oder die Verdrahtung geändert werden. Die<br />
letzte Stufe des Entwurfs bilden die Fertigung und das Testen des Prototyps.<br />
1.4 Entwurfsbeispiel<br />
Es soll eine synchrone Schaltung entworfen werden, die den größten gemeinsamen<br />
Teiler zweier positiver 8-bit-Zahlen IN1 und IN2 berechnet und das Ergebnis<br />
mit einer vorgegebenen Zahl COMP vergleicht.<br />
Nach jedem Reset (RESET ’1’-aktiv) soll das Signal RES OK logisch 0 sein.<br />
Die Berechnung soll beginnen, sobald das Signal RESET logisch 0 wird, und<br />
5
jederzeit asynchron abgebrochen werden können, sobald RESET logisch 1<br />
wird.<br />
Sobald das Ergebnis feststeht, soll das Signal RES OK logisch 1 werden und<br />
das Endergebnis am Ausgang RESULT anliegen, bis ein Reset auftritt. Ist der<br />
Wert von RESULT identisch mit COMP, so soll das Signal EQUAL logisch 1 sein,<br />
falls sich die Werte von RESULT und COMP unterscheiden soll EQUAL logisch 0<br />
sein.<br />
Die Schaltung wird in zwei Module GGT und COMPARATOR aufgeteilt. GGT<br />
sei dabei ein synchrones Steuerwerk, das auf die ansteigende Flanke des<br />
Taktsign<strong>als</strong> CLK reagiert. COMPARATOR sei eine rein kombinatorische Schaltung.<br />
Die Signale RESET, CLK, RES OK und EQUAL seien vom Typ std logic, die<br />
Signale IN1, IN2, RESULT und COMP seien Busse vom Typ std logic vector<br />
mit jeweils acht Bit Breite.<br />
Hinweis Per Konvention sind alle Signale, die von links an einen Block<br />
herangeführt werden, Eingänge und alle, die von rechts an einen Block<br />
herangeführt werden, Ausgänge oder bidirektionale Signale. Die Ausnahme<br />
dieser Regel ist, wenn Signale nach Bedeutungsverwandschaft gruppiert werden.<br />
1.5 Betriebssystemumgebung<br />
Rechnerumgebungen Die Rechner, auf denen das Praktikum durchgeführt<br />
wird, stehen im Raum R268. Der Roboter-Versuch findet im Raum R269<br />
statt. Die Programme für das Praktikum laufen teils unter dem Betriebssystem<br />
Linux, teils unter Windows.<br />
SSH Auf den Linux-Rechnern ist SSH installiert. Um Programme auf<br />
einem anderen Rechner mit lokaler X-Ausgabe starten zu können, müssen<br />
Sie sich analog zu folgendem Beispiel einloggen:<br />
ssh -X synth1@i80pc74.itec.uka.de<br />
Esterel Wir besitzen eine Lizenz für die Esterel-Programme der Linux-<br />
Version.<br />
Xilinx Die Xilinx IDE ist unter Linux installiert.<br />
X2S USB Die Platine ist an den USB-Port der Rechner i80pc71 und<br />
i80pc44 im Raum R269 angeschlossen. Die Software dafür ist unter Windows<br />
installiert.<br />
EEPROM Brenner Zum beschreiben der EEPROMs verwenden wir das<br />
Programm PG4UW. Es ist auf den Rechnern i80pc71 und i80pc44 unter<br />
Windows installiert.<br />
7
SDCC Der Cross-Compiler, der C-Quelltext in 8051-Maschinensprache<br />
übersetzt, steht auf den Linux- Rechnern zur Verfügung.<br />
8
Kapitel 2<br />
Strukturbeschreibung<br />
Im Folgenden wird anhand des <strong>Tutorial</strong>s die Bedienung von ISE erklärt.<br />
Alle Projekte werden in /home/GRUPPE/Praktikum/PROJEKT gepeichert (GRUPPE<br />
entspricht der jeweiligen Praktikumsgruppe und PROJEKT dem entsprechenden<br />
Projekt. Es sind Ordner für die verschiedenen Projekte schon vorgegeben<br />
bzw. erstellt)<br />
Starten Sie auf der Konsole Xilinx mit dem Befehl ise<br />
Sie sehen nun den Projektmanager von ISE. Erstellen Sie ein neues Projekt<br />
mit dem Namen ”TUTORIAL” über das Menü File → New Project mit den<br />
Einstellungen wie in den folgenden Abbildungen dargestellt.<br />
2.1 Neues Projekt<br />
1. File → New Project<br />
• Project Name: TUTORIAL<br />
• Location: /home/GRUPPE/Praktikum/TUTORIAL<br />
• Top-Level Source Type: Schematic<br />
2. Next<br />
Geben Sie nun die folgenden Projekteigenschaften an<br />
3. Next<br />
• Family: Spartan2<br />
• Device: XC2s200<br />
• Package: pq208<br />
• Speed: −5<br />
• Simulator: ISE<br />
• Preferred Language: VHDL<br />
9
4. Next<br />
5. Next<br />
6. Finish<br />
2.2 Schaltplan erstellen<br />
Abbildung 2.1: Neues Projekt<br />
Als nächstes erstellen bzw. fügen Sie einen neuen Schaltplan mit dem Namen<br />
TUTORIAL ein.<br />
1. Rechtsklick auf TUTORIAL (Projekt) im Sources View → New Source<br />
2. Next<br />
3. Finish<br />
• Source Type: Schematic<br />
• File name: TUTORIAL<br />
Es wird ein leeres Blatt angezeigt.<br />
10
Abbildung 2.2: Projekteigenschaften<br />
Abbildung 2.3: Neue Quelldatei hinzufügen<br />
11
2.3 Symbole erstellen<br />
Abbildung 2.4: Neuer Schaltplan<br />
Als nächstes müssen die Symbole GGT und COMPARATOR erstellt werden.<br />
Achten Sie bitte auf die korrekkte Benennung Input/Output-Signale sowie<br />
Busbreite. Signale mit mehr <strong>als</strong> einem Bit werden mit SIGNALNAME(von:bis)<br />
angegeben.<br />
Beispiel: RESULT(7:0) wird in VHDL <strong>als</strong> RESULT std logic vector (7<br />
downto 0) übersetzt.<br />
1. Tools → Symbol Wizard<br />
2. Next<br />
3. Next<br />
4. Next<br />
• Pin Name Source: Specify Manually<br />
• Shape: Do not use Reference Symbol → Rectangle<br />
• Symbol Name: GGT<br />
• Add Pin: Geben sie die Pins nach Abbildung 2.7 ein<br />
• Symbol Width: 400<br />
12
5. Finish<br />
• Es wird eine Vorschau des Symboles angezeigt. Eventuelle Fehler<br />
mit Back korrigieren. Nachträgliche Änderungen des Symboles<br />
führen zu Problemen!<br />
6. Tools → Check Symbol<br />
Falls Fehler auftreten sollten, löschen Sie das Symbol und wiederholen<br />
Sie den Vorgang<br />
Erzeugen Sie auf die gleiche Weise das Symbol COMPARATOR, so wie in Abbildung<br />
2.12 dargestellt.<br />
2.4 Symbole einfügen<br />
Abbildung 2.5: Symbol Wizard<br />
Nachdem beide Symbole erzeugt worden sind, wechseln Sie wieder auf TUTORIAL.sch.<br />
Suchen Sie im Feld ”Symbol Name Filter” nach GGT. Markieren Sie das<br />
gefunde Symbol in “Symbols (that begin with... ) und platzieren Sie das<br />
Symbol im .sch Fenster. Legen Sie die endgültige Position mit der linken<br />
Maustate fest.<br />
13
Abbildung 2.6: Neues Symbol<br />
14
Abbildung 2.7: Input/Output Signale für den GGT-Baustein<br />
15
Abbildung 2.8: Aussehen des GGT-Symboles<br />
16
Abbildung 2.9: Vorschau des GGT-Symboles<br />
17
Abbildung 2.10: Fertiges GGT-Symbol<br />
Verfahren sie genauso mit dem COMPARATOR Symbol. Das Ergebnis ist in<br />
Abbildung 2.13 dargestellt.<br />
2.5 Verdrahten<br />
Als nächstes müssen die beiden Symbole verdrahtet, sowie Ein- und Ausgänge<br />
(I/O-Marker) für die Gesamtschaltung eingefügt werden.<br />
1. I/O Marker hinzufügen:<br />
• Menü Add → I/O Marker und an den gewünschten Anschluß des<br />
Symboles platzeren<br />
• gesetzte Marker umbenennen: Doppelklick auf die Marker und<br />
umbenennen. Busbreite beachten (siehe Abbildung 2.14)<br />
2. Verdrahten gemäß Abbildung 2.14<br />
• Menu Add → Wire<br />
• Ausgang RESULT von GGT mit Eingang IN1 des COMPARATOR verbinden<br />
3. Instantznamen vergeben<br />
18
Abbildung 2.11: Regelmäßige Symbolchecks<br />
19
Abbildung 2.12: Das COMPARATOR-Symbol<br />
20
Abbildung 2.13: Symbole Einfügen<br />
• Doppelkick auf das ensprechende Symbol und im erscheinenden<br />
Fenster InstName Ux vergeben. Für GGT U1, für COMPARATOR U2.<br />
Der Schaltplan ist nun fertig.<br />
21
Abbildung 2.14: Verdrahten und Ein-/Ausgänge hinzufügen<br />
22
Kapitel 3<br />
Verhaltensbeschreibung<br />
Nun werden die einzelnen Verhaltenbeschreibungen erstellt. Gehen Sie dabei<br />
folgendermaßen vor:<br />
1. GGT-Symbol markieren<br />
2. Tools → Generate HDL Template from Symbol<br />
3. Im erscheinenden Fenster VHDL auswählen<br />
4. Next<br />
5. Im erscheinenden Fenster sehen Sie nun eine Vorchau des Codegerüstes.<br />
6. Finish<br />
Verfahren Sie genauso für das COMPARATOR Symbol.<br />
Hinweis: Es wird nur ein VHDL-Gerüst erzeugt, das noch mit der eigentlichen<br />
Verhaltensbeschreibung (architecture) vervollständigt werden muß. Bibliotheken<br />
beachten!<br />
Wechseln Sie nun zum Sources-View und klappen Sie TUTORIAL.sch auf.<br />
Hier erscheinen die eben erstellten Grundgerüstdateien. Siehe Abbildungen<br />
3.1, 3.2, 3.3.<br />
23
Abbildung 3.1: Generieren des VHDL-Gerüstes<br />
Abbildung 3.2: VHDL <strong>als</strong> Zielsprache wählen<br />
24
Abbildung 3.3: Fertiges VHDL-Gerüst<br />
Öffnen sie hier GGT.vhd und fügen Sie den Code aus Listing 7.1 wischen die<br />
Schlüsselwörter begin und end des GGT Architektur ein. Beachten Sie hierzu<br />
auch die unten angeführten Hinweise.<br />
Dann öffnen Sie COMPARATOR.vhd und fügen Sie den Code aus Listing 7.2<br />
zwischen die Schlüsselwörter begin und end der COMPARATOR Architektur<br />
ein.<br />
Hinweis 1 Wenn eine VHDL-Datei im Sources View ausgewählt ist, kann<br />
die Sytax mittels Check Syntax (im Processes Fenster) überprüft werden.<br />
Hinweis 2 Ersetzen sie numeric std durch logic artih<br />
25
Kapitel 4<br />
Synthese<br />
Synthetisieren Sie nun das Projekt, um die einzelnen Codedateien auf Fehlerfreiheit<br />
zu überprüfen. Markieren Sie im Sources-Fenster den Schaltplan TUTORIAL.sch<br />
und doppelklicken Sie hierzu im Fenster Processes auf ”Synthesize - XST“.<br />
Eine erfolgreiche Synthese erkennen Sie an der Meldung (Konsole) Process<br />
”Sythesize“ completed successfully (Abbildung 4.1).<br />
Abbildung 4.1: Erfolgreiche Synthese<br />
26
Kapitel 5<br />
Simulation<br />
Der Xilinx Simulator erlaubt es und, die Schaltung sowohl auf der Verhaltensebene<br />
<strong>als</strong> auch auf der Schaltkreisebene zu simulieren. Bei der Verhaltensebene<br />
wird nur das Verhalten der Schaltung, nicht aber die zeitliche Verzögerung<br />
der Gatter berücksichtigt. Diese werden bei der Post-Route Simulation berücksichtigt,<br />
wodurch diese um ein vielfaches langsamer ist. Üblicherweise wird die Schaltung<br />
auf ihr Verhalten überprüft. Erst wenn dieses Verhalten korrekt ist, wird<br />
eine zeitbehaftete Simulation (Post-Route Simulation) auf Schaltkreisebene<br />
durchgeführt. Sind beide Simulationsschritte erfolgreich, schließt sich der<br />
Praxistest mit realer Hardware an.<br />
Um eine Schaltung zu simulieren , muß diese mit Signalen stimuliert werden.<br />
Hierzu wird die zu simulierende Schaltung in eine sogenannte Testbench<br />
eingebettet. Die Testbench ist eine übergeordnete Schaltung ohne Ein- und<br />
Ausgänge, sie enthalt nur Programmcode (VHDL) zur Stimulation der Eingangssignale<br />
der zu simulierenden Schaltung. Damit die Testbench nicht manuell erzeugt<br />
werden muß, bietet Xilinx ISE eine grafische Oberfläche zum Erstellen der<br />
Testbench an (Waveform Editor).<br />
5.1 Erstellen der Testbench<br />
Für die Simulation benötigen Sie eine Testbench. Diese wird folgendermaßen<br />
erzeugt (Gehen Sie dabei nach den Screenshots vor):<br />
1. Project → New Source<br />
2. Next<br />
• Test Bench WaveForm<br />
• File Name: TUTORIAL TESTBENCH<br />
3. Select a source: TUTORIAL<br />
4. Next<br />
27
5. Finish<br />
Abbildung 5.1: Testbench erstellen<br />
Abbildung 5.2: Für Testbench wählen<br />
Danach erscheint ein neues Fenster Initial Timing and Clock wizard (Abbildung<br />
5.3). Belassen Sie die Einstellungen und klicken auf Finish. Nun öffnet<br />
sich TUTORIAL TESTBENCH.tbw (Abbildung 5.4), speichern Sie die erstellte<br />
Testbench. Ändern Sie nun die Anzeige in Sources View auf Sources for:<br />
Behavioral Simulation Die Werte der einzelnen Signale weden standardmäßig<br />
in hexadezimalen Werten angegeben. Sie können die Signalcodierung der<br />
Busse per Rechtsklick ändern (z.B. Dezimal). Mit einem Linksklick auf ein<br />
Signal öffnet sich ein Fenster. Hier können Sie durch Werteingabe das Signal<br />
an diesem selektierten Zeitpunkt ändern.<br />
28
Abbildung 5.3: Timingeinstellungen<br />
Stellen Sie die Signale auf Decimal (unsigned) um. Danach belegen Sie die<br />
Signale mit sinnvollen Werten, z.B.:<br />
• Anlegen eines Resetsignales<br />
• IN1 auf 8<br />
• IN2 auf 2<br />
• COMPARE auf 2<br />
5.2 Verhaltenssimulation<br />
Bei der Simulation kann man nun die Schaltung auf Funktionstüchtigkeit<br />
überprüfen. Wechseln Sie die Ansicht in “Sources for:” auf Behavioral Simulation<br />
(Abbildung 5.5, 5.6) und wählen Sie die Testbench aus. Wählen Sie nun im<br />
Reiter Processes → Xilinx ISE Simulator → Simulate Behavioral Model<br />
mittels Doppelklick aus. Starten die die Simulation über Simulation → Run<br />
All (Hierzu sind die entsprechenden Schaltflächen in der Werkzeugleiste<br />
vorhanden). Überprüfen Sie, ob die Ausgangssignale korrekte Werte liefern.<br />
29
5.3 Post-Route Simulation<br />
Verfahren Sie wie im Abschnitt Verhaltenssimulation. Wählen Sie Post-<br />
Route Simulation statt Behavioral Simulation. Überprüfen sie ebenfalls ob<br />
die Ausgangssignale korrekte Werte liefern.<br />
Hinweis sollte die Post-Route Simulation nicht auf Anhieb funktionieren,<br />
führen Sie folgendes durch:<br />
• Project → Cleanup Project Files<br />
• ISE beenden und neu starten<br />
• Programming File nach Kapitel 6.6 erstellen<br />
• Post-Route Simulation nochmal starten<br />
Abbildung 5.4: Waveform Editor<br />
30
Abbildung 5.5: Post-Route Simulation<br />
Abbildung 5.6: Signalverlauf<br />
31
Kapitel 6<br />
Praxistest<br />
Bevor wir unsere Schaltung in der Praxis testen können, müssen wir diese<br />
in die bestehende Hardware einbinden. Wie eingangs erwähnt, steht uns ein<br />
FPGA Board mit USB interface zur Verfügung. An diesem FPGA Board<br />
ist eine LED Platine angeschlossen. Ziel ist, die Eingangssignale für unsere<br />
Schaltung vom PC aus (per USB) zu setzen und das Ergebnis an den<br />
LED’s abzulesen. Hierzu müssen wir unsere Schaltung in eine übergeordnete<br />
Schaltung ENVIRONMENT einbetten, wobei die Eingänge am USB INTERFACE<br />
und die Ausgänge am LED INTERFACE angeschlossen sind. Abbildung 6.1<br />
verdeutlicht die resultierende Hierarchie der Gesamtschaltung.<br />
ENVIRONMENT<br />
USB_INTERFACE<br />
TUTORIAL LED_INTERFACE<br />
GGT<br />
COMPARE<br />
Abbildung 6.1: Hierarchie der Gesamtschaltung<br />
Wir brauchen <strong>als</strong>o drei neue Symbole:<br />
• TUTORIAL<br />
• LED INTERFACE<br />
• USB INTERFACE<br />
sowie eine neue Schaltung:<br />
• ENVIRONMENT<br />
in die dann die drei Bausteine gemäß Abbildung 6.1 eingefügt werden.<br />
32
6.1 Symbol TUTORIAL<br />
Erstellen Sie das Symbol TUTORIAL wie folgt:<br />
• Sources for: → Synthesis/Implemtation<br />
• Tools → Symbol Wizzard → Using Schematic (Abbildung 6.2)<br />
• Folgen Sie dem Dialog (Abbildung 6.3)<br />
Abbildung 6.2: Symbol TUTORIAL aus der Schaltung TUTORIAL erstellen<br />
6.2 Schaltplan ENVIRONMENT<br />
Erstellen Sie nun eine neue Sourcedatei vom Typ Schematic mit dem Namen<br />
ENVIRONMENT (analog Abschnitt 2.2).<br />
Hinweis Es ist unbedingt erforderlich, dass sie den Schaltplan ENVIRONMENT<br />
<strong>als</strong> Top Module setzen. Wählen Sie per Rechtsklick auf den Schaltplan (im<br />
Sources View) ENVIRONMENT den Menupunkt Set as Top Module.<br />
33
Abbildung 6.3: Fertiges Symbol<br />
6.3 Symbole USB INTERFACE und LED INTERFACE<br />
Erstellen Sie die beiden Symbole LED INTERFACE und USB INTERFACE wie in<br />
den Abbildungen 6.4 und 6.5 zu sehen.<br />
Abbildung 6.4: Symbol LED-Interface<br />
34
Abbildung 6.5: Symbol USB-Interface<br />
6.4 Platzieren und Verdrahten<br />
Öffnen sie ENVIRNMENT.sch und platzieren und verdrahten Sie die eben<br />
erstellten Symbole (Abbildung 6.6). Generieren Sie je ein VHDL-Codegerüst<br />
für die beiden Symbole USB INTERFACE und LED INTERFACE und fügen Sie<br />
den entsprechenden VHDL-Code 7.3 und 7.4 ein.<br />
Hinweis Bei der Erstellung der Symbole gibt es im Xilinx ISE keine<br />
Möglichkeit gepufferte Ein- bzw. Ausgänge zu deklarieren. Dies ist für das<br />
USB INTERFACE unbedingt erforderlich. Ändern Sie deshalb die Signale MODE,<br />
COMP VALUE, VALUE1, VALUE2 und RESET von OUT nach BUFFER im generierten<br />
VHDL-Codegerüst. Bitte beschaten Sie, daß der I/O-Marker beim Anschluß<br />
DATA(7:0) an USB INTERFACE bidirektional ist!<br />
6.5 Randbedingungen und FPGA-Konfiguration<br />
Zum Schluß müssen noch die Ranbedingungen eingegeben werden, damit<br />
die Pins des FPGAs richtig zugeordnet werden:<br />
• Project → New Source → Implentation Constraint File (Abbildung<br />
6.7)<br />
35
Abbildung 6.6: Gesamtschaltung<br />
• Doppelklick auf ENVIRONMENT.ucf<br />
• Übertragen Sie die Pinnzuordung aus 7.5 in die Datei ENVIRONMENT.ucf<br />
6.6 Generieren des Programming Files<br />
Für den abschließenden Test muß ein sogenanntes Programming File erszeugt<br />
werden. Hierzu ist noch eine Enstellung nötig.<br />
• Markieren Sie Ihr Top Modul (ENVIRONMENT (ENVIRONMENT.sch))<br />
• Rechtsklick auf Generate Programming File im FEnter Processes<br />
• Properties auswählen<br />
• Haken müssen bei “Run Design Rules Checker (DRC)” und “Create<br />
ASCII Configruation File” gesetzt sein<br />
• Mittels OK die Änderungen übernehmen<br />
Doppelklicken Sie nun “Generate Programming File”<br />
36
6.7 Test<br />
Abbildung 6.7: Implementation Constraint File<br />
Nun wird es ernst! Begeben Sie sich an einen Windows-Rechner (Raum<br />
269), der mit einer FPGA-Platine über USB verbunden ist. Das Programm<br />
XC2USB Diag, das ebenfalls über die Arbeitsfläche gestartet werden kann,<br />
besorgt die Kommunikation mit dem FPGA. Starten Sie es, es erscheint das<br />
Hauptfenster wie in Abblidung 6.8.<br />
Über die Schaltfläche “Configure Fpga” kann das FPGA programmiert werden<br />
mit einer Konfiguration, wie wir sie hier erstellt haben. Konfigurieren Sie<br />
<strong>als</strong>o das FPGA mit Ihrem Entwurf aus der Datei ENVIRONMENT.rbt, die<br />
in Ihrem Projektverzeichnis liegen sollte. Nun kann der Entwurf getestet<br />
werden. Um Ihre Ausgaben anzuzeigen, ist eine Erweiterungsplatine an den<br />
Bus der FPGA-Platine angebracht, die durch LEDs kodiert die Berechnungsergebnisse<br />
anzeigt:<br />
Es werden die LED-Reihen doppelt benutzt, die Zahlenwerte darstellen.<br />
In der oberen Reihe werden Eingabe 2 oder das Ergebnis dargestellt, in<br />
der unteren Reihe Eingabe 1 oder der Vergleichswert. In der Mitte sind<br />
noch LEDs für die Zustände Equal, Res Ok und Reset angebracht. Mit dem<br />
Programm XC2 USB kann man mit dem Entwurf über USB kommunizieren.<br />
Dies geschieht über das Lesen bzw. Schreiben von Werten an Speicheradressen.<br />
Der Befehl zum Schreiben dieser Speicheradressen lautet write BLOCK<br />
ADDR VALUE<br />
Dabei steht BLOCK für eine Zahl zwischen 0 und 3 (es gibt 4 Speicherblöcke)<br />
37
Abbildung 6.8: Hauptfenster<br />
und ADDR für eine Adresse (hexadezimal) innerhalb des ausgewählten Blockes.<br />
Folgende Adressen werden benutzt im Tutorium:<br />
Adresse Zweck<br />
0 Der Wert für IN1<br />
1 Der Wert für IN2<br />
2 Der Wert für COMP<br />
Bit 0: Anzeigemodus<br />
3<br />
Bit 1: Reset<br />
Die Adressen 0-2 erklären sich selbst. An der Adresse 3 werden durch die<br />
beiden niedrigsten Bit zwei Steuerleitungen gesetzt. Durch das niedrigste Bit<br />
kann der Anzeigemodus gesetzt werden: Ist es ’0’, so werden die Eingaben<br />
(IN1 und IN2) auf der Platine angezeigt; ist es ’1’, so werden die Ausgaben<br />
(RESULT und COMP) angezeigt. Mit dem zweit niedrigste Bit kann das<br />
Reset-Signal gesetzt bzw. gelöscht werden. Ein typischer Dialog zur Demonstration<br />
des Write-Befehls ist in Abbildung 6.9 dargestellt.<br />
38
Abbildung 6.9: Typischer Dialog<br />
39
Kapitel 7<br />
Anhang<br />
7.1 VHDL-Code für GGT<br />
--------------------------------------------------------------------------------<br />
-- Copyright (c) 1995-2008 Xilinx, Inc. All rights reserved.<br />
--------------------------------------------------------------------------------<br />
-- ____ ____<br />
-- / /\/ /<br />
-- /___/ \ / Vendor: Xilinx<br />
-- \ \ \/ Version : 10.1.02<br />
-- \ \ Application :<br />
-- / / Filename : xil_F6mGuc<br />
-- /___/ /\ Timestamp : 10/21/2008 13:23:54<br />
-- \ \ / \<br />
-- \___\/\___\<br />
--<br />
--Command:<br />
--Design Name:<br />
--<br />
library ieee;<br />
use ieee.std_logic_1164.ALL;<br />
use ieee.std_logic_arith.ALL;<br />
library UNISIM;<br />
use UNISIM.Vcomponents.ALL;<br />
entity GGT is<br />
port ( CLK : in std_logic;<br />
IN1 : in std_logic_vector (7 downto 0);<br />
IN2 : in std_logic_vector (7 downto 0);<br />
RESET : in std_logic;<br />
40
end GGT;<br />
RESULT : out std_logic_vector (7 downto 0);<br />
RES_OK : out std_logic);<br />
architecture BEHAVIORAL of GGT is<br />
begin<br />
CLOCKED: process (CLK, RESET, IN1, IN2)<br />
variable a : std_logic_vector (7 downto 0) := "XXXXXXXX";<br />
variable b : std_logic_vector (7 downto 0) := "XXXXXXXX";<br />
variable h : std_logic_vector (7 downto 0) := "XXXXXXXX";<br />
begin<br />
if RESET = ’1’ then<br />
a := IN1;<br />
b := IN2;<br />
elsif CLK = ’1’ and CLK’event then<br />
if a /= b then<br />
if unsigned(b) > unsigned(a) then<br />
h := a;<br />
a := b;<br />
b := h;<br />
end if;<br />
a := unsigned(a) - unsigned(b);<br />
end if;<br />
else<br />
-- do nothing<br />
end if;<br />
RESULT
7.2 VHDL-Code für COMPARATOR<br />
--------------------------------------------------------------------------------<br />
-- Copyright (c) 1995-2008 Xilinx, Inc. All rights reserved.<br />
--------------------------------------------------------------------------------<br />
-- ____ ____<br />
-- / /\/ /<br />
-- /___/ \ / Vendor: Xilinx<br />
-- \ \ \/ Version : 10.1.02<br />
-- \ \ Application :<br />
-- / / Filename : xil_GcbZlx<br />
-- /___/ /\ Timestamp : 10/21/2008 13:24:02<br />
-- \ \ / \<br />
-- \___\/\___\<br />
--<br />
--Command:<br />
--Design Name:<br />
--<br />
library ieee;<br />
use ieee.std_logic_1164.ALL;<br />
use ieee.numeric_std.ALL;<br />
library UNISIM;<br />
use UNISIM.Vcomponents.ALL;<br />
entity COMPARATOR is<br />
port ( IN1 : in std_logic_vector (7 downto 0);<br />
IN2 : in std_logic_vector (7 downto 0);<br />
EQUAL : out std_logic);<br />
end COMPARATOR;<br />
architecture BEHAVIORAL of COMPARATOR is<br />
begin<br />
COMPARE: process(IN1, IN2)<br />
begin<br />
if IN1 = IN2 then<br />
EQUAL
7.3 VHDL-Code für LED INTERFACE<br />
--------------------------------------------------------------------------------<br />
-- Copyright (c) 1995-2007 Xilinx, Inc. All rights reserved.<br />
--------------------------------------------------------------------------------<br />
-- ____ ____<br />
-- / /\/ /<br />
-- /___/ \ / Vendor: Xilinx<br />
-- \ \ \/ Version : 9.2.03i<br />
-- \ \ Application :<br />
-- / / Filename : xil_nx6w7L<br />
-- /___/ /\ Timestamp : 07/29/2008 16:00:01<br />
-- \ \ / \<br />
-- \___\/\___\<br />
--<br />
--Command:<br />
--Design Name:<br />
--<br />
library ieee;<br />
use ieee.std_logic_1164.ALL;<br />
use ieee.numeric_std.ALL;<br />
library UNISIM;<br />
use UNISIM.Vcomponents.ALL;<br />
entity LED_INTERFACE is<br />
port ( COMP : in std_logic_vector (7 downto 0);<br />
EQUAL : in std_logic;<br />
IN1 : in std_logic_vector (7 downto 0);<br />
IN2 : in std_logic_vector (7 downto 0);<br />
MODE : in std_logic;<br />
RESULT : in std_logic_vector (7 downto 0);<br />
RES_OK : in std_logic;<br />
LEDARRAY : out std_logic_vector (21 downto 0));<br />
end LED_INTERFACE;<br />
architecture BEHAVIORAL of LED_INTERFACE is<br />
begin<br />
LEDARRAY(7 downto 0)
LEDARRAY(17)
MODE : BUFFER std_logic;<br />
RESET : BUFFER std_logic;<br />
VALUE1 : BUFFER std_logic_vector (7 downto 0);<br />
VALUE2 : BUFFER std_logic_vector (7 downto 0);<br />
DATA : inout std_logic_vector (7 downto 0));<br />
end USB_INTERFACE;<br />
architecture BEHAVIORAL of USB_INTERFACE is<br />
signal Out_data : Std_Logic_Vector(7 downto 0); -- Zwischenlager für Ausgang<br />
BEGIN<br />
output_selection : process(adr, value1, value2, comp_value, reset, mode)<br />
begin<br />
case adr is<br />
when "00" => Out_data Out_data Out_data Out_data mode, 1 => reset, others => ’0’);<br />
when others => Out_data ’0’);<br />
end case;<br />
end process;<br />
write_process : process(adr, wr_n)<br />
begin<br />
if wr_n = ’1’ and wr_n’event then<br />
case adr is<br />
when "00" => value1 value2 Comp_Value mode
# WR_N for the EZ-USB-Interface (if jumpered so)<br />
NET "oe_n" LOC = "P120";<br />
# OE_N for the EZ-USB-Interface<br />
NET "ledarray" LOC = "P82" ;<br />
NET "ledarray" LOC = "P100";<br />
NET "ledarray" LOC = "P101";<br />
NET "ledarray" LOC = "P102";<br />
NET "ledarray" LOC = "P74" ;<br />
NET "ledarray" LOC = "P70" ;<br />
NET "ledarray" LOC = "P20" ;<br />
NET "ledarray" LOC = "P16" ;<br />
NET "ledarray" LOC = "P10" ;<br />
NET "ledarray" LOC = "P7" ;<br />
NET "ledarray" LOC = "P4" ;<br />
NET "ledarray" LOC = "P205";<br />
NET "ledarray" LOC = "P202";<br />
NET "ledarray" LOC = "P199";<br />
NET "ledarray" LOC = "P61" ;<br />
NET "ledarray" LOC = "P58" ;<br />
NET "ledarray" LOC = "P48" ;<br />
NET "ledarray" LOC = "P45" ;<br />
NET "ledarray" LOC = "P42" ;<br />
NET "ledarray" LOC = "P36" ;<br />
NET "ledarray" LOC = "P33" ;<br />
NET "ledarray" LOC = "P29" ;<br />
# All of them are pins on the extension head<br />
NET "data" LOC = "P108";<br />
NET "data" LOC = "P109";<br />
NET "data" LOC = "P110";<br />
NET "data" LOC = "P111";<br />
NET "data" LOC = "P112";<br />
NET "data" LOC = "P113";<br />
NET "data" LOC = "P114";<br />
NET "data" LOC = "P115";<br />
# EZ-USB-Data-Bus<br />
NET "clk" LOC = "P185";<br />
# the system-clock<br />
NET "adr" LOC = "P151";<br />
NET "adr" LOC = "P152";<br />
# the EZ-USB-Address-Bus<br />
46