05.07.2013 Aufrufe

Tutorial als PDF - CES

Tutorial als PDF - CES

Tutorial als PDF - CES

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!