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?