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.

Documentos relacionados