Digitaltechnik #252-0014-00 Rechnerübung 1 Step-by

Transcription

Digitaltechnik #252-0014-00 Rechnerübung 1 Step-by
Digitaltechnik #252-0014-00
Grundvorlesung, SS 2005
Departement Informatik
ETH Zürich
Rechnerübung 1
Institut für Computersysteme
Prof. Daniel Kröning
Revision: 1.29
Step-by-step Tutorial für FPGA-Board und Design Tools
Übungsziel
In dieser Übung sollen Sie sich vertraut machen mit den Design Tools die heutzutage eingesetzt werden. Der Entwurfsprozess
beginnt bei der Spezifikation und endet schliesslich beim Transistor. Normalerweise überlegt man sich mit Papier und Bleistift
die Architektur und beginnt dann VHDL Code (Register Transfer Level) zu schreiben. Die Übersetzung in die unteren Stufen
wird durch ein Synthesetool vorgenommen; wir werden auf Gatter Level beginnen und schliesslich bei dem RTL landen.
Spezifikation
?
Architektur
?
RTL
?
Gatter
?
Transistor
Abbildung 1: Synthese
Windows starten
Zunächst muss ggf. Windows gestartet werden. Starten Sie dazu den Rechner neu und wählen Sie im Bootmenü Windows.
Nun können Sie sich mit n.ethz-Benutzernamen und Passwort einloggen.
Praktikumsboard
Auf dem Board befindet sich ein Spartan-3 FPGA (Field-Programmable Gate Array; d.h. programmierbarer Logikbaustein)
der Firma Xilinx. In der Industrie werden solche Chips normalerweise für Rapid Prototyping oder Designs mit kleineren
Stückzahlen eingesetzt.
Das verwendete Board besitzt einen VGA Ausgang, eine RS-232 Schnittstelle, einen PS/2 Anschluss, 1MB SRAM und
2MBit Flash. Das FPGA selbst ist mit 50 Mhz getaktet (FPGAs weisen oftmals eine deutlich niedrigere Taktfrequenz auf
als spezialisierte, nicht konfigurierbare ICs wie z.B. Prozessoren). An dieser Stelle wird nur auf das zum Übungsbetrieb
Relevante eingegangen; das komplette Handbuch finden Sie auf der Homepage zur Vorlesung.
Auf dem FPGA-Board ist rechts unten (Abbildung 2, Nummer 11) eine Reihe von Schiebeschaltern (SW7-SW0, siehe Tabelle
2) montiert, die direkt mit einigen Eingängen des FPGAs verbunden sind. Schalter die ,,oben” oder ,,an” sind setzen den
entsprechenden Eingang auf High (d.h. 1 ), diejenigen die ,,unten” oder ,,aus” sind erzeugen ein Low (d.h. 0 ) am Eingang.
Chapter 1: Introductio
R
Rechnerübung 1
2
21
20
A1 Expansion Connector
22
31
2
27
VGA
17
2Mbit
PlatformFlash
24
16
XILINX
XC3S200
FPGA
18
DONE
POWER
25
19
3
B1 Expansion Connector
3.3V
5
A2 Expansion Connector
PROG
1
POWER
26
RS-232
RS-232
6
7
15
30
10
12
8
PS/2
9
11
13
ug130_c1_02_042704
Abbildung 2: Xilinx Spartan-3 Board
Xilinx Spartan-3 Starter Kit Board (Top Side)
Figure 1-2:
1
2
10
11
12
13
17
18
FPGA
Flash ROM
7-Segmentanzeige
8 Schiebeschalter
8 Leuchtdioden (LED)
4 Taster
Reset Taste (lädt FPGA mit Konfiguration aus dem Flash)
leuchtet, wenn das FPGA fertig programmiert wurde
5
Tabelle 1: Legende zu Abbildung 2
SW6
K14
SW5
J13
SW4
4
J14
SW3
H13
256Kx16
SRAM
SW7
K13
256Kx16
SRAM
Schalter
FPGA Pin
SW2
H14
SW1
G12
SW0
F12
2.5V
Tabelle 2: Schiebeschalter
28
Mit der Nummer 13 auf Abbildung 2 sind Drucktaster bezeichnet, welche im gedrückten Zustand die Eingänge am FPGA
auf High setzen (Tabelle 2).
29
Schalter
FPGA Pin
50
MHz
BTN3
L14
BTN2
L13
BTN1
M14
14
BTN0
M131.2V
6
Tabelle 3: Druckschalter
Die 8 Leuchtdioden (Kurzform LED für Light-Emitting-Diode - Licht aussendende Diode) die mit der Nummer 12 angeschrieben sind, werden direkt von den Ausgängen des FPGA angesteuert. Um eine LED einzuschalten muss der zugehörige
Ausgang auf 1 gesetzt werden.
LED
FPGA Pin
Figure 1-3:
LD7
P11
LD6
P12
LD5
N12
LD4
P13
LD3
N14
LD2
L12
LD1
P14
LD0
K12
Xilinx Spartan-3 Starter Kit Board (Bottom Side)
Tabelle 4: LEDs
ug130_c1_03_042704
Rechnerübung 1
3
Inbetriebnahme
1. Schliessen Sie das Verbindungskabel an den mit (22) bezeichneten Ort auf dem Board und den Parallelport (violett) des
Computers an. Beachten Sie die Polung des Steckers! Die Beschriftung muss mit der auf dem Board übereinstimmen.
2. Schliessen Sie das Netzteil an.
3. Sobald das Board mit Strom versorgt ist, wird die Konfiguration des FPGAs (1) aus dem Flash (2) geladen und ein
Demoprogramm läuft ab.
Xilinx ISE (Integrated Synthesis Environment)
Starten Sie die FPGA-Entwicklungsumgebung mittels Start → Programme → Xilinx ISE 6 → Project Navigator
Das Hauptfenster (Bild 3) ist in vier Bereiche aufgeteilt:
Übersichtsfenster zeigt hierarchisch alle zum Projekt gehörigen Files an. Ein Doppelklick auf ein File startet das zugehörige
Tool im Editierfenster.
Prozessfenster Ein Doppelklick mit der linken Maustaste bzw. der Menüpunkt ,,run” in dem auf einen Rechtsklick erscheinenden Pop-Up Menü startet den zugehörigen Prozess. Ein grünes Häckchen markiert einen erfolgreich abgelaufenen
Prozess.
Konsole zeigt die Ausgabe des zuletzt abgelaufenen Prozesses inkl. Warnungen und Fehlermeldungen an.
Editierfenster Hier können z.B. VHDL Files bearbeitet werden.
Uebersichtsfenster
Editierfenster
Prozessfenster
Konsole
Abbildung 3: Xilinx Project Navigator
Rechnerübung 1
Aufgabe 1.1
4
Gatter Schema
1. Erstellen Sie zuerst ein neues Projekt: File → New Project (Bild 4). Wählen Sie als ,,Schematic” als ,,Top-Level
Module Type”. Dieses Programm scheint noch Überreste von Windows 3.x Zeiten zu haben und verträgt
z.B. Leerzeichen in Verzeichnisnamen nicht; Ihr Home-Verzeichnis sollte aber auch unter ,,T:” zu finden
sein.
Abbildung 4: Neues Projekt erstellen
Im nachfolgenden Fenster wählen Sie für das Digilent Spartan 3 Board folgende Einstellungen (Bild 5):
Device Family
Device
Package
Speed Grade
Spartan 3
xc3s200
ft256
-4
Abbildung 5: Einstellungen für Spartan-3 Board
Überspringen Sie die nächsten beiden Fenster mit ,,weiter” und klicken Sie auf ,,Fertig stellen”.
2. Fügen Sie dem Projekt nun ein weiteres File hinzu, indem Sie im Übersichtsfenster mit der Rechten Maustaste klicken
und ,,New Source” auswählen. Markieren Sie auf der linken Seite ,,Schematic” und klicken Sie auf ,,weiter” und
,,fertig stellen” (Siehe Bild 6).
Rechnerübung 1
5
Abbildung 6: Neues Schema hinzufügen
Nun öffnet sich ein neues Fenster zur Schemaeingabe (Bild 7).
Select
Cursor
Add
Wire
Add
I / O Marker
Add
symbol
Abbildung 7: Schaltung zeichnen
Rechnerübung 1
6
3. Bauen Sie nun folgende Funktion mit Gattern auf: Z = (A ∨ B) ∧ (A ∨ B) (siehe Bild 7). Platzieren Sie dazu zuerst die
Gatter indem Sie das ,,Add Symbol” Tool auswählen und in der ,,Logic” Kategorie das entsprechende Gatter markieren.
Anschliessend können Sie mit ,,Add Wire” die Bauelemente verdrahten und mit ,,Add I/O Marker” die Ein- bzw.
Ausgänge festlegen. Den ,,I/O Markern” werden eindeutige Defaultnamen zugeordnet; um diese zu ändern wählen
Sie das ,,Select Cursor” Tool aus und machen einen Doppelklick auf den entsprechenden Marker. Im nachfolgenden
Fenster können Sie den Namen ändern und angeben, ob dies ein Ein- oder Ausgang ist (Bild 8).
Benennen Sie die Inputs A und B und den Ausgang Z.
Abbildung 8: I/O Marker umbenennen
Wenn Sie das Schema fertig gezeichnet haben, schliessen Sie den Schemaeditor wieder.
4. Nun müssen Sie die virtuellen ,,I/O Marker” den physikalischen Pins des FPGA’s zuweisen, doppelklicken Sie dazu im
Prozessfenster (siehe Bild 3) auf User Constraints → Assign Package Pins. (Beantworten Sie die ev. nachfolgende
Frage einfach mit ,,OK”).
In der linken unteren Hälfte können Sie nun jeden Input-Pin einem Druck- oder Schiebeschalter (siehe Tabellen 3
und 2) und jeden Output-Pin einer LED (Tabelle 4) zuweisen. Achten Sie bitte darauf, dass Sie keinen Pin
zuzuweisen vergessen (erkennbar an einer fetten Schrift im linken oberen Teil) und dass Sie keinen Ausgang
einem Schalter zuweisen! Ein Kurzschluss mit Beschädigung des FPGAs wäre die Folge!
Nehmen Sie folgende Zuweisung vor:
,,I/O Name”
Z
B
A
,,I/O Direction”
Output
Input
Input
,,Loc”
P11
K13
K14
Speichern Sie Ihre Änderungen und schliessen Sie das Fenster wieder.
(Achten Sie im Folgenden darauf, dass im Übersichtsfenster das Schema, d.h. ,,logic.sch” ausgewählt ist, siehe
Abbildung 3).
5. Öffnen Sie das Pop-Up Menü (rechte Maustaste) über Generate Programming File und klicken Sie auf Properties
. . . (Bild 10).
Stellen Sie Startup Options → FPGA Start-Up Clock auf JTAG Clock (Bild 11).
6. Starten Sie nun die Synthese: Rechtsklick auf Generate Programming File → Run.
7. Wenn alle Prozesse fehlerfrei abgeschlossen worden sind kann die Programmierung beginnen: Rechtsklick auf Configure Device (iMPACT) → Run.
Wählen Sie im neu geöffneten Fenster: Boundary-Scan Mode, OK → Automatically Connect to cable and
identify Boundary-Scan chain, OK.
Im nachfolgenden Fenster erscheinen zwei ICs, das linke ist das FPGA selbst; weisen Sie ihm das File ,,logic.bit” zu.
Das rechte ist das Flash-ROM, in das wir die Daten aber nicht ablegen werden; wählen Sie im Dateiauswahldialog
,,Bypass” aus (rechts unten).
Rechnerübung 1
7
Abbildung 9: Pin Assignment.
Abbildung 10: Generate Einstellungen
Rechnerübung 1
8
Abbildung 11: Startup Options → FPGA Start-Up Clock auf JTAG Clock setzen
Abbildung 12: Design auf FPGA Übertragen.
8. Klicken Sie anschliessend mit der rechten Maustaste auf das linke IC und wählen Sie Programm.... Überspringen Sie
das nachfolgende Fenster mit ,,OK”. Nun wird das FPGA neu programmiert . . .
Manchmal schlägt die Übertragung auch fehl; wiederholen Sie in diesem Fall den Vorgang einfach noch einmal.
Überprüfen Sie nun die Schaltung auf dem FPGA! Welche Funktion wurde implementiert?
Rechnerübung 1
9
VHDL-Einführung
Nun begeben wir uns eine Stufe höher (siehe Bild 1) und bauen die selbe Funktion auf Register Transfer Level (d.h. in
VHDL) auf.
Laden Sie das File dt-pract1.zip von der Vorlesungsseite herunter und entpacken Sie es in Ihrem Homeverzeichnis.
Öffnen Sie im Verzeichnis part1 das Projekt part1.npl:
File → Open Project (gehen Sie wieder von ,,T:” aus)
Aufgabe 1.2
VHDL-Syntax
Das VHDL-Modell in Bug1.vhdl hat noch einige syntaktische Fehler. Finden Sie diese, bis es erfolgreich synthetisiert
wird! Das heisst, der Synthetisierer darf keine Fehlermeldungen mehr ausgeben.
Wählen Sie dazu die zu synthetisierte Datei im Übersichtsfenster aus und klicken Sie mit der rechten Maustaste im Prozessfenster auf Synthesize - XST und starten den Prozess mit run (siehe Abbildung 13). (Ev. müssen Sie die Datei zuerst
speichern, bevor Sie run auswählen können.)
Abbildung 13: Design synthetisieren.
Wenn Sie nun im Prozessfenster Synthesize - XST → View RTL Schematic mit einem Doppelklick starten, dann können
Sie sich anschauen, wie der Synthetisierer aus dem VHDL Code die Gatter zusammengebaut hat. In Abbildung 14 sehen
Sie das ganze Design als Black Box dargestellt, so wie es durch die entity Deklaration im VHDL Code spezifiziert wird.
Mit einem Doppelklick auf dieses Symbol wird der innere Aufbau stufenweise dargestellt (Abbildung 15). Mit den grünen
Pfeilen (mit ,,Pop” / ,,Push” angeschrieben) können Sie in eine selektierte Komponente hineinschauen (,,Push”) oder mit
,,Pop” wieder zurückgehen.
Rechnerübung 1
10
Abbildung 14:
Pop
Push
Abbildung 15:
Aufgabe 1.3
Multiplexer
Öffnen Sie nun das Projekt in part2. Ein Multiplexer ist eine Einheit, welche drei Eingänge hat: sel, i1 und i0 . 1 Dabei wird
beim einzigen Ausgang o i1 zurückgegeben, falls sel = 1, und i0 sonst. Untenstehend eine vereinfachte Wahrheitstabelle,
wobei − für “Don’t care” steht:
1 Die
ganze Welt benutzt in der Digitaltechnik jeweils das höchste Bit (MSB) zuerst. Die ganze Welt? Nein, ein nicht ganz kleiner Prozessorhersteller in den USA leistet nach wie vor dieser intuitiven Konvention heftigen Widerstand. Dank einer Prozessorfamilie, welche findige Ingenieure
seit langem zusammenbrauen, ist diese Firma praktisch unbesiegbar.
Rechnerübung 1
11
sel
0
0
1
1
a)
i1
−
−
0
1
i0
0
1
−
−
o
0
1
0
1
Entity-Deklaration
Öffnen Sie das File Mux2to1.vhdl (Doppelklick im Übersichtsfenster). Dieser Teil enthält die Inputs und Outputs sowie
die dazugehörigen Datentypen. Vervollständigen Sie die Deklaration der Entity zu einem Multiplexer mit sel, i1 , i0 und o.
(Wichtig: Benennen Sie die Inputs und Outputs genau wie angegeben, wenn Sie den Multiplexer auf dem Board laufen
lassen möchten.)
b)
Verhalten des Multiplexers: Architecture
Die Architecture beschreibt nun das Verhalten des Multiplexers mit dem in der Entity vorgegebenen Interface. Überlegen Sie
sich, wie Sie die oben beschriebene Entscheidung mit Hilfe der Wertetabelle in eine Boole’sche Formel umwandeln. Fügen
Sie dann in der Architecture func diese Formel ein. Versuchen Sie Ihr Design (wie in der vorherigen Aufgabe beschrieben)
zu synthetisieren!
c)
Testbench / Simulation
Nun sollten Sie nicht der Implementierung blind vertrauen. Darum wird diese getestet. Im File Mux2to1 tb.vhdl finden
Sie das Skelett zu einer Testbench. Diese enthält wie üblich keine Ein- und Ausgänge. Stattdessen verwendet sie die Entity
Mux2to1 und testet diese systematisch mit verschiedenen Werten. Fügen Sie unten im Code weitere Eingaben ein, um alle
möglichen Kombinationen von Inputs zu testen.
Die Testbench ist nicht synthetisierbar, da sie Code enthält, der sich nicht direkt in Gatter übersetzen lässt, wie z.b. wait
for 50 ns.
Starten Sie daher ModelSim zur Simulation Ihres Multiplexers: Programme → ModelSim XE III → ModelSim.
Öffnen Sie part2/part2.mpf über File → Open (ev. müssen Sie dazu im Filedialog den Filetyp auf ,,Project Files /
*.mpf” umstellen, damit die Datei angezeigt wird).
ModelSim kompiliert die Dateien, so dass diese im Simulator lauffähig sind und kann daher mit den synthetisierten Netzlisten
nichts anfangen. Kompilieren Sie deshalb alle Dateien: Compile → Compile All (siehe 16).
Abbildung 16: Modelsim
Falls sich alle Dateien kompilieren lassen (bei Status erscheint ein grünes Häkchen), lässt sich die Simulation starten,
Rechnerübung 1
12
indem Sie von der Project zur Library Ansicht wechseln und nach einem Rechtsklick auf work/mux2to1 tb → Simulate
auswählen (siehe Abbildung 17).
Abbildung 17: Simulation starten
Nun müssen Sie die Signale auswählen, die Sie anzeigen lassen möchten: Rechtsklick auf Mux2to1 tb/dut → Add → Add
to Wave. Lassen Sie die Simulation laufen, indem Sie run -all in die Kommandozeile in der unteren Hälfte eingeben
(siehe Abbildung 18).
Abbildung 18: Simulation des Multiplexers
Falls Sie möchten, können Sie Ihr Design nun, wie in der vorherigen Aufgabe beschrieben, aufs Board übertragen und laufen
lassen: wechseln Sie zurück zur Xilinx ISE, wählen Sie die Datei Mux2to1.vhdl aus und starten Sie GenerateGenerate
Programming File. Der Schiebeschalter ganz links entspricht dem Signal sel und die beiden Nachfolgenden den beiden
anderen Eingängen des Multiplexers.
Aufgabe 1.4
Multiplexer mit Netzliste
Wechseln Sie wieder zur Xilinx ISE und bleiben Sie nun im selben Projekt part2. Den vorher verwendeten Multiplexer
können Sie auch anders implementieren, indem Sie statt den eingebauten logischen Operationen ein vorgegebenes Nand 2Gatter verwenden. Dieses hat zwei Inputs und einen Output.
Rechnerübung 1
a)
13
Umwandlung der Logik zu nand
Angenommen, Sie dürften nur nand-Gatter mit zwei Eingängen verwenden. Es ist bekannt, dass jede Boole’sche Funktion
sich durch genügend viele solche Gatter darstellen lässt. Formen Sie die in der Architecture func verwendete Formel so um,
dass sie nur noch nand enthält! Benutzen Sie die aus der Logik bekannten Umformungen.
b)
Neue Architecture
In Mux2to1.vhdl finden Sie ganz unten ein Skelett für die zweite Architecture net, welche die Entity Mux2to1 implementiert. Um die Implementation zu vervollständigen, müssen Sie:
• Die Benutzung der Komponente Nand 2 vervollständigen.
• Verschiedene Gatter instantiieren und diese verbinden. Dabei brauchen Sie sicher noch Signale, die für die Drähte
stehen, welche die einzelnen Gatter verbinden.
Danach können Sie die Testbench so abändern, dass die neue Architektur verwendet wird. Testen Sie das Ergebnis! Wie
lange dauert es nun maximal, bis der gewünschte Output anliegt? Was fällt Ihnen noch auf?