Hardwarepraktikum SS 97: 5. Laboreinheit
Transcrição
Hardwarepraktikum SS 97: 5. Laboreinheit
Hardwarepraktikum SS 97: 5. Laboreinheit Dozent: Dirk Pape, Tutoren: Herbert Kiefer, Arno Schoedl, Thomas Spitzer 12. Versuch: programmierbare Logik Literatur: Dokumentation zum CUPL-Logikcompiler, Datenblatt des GAL16V8, ???? (PLDs). Statt notwendige Verbindungslogik ("glue logic") zwischen Modulen einer Schaltung mit Standardbausteinen (z.B. 74LS...) aufzubauen, verwendet man heutzutage meist programmierbare Logikbausteine (PLDs), z.B. PALs, GALs oder FPGAs. Im Hardwarelabor steht ein GAL-Demoboard zur Verfügung, mit dem man verschiedene GALs und PALs emulieren kann. Der verwendete Baustein auf dem Demoboard ist eine wiederbeschreibbare Variante des GAL16V8. Dieser Baustein kann jedoch nicht unbegrenzt oft programmiert werden (ca. 200 Mal), so daß Sie sich vor dem Programmieren durch Simulation von der Korrektheit Ihrer Schaltung überzeugen müssen. Zur Beschreibung der Schaltungen, die programmiert werden sollen, dient die Beschreibungssprache von CUPL – einem Logikcompiler. Die Schaltung wird in Form von Logiktermen oder Zustandsautomatensyntax beschrieben und von CUPL in das JEDEC-Format übersetzt. Dieses Format kann von einem anderen Programm interpretiert und verwendet werden, um die richtigen Sicherungen in dem GAL-Baustein durchzubrennen. Als Zielbaustein für alle Ihre Schaltungen wählen Sie das GAL16V8. Wie die fertig kompilierten Schaltungen in das Demoboard geladen werden können, wird Ihnen im Labor gezeigt. Zwei Beispiele für CUPL-Programme finden Sie im Beispielverzeichnis unter ftp://ftp.inf.fu-berlin.de/pub/hwp97/beispiel/. Vorbereitung a) Erläutern Sie kurz den Unterschied zwischen PAL-, GAL- und FPGA-Bausteinen und geben Sie spezifische Einsatzmöglichkeiten an. b) Arbeiten Sie sich anhand der Dokumentation und des Tutorials in CUPL ein. c) Schreiben Sie ein CUPL-Programm für das Zweierkomplementschaltnetz aus dem 10. Versuch. Definieren Sie Testvektoren für alle möglichen Eingaben und die erwarteten Ausgaben. Simulieren Sie das Schaltnetz mit dem CUPL-Simulator. d) Entwickeln Sie ein CUPL-Programm für einen 4-Bit-Volladdierer mit Übertrag, indem Sie die Logikgleichungen für die Ausgabepins (O0..3, carryout) in Abhängigkeit von den Eingabepins (A0..3, B0..3, carryin) angeben. Tip: Definieren Sie die Überträge carry1, carry2 und carry3 der einzelnen Stufen zunächst als interne Logikvariablen. Um das Schaltnetz im GAL16V8 realisieren zu können, müssen Sie sie dann einige von ihnen auf freie (unbenutzte) externe Pins legen, um die Anzahl der nötigen Minterme für die Ausgabepins zu verkleinern. Generieren Sie alle Testvektoren (512 Stück!) mit Hilfe eines Computerprogramms bzw. eines intelligenten Editors (Kreativität ist gefordert, wenn mann nicht alles per Hand eingeben will). Simulieren Sie Ihr Schaltnetz. e) Schreiben Sie ein CUPL-Programm für einen 3-Bit-Inkrement-Dekrement-Zähler mit RESET (Zähler auf 0 setzen), indem Sie vier Outputs des GAL16V8 als Flipflops ansteuern. Verwenden Sie die Zustandsautomatensyntax von CUPL. Nehmen Sie die erwünschte Ausgabe gleichzeitig als Zustandskodierung, damit die Outputs der Flipflops, in denen die Zustände gespeichert werden, als Outputpins (Pins 12, 13 und 14 liefern die Binärzahl) verwendet werden können. Simulieren Sie einen vollständigen Durchlauf des Zählers. Als Inputpins dienen das CLK-Signal (Pin 1) , RESET (Pin 2: reset bei "L") und UP/ DOWN (Pin 3: up bei "H"). Laboraufgabe A) Überzeugen Sie den Tutor von der Korrektheit Ihrer Testvektoren. Führen Sie die Simulationen Ihrer drei Schaltungen vor und laden Sie sie in das Demoboard. Demonstrieren Sie die korrekte Funktion. Schaltung e) wird in ein GAL16V8 gebrannt. 13. Versuch: Tristate und Busse Schauen Sie sich erneut die Multiplexerschaltung mit Transmissionsgattern aus dem 9. Versuch an. Das besondere an dieser Schaltung ist, daß die Ausgänge der beiden Transmissionsgatter eine gemeinsame Leitung treiben. Eine Leitung, die von mehreren Ausgängen getrieben werden kann, heißt Bus. Damit diese Leitung wahlweise von dem einen und von dem anderen Ausgang getrieben werden kann, muß jeder der Ausgänge abschaltbar sein. Zu den Logikzuständen "L" und "H" kommt also ein dritter Zustand "Z", der "abgeschaltet" bedeutet. Deshalb heißen abschaltbare Ausgänge Tristate-Ausgänge. Busse werden in der Computertechnik sehr oft eingesetzt, wenn mehrere Devices auf gemeinsamen Leitungen kommunizieren sollen. Die Ansteuerlogik für die Busse muß so ausgelegt sein, daß niemals zwei Treiber mit unterschiedlichen Pegeln auf dem Bus treiben, sonst besteht die Gefahr der Zerstörung von Bauteilen. Vorbereitung a) Betrachten Sie einen Bus mit zwei Tristate-Treibern als C Schaltbild für einen A Z eine logische Funktion. Eingaben sind die Zustände ("L", Tristate Treiber "H", "Z") der beiden Treiber, Funktionswert ist der Zu... mit invertiertem Steuereingang stand des Busses. Geben Sie eine Wertetabelle an, und ... Invertierer C C markieren Sie die verbotenen Zustände. A A Z Z b) Geben Sie einen logischen Ausdruck für die korrekte Ansteuerung eines Busses mit n Tristate-Treibern an. Dieser Ausdruck soll genau dann wahr sein, wenn der Zustand, der durch diese Ansteuerung (der Pins Ai und Ci) auf dem Bus entsteht, erlaubt ist. c) Unter ftp://ftp.inf.fu-berlin.de/pub/hwp97/session5/ befinden sich LogicWorks- bzw. DesignWorks-Schaltungen für die Verwendung der Digital-Input-Leiterplatte als zeilenweises "Eingabeband" auf einem vier Bit breiten Datenbus. Simulieren Sie diese Schaltung und erklären Sie ihre Funktion und Ansteuerung. Entwerfen Sie eine physikalische Schaltskizze unter Verwendung von 2*74LS253 und 1/2*74LS69 und einigen zusätzlichen Gattern. Laboraufgaben A) Bauen Sie die Schaltung aus c) auf und testen Sie sie. Vorführung! 14. Versuch: Speicher und Aufbau eines einfachen Rechners In diesem Versuch wollen wir einen kleinen Rechner aufbauen, der aus einem Prozessor, einem Eingabeband (aus dem vorhergehenden Versuch), einem sequentiellen Speicher als Befehlsspeicher und einem Kellerspeicher für die DAten besteht. Diese Devices sind mit einem vier Bit breiten Datenbus verbunden. Der Prozessor wird als einfacher Zustandsautomat in einem GALBaustein realisiert. Verständlicherweise kann er nicht viele Funktionen ausführen. Er hat einen Idle-Zustand und einen Befehls-Abarbeite-Modus, in dem die Befehle über einen Datenbus aus dem sequentiellen Speicher gelesen werden, interpretiert werden und Aktionen initiieren, die die beteiligten Devices ansprechen. Es gibt vier Befehle, die mit zwei Bits kodiert werden: "HLT"=00, "REA"=01, "DUP"=10 und "FUN"=11. Daten (4-Bit-Worte) können vom Eingabeband gelesen und auf dem Keller verarbeitet werden. "HLT" setzt den Prozessor in den Idle-Zustand. "REA" kopiert ein Datenwort von der Eingabe auf den Keller. "DUP" dupliziert das obere Datenwort auf dem Keller. Und "FUN" lädt die beiden oberen Worte vom Keller, berechnet einen neuen Wert und legt ihn statt ihrer auf den Keller. Die Berechnungsfunktion lautet: "erst bitweise XOR und dann die Bits des Ergebnisses nach links rotieren". Der Einfachheit halber wird auf eine beliebige Adressierung der Speicher verzichtet, weil sonst noch ein Adreßbus realisiert werden müßte. Befehle werden nacheinander (Es gibt keine Sprungoperationen!) – jeweils zwei Befehle à zwei Bit – über den Datenbus aus dem sequentiellen Speicher geladen. Auch die Daten werden über den Datenbus übertragen. Alle Devices am Datenbus werden mit einem gemeinsamen (synchronen) Takt gesteuert. Die richtige Ansteuerung der richtigen Devices wird durch einen zusätzlichen Dekodierbaustein aus dem Prozessorzustand ermittelt. Vorbereitung a) Damit eine synchrone Übertragung zwischen den Devices am Datenbus stattfinden kann, muß ein gemeinsames "timing" festgelegt und eingehalten werden. Wir legen hier folgendes fest: Die beteiligten Devices werden während des Taktzyklus aktiviert und vorbereitet (z.B. Adresse inkrementieren). Am Ende des Taktes liegt der Wert stabil am Datenbus, die Devices sind richtig angesteuert, und bei der steigenden Flanke wird der Wert gespeichert. Entwerfen Sie eine kleine Schaltung, die ein Signal WSTROBE aus dem Taktsignal (CLK) generiert, das kurzzeitig bei steigender Flanke von CLK "H" wird. b) Gegeben sei folgendes Diagramm für einen endlichen Automaten. Ein unbeschrifteter Pfeil bedeutet einen unbedingten Zustandsübergang, der immer erfolgt außer im resetFall. Im Falle eines reset geht der Prozessor stets in den Zustand IDLE1. Die Datenpins (A3..A0) sollen auf den Pins 2 bis 5 realisiert werden, der RESET-Pin auf 6 und RUNSTOP auf 7. Pin 1 erhält das CLK-Signal und Pin 8 bleibt unbelegt. Die Ausgabepins (Akkumulatorwert Z3..Z0) liegen auf den Pins 12 bis 15. Pins 16 bis 19 zeigen den Code des internen Zustands. von allenZust. bei reset IDLE2 IDLE1 runstop runstop cmd1=HLT cmd2=HLT FETCH1 cmd1=REA INPUT1 =DUP TOP1 PUSH1 runstop runstop FETCH2 cmd2=FUN =FUN POP1 POP2 FUNTOP1 FUNTOP2 WRITETOP1 WRITETOP2 =REA =DUP TOP2 INPUT2 PUSH2 Die Zustände sind folgendermaßen codiert (in der Reihenfolge ’h’0 bis ’h’F): IDLE1, FETCH1, PUSH1, WRITETOP1, POP1, TOP1, INPUT1, FUNTOP1, IDLE2, FETCH2, PUSH2, WRITETOP2, POP2, TOP2, INPUT2 und FUNTOP2. Schreiben Sie ein CUPL-Programm, welches diesen Automaten und einen 4-Bit-Akkummulator auf den restlichen vier Outputpins realisiert. Ein Akkumulatorwert wird in den Zuständen INPUT*, TOP* und POP* von den Datenpins übernommen und in den Zuständen FUNTOP* aus dem alten Wert und dem anliegenden Datum berechnet (s.o.). In allen anderen Fällen ändert sich der Akkumulator nicht. Entwerfen Sie einige überzeugende Testvektoren und simulieren Sie. c) Entwerfen Sie einen sequentiellen 8*4-Bit Speicher mit einem 3-Bit-Inkrement-Zähler für die Adressierung. Die Schaltung soll neben CLK und WSTROBE (s.o.) folgende Eingänge haben: • CS (Chipselect): "H", um auf den Speicher zuzugreifen • RESET: "H", um den internen Adreßzähler auf 0 zu setzen (auch bei CS="H") • MODE (Lesen/Schreiben): "L"=Speichern während WSTROBE="H", "H"=Auslesen während des gesamten Zeittaktes • INC (Inkrement): "H"=Adresse inkrementieren während CLK="H" Der Speicher hängt mit vier Dateneingangspins und vier Tristate-Datenausgangspins am Datenbus. Entwerfen Sie ein physikalische Schaltskizze und eine Stückliste auf Basis der Bausteine 74S189 (16*4-Bit-RAM), 1/2*74LS69 (4-Bit-Zähler) und weniger einfacher Gatter, indem Sie nur die unteren 8 Wörter des RAMs nutzen. d) Entwerfen Sie einen 8*4-Bit-Speicher mit dem 3-Bit-Inkrement-Dekrement-Zähler aus 12 A), den oberen 8 Wörtern des 74S189 und wenigen Zusatzgattern. Die Schaltung soll neben CLK und WSTROBE folgende Eingänge haben: • CS (Chipselect): "H", um auf den Speicher zuzugreifen • RESET: "H", um den Adreßzähler auf 0 zu setzen (auch bei CS="H") • MODE (Lesen/Schreiben): "L"=Speichern, während WSTROBE="H"; "H"=Auslesen während des gesamten Zeittaktes • COUNT (Zähleroperationen): "H"=Zähler ändern während CLK="H" (Dekrement vor Auslesen, Inkrement vor Speichern); "L"=keine Zähleränderung Auch dieser Speicher hängt mit vier Dateneingabepins und vier Tristate-Datenausgangspins am Datenbus. Er soll für unseren Rechner als Kellerspeicher verwendet werden. e) Zuletzt soll ein weiterer GAL-Baustein gebrannt werden. Erstens soll ein Bootmodus für unseren Rechner bereitgestellt werden. Im Bootmodus werden zunächst alle Devices resettet und dann zwei mal vier Wörter (das Programm) vom Eingabeband in den sequentiellen Speicher gelesen. Außerdem setzt dieses Schaltnetz die internen Zustandscodes in die richtigen Ansteuerungen für die Devices um, dabei ist folgende Tabelle maßgebend: Zustand IDLE* FETCH1 FETCH2 Ansteuerung Keller wird gelesen {top of stack kann beobachtet werden} seq. Speicher wird inkrementiert und an den Dateneingang des Prozessors gelegt. (Spezifikationsfehler, da der seq. Speicher ständig inkrementiert wird, wenn mit runstop der Zustand gehalten wird) seq. Speicher wird an den Dateneingang des Prozessors gelegt Zustand PUSH* WRITETOP* POP*, TOP* INPUT* FUNTOP* Ansteuerung Akkumulatorausgang wird enabled, Keller wird inkrementiert und geschrieben Akkumulatorausgang wird enabled, Keller wird geschrieben Keller wird enabled und (in den Akkumulator) gelesen Eingabeband wird enabled (imkrementiert sich selber) und (in den Akkumulator) gelesen Keller wird enabled, dekrementiert (vom vorangegangenen pop!) und (als Funktionsargument) gelesen Die Inputpins sollen Q3, Q2, Q1, Q0 (Prozessorzustand), BOOT (initiieren der Bootsequenz durch BOOT="L") und EOLN (end-of-line-Signal des Eingabebandes) heißen. Die Outputpins heißen ENAACCU, ENASEQ, ENASTACK, RWMEM, COUNTMEM und ENAINPUT. RWMEM und COUNTMEM werden gleichermaßen für die Ansteuerung des sequentiellen und des Kellerspeichers verwendet (beide Devices können nicht gleichzeitig angesprochen werden). So bleiben zwei Outputpins für den Automaten, der die Bootfunktion ausführt. Standardmäßig befindet sich der Automat im Dekodierzustand. Beim Empfangen des Bootsignals geht er in den Bootstep-Zustand, in dem das Eingabeband enabled, der sequentielle Speicher inkrementiert und geschrieben wird. Dies geschieht solange (mehrere Taktzyklen) bis das Eingabeband EOLN signalisiert, dann wird noch das letzte Zeichen in den sequentiellen Speicher übertragen und der Automat geht in einen Wartezustand. Das Eingabeband kann neu eingestellt werden und mit erneutem Signalisieren von BOOT werden vier weitere Wörter geladen. Zeichnen Sie den Zustandsgraphen. Implementieren Sie die gesamte Schaltung in CUPL und simulieren Sie sie mit geeigneten Testvektoren. f) Entwerfen Sie die Gesamtschaltung für den kleinen Rechner, indem Sie alle Devices – auch den Akkumulatoroutput des Prozessorbausteins mit einem Tristate-Bustreiber-Baustein (1/2*74LS541) – über den Datenbus verbinden. Die Ansteuerungsleitungen aus dem Dekodierbaustein aus e) werden mit den entsprechenden Leitungen der Devices verbunden. Laboraufgaben A) Bauen Sie Ihre Schaltung zur Erzeugung des WSTROBE-Signals auf. B) Demonstrieren Sie ihre CUPL-Simulation aus b). Bei überzeugender Funktion wird ein GAL-Baustein gebrannt, der Ihren Prozessor enthält. C) Demonstrieren Sie ihr CUPL-Programm aus c) für das Ansteuerungsschaltnetz. Nach korrekter Simulation wird das Schaltnetz in das Demoboard geladen und nochmal getestet. Dann wird ein GAL-Baustein gebrannt, den Sie in Ihrer späteren Schaltung einsetzen können. D) Bauen Sie beide Speicher-Schaltungen auf. Testen Sie sie mit Hilfe der Input- und Outputplatine und demonstrieren Sie ihre korrekte Funktion. E) Bauen Sie die Gesamtschaltung des Rechners auf und testen Sie sie mit dem Beispielprogramm, welches in der Laborsitzung ausgegeben wird.