Fakultät für Physik Prof. Dr. M. Weber, Dr. K. Rabbertz B. Siebenborn, P. Jung, P. Skwierawski, C. Thiele 19. Januar 2013 Übung Nr. 9 Inhaltsverzeichnis 9.1 Grundschaltungen (2P)..................................... 1 9.1.1 Sieben-Segment-Anzeige................................. 1 9.1.2 Schieberegister...................................... 1 9.1.3 Frequenzteiler....................................... 2 9.1.4 Lauflicht.......................................... 3 9.2 Multiplexer............................................ 5 9.3 Volladdierer............................................ 5 9.4 Debouncer............................................. 5 Vorbemerkungen Bei den beiden Übungen, die sich mit AHDL (Altera Hardware Description Language) beschäftigen, ist es wichtiger denn je, zu Hause vorzuarbeiten. Ohne sorgfältige Vorbereitung wird es nicht möglich sein, in dem gegebenen Zeitrahmen die Aufgaben durchzuführen. Sie sollten sich zumindest mit der Entwicklungsumgebung vertraut machen und sich genau überlegen, wie Sie die folgenden Aufgaben programmieren wollen. Unterschätzen Sie nicht das Problem, dass sämtliche Befehle parallel bearbeitet werden! Die bekannte sequentielle Programmierlogik bringt einen häufig nicht weiter, sondern irritiert zusätzlich. Am besten schreiben Sie den Quelltext für Ihre Lösungen bereits zu Hause und kompilieren ihn. Während der Übungen werden wir dann noch genug damit zu tun haben, verbliebene Probleme zu lösen. 9.1 Grundschaltungen (2P) 9.1.1 Sieben-Segment-Anzeige Entwerfen Sie ein Subdesign, das über Schalter binär eingegebene Zahlen zwischen 0 und 255 sowohl als Bitmuster über die LED-Reihe als auch hexadezimal auf der Sieben-Segment-Anzeige wiedergibt. Am besten verwenden Sie dazu eine Wahrheitstabelle (TABLE). 9.1.2 Schieberegister Schieberegister (SR) sind einfache lineare Verkettungen von Speicherelementen. Nach dem Takt gilt folgendes: 1 (serout, Y n ) = f(y n, X n, serin, A k ) mit Steuerung A k (k = 1... K), parallelem Dateneingang X n (n = 1... N), Registerdaten (parallelem Ausgang zur permanenten Kontrolle der Vorgänge) Y n (n = 1... N), dem seriellen Eingang serin und dem seriellen Ausgang serout, welcher identisch mit dem höchsten, bzw. niedrigsten Bit von Y ist. Die möglichen in A k codierten Grundfunktionen sind: 1. Nichts tun: Y n = Y n, serout bleibt, serin ist irrelevant 1 Der Zeitindex ist hier unterdrückt. Die Zuweisung = betrifft den nächsten Taktzyklus.
Einführung in die Elektronik 2 2. Paralleles Laden: Y n = X n, serout bleibt, serin ist irrelevant 3. Aufwärts Schieben: Y n = Y n 1, serout = Y N 1, Y 1 = serin, X ist irrelevant 4. Abwärts Schieben: Y n = Y n+1, serout = Y 2, Y N = serin, X ist irrelevant In integrierten Schaltungen werden häufig auch die Funktion 1 mit einer Leitung SEN (shift-enable), die Funktion 2 mit einer Leitung LOAD (laden) und 3 und 4 mit einer Leitung UP/DN (up/down) kodiert. Übliche Sonderformen sind: 1. Parallel-In-Seriell-Out-SR: Funktionen 1, 2 und 3; serout ist der einzige Ausgang. 2. Seriell-In-Parallel-Out-SR: Funktionen 1 und 3; serin ist der einzige Eingang, Y ist Ausgang. 3. Zyklisch rückgekoppeltes SR für spezielle Anwendungen Die ersten beiden Varianten hintereinander geschaltet werden z.b. zur seriellen Datenübertragung genutzt. Vervollständigen Sie die Wahrheitstabellen jeweils für ein Element des Schieberegisters an den Positionen Anfang, Mitte, Ende. Der Steuereingang A k umfaßt dabei die Funktionen 1 4 binär codiert (k = 1... 2). erstes Element A 1 A 2 Y 1 GND GND Y 1 mittleres Element A 1 A 2 Y n GND GND letztes Element A 1 A 2 Y N GND GND Realisieren Sie ein 8-Bit-Schieberegister in AHDL. Als Speicherelement ist das AHDL-Primitive DFF zu benutzen. Darin sind die Sonderfälle erstes Element, letztes Element und ein Array von sechs mittleren Elementen enthalten. A und X sind auf die Schalter zu legen. Die Ausgänge Y und serout sind mit den LEDs darzustellen. serin kann über einen Tastschalter variiert werden. Verwenden Sie als Taktgeber (Clock) einen Tastschalter. Die ordnungsgemäße Funktionsweise ist gut zu erkennen, wenn Sie einfache Bitmuster eingeben. Falls Sie ab und zu ein Springen des Schieberegisters bemerken, als ob es mehrere Clock-Impulse erhalten hätte, liegt die am sogenannten Prellen des Tasters, die Lösung dieses Problems ist der Debouncer aus Aufgabe 9.4. 9.1.3 Frequenzteiler In dieser Aufgabe geht es um den Einsatz von Zählern. In AHDL steht hierfür die Bibliotheksfunktion lpm counter zur Verfügung, die hier mehrfach in verschiedenen Variationen eingesetzt werden soll. Hier soll eine einheitliche niedrige Frequenz als Takt für spätere Versuche erzeugt werden. Der erste Teil der Aufgabenstellung besteht also darin, die Frequenz des Quarzes des DE1 von 50 MHz auf eine sinnvolle Grundfrequenz zu teilen. Wir entscheiden uns für eine Quantisierungszeit von 10 ms, bzw. 100 Hz Grundfrequenz. Soll ein Taktsignal mit gleichen Zeiten für 1 und 0 erzeugt werden, braucht man jedoch 200 Hz als Teilerfrequenz. Es ist vorteilhaft hierfür nicht einen Zähler mit 18 Bit zu benutzen, da eine solche Breite Probleme mit den internen Laufzeiten der Chips geben könnte. Der Vorschlag hier ist eine zweistufige Teilerkaskade, bei der zuerst ein einfacher 6-Bit-Zähler durch 64 teilt. Dessen Übertrag cout wird benutzt, um den folgenden Zähler um 1 herunterzuzählen. Dieser Zähler wird nach jedem Durchgang (alle Bits auf 0) mit f clock /(200 Hz 64) = 3906 geladen. Es genügt also ein 12 Bit breiter
Einführung in die Elektronik 3 Zähler. Dieser Wert gilt für f clock = 50 MHz, wird auf den UP Boards ein anderer Basistakt verwendet, muss das Programm entsprechend angepasst werden. Nach jedem Durchgang wird ein T-Flip-Flop getoggelt. Hierdurch wird der 100 Hz-Takt erzeugt, der den späteren Aufgaben als Clock dient. Die Megafunction lpm counter muss im Gegensatz zu z.b. der Primitive DFF noch durch die Kopfzeile INCLUDE lpm counter.inc ; eingebunden werden. Dann wird sie wie bekannt definiert: VARIABLE mycounter :lpm counter WITH (LPM WIDTH=17); weitere Details entnehmen Sie bitte der Quartus II Hilfe. 9.1.4 Lauflicht Man nehme eine Handvoll Dioden (N) und ein Schieberegister das zyklisch auf sich selbst zurückgekoppelt ist (serin=serout). Zu Beginn ist nur Bit 0 auf Null (LED1 leuchtet). Mit jedem Takt wird die Null um eine Position verschoben. Fertig ist das Lauflicht! In unserem Beispiel ist dies durch eine Zustandsmaschine (AHDL Funktion Machine with states ) etwas erweitert, um Spielraum für eine externe Bedienung zu geben. Mit dem Betätigen des Tastschalters 1 soll das Lauflicht gestartet werden, nochmaliges Betätigen stoppt die Maschine. Ein Frequenzteiler bestimmt die Geschwindigkeit und Parameter können durch Schalter eingegeben werden. Tastschalter 2 erlaubt eine interne Modifikation der Betriebsbedingungen. In Abb. 1 ist das Zustandsdiagramm dargestellt. Dazu wird unten eine Skizze der Funktionsweise gegeben. Beachte: Diese Notation entspricht keiner Norm, es ist nicht mehr als eine Liste von Stichworten. S1 (start): Kann nur verlassen werden wenn T 1 = 0 S2 (lade ext par): Lädt die Anfangswerte der Parameter von den Schaltern parallel in die internen Register; kann nur verlassen werden wenn T 1 = 1 S3 (schleifen anfang): Einsprungpunkt einer Endlosschleife; der Zähler warten zähler wird neu gesetzt S4 (funktion berechnen): Hier wird das Schieberegister getaktet (Y n ) = f(y n, X n, A k ) S5 (warten): Hier wird ein Zähler heruntergezählt und gewartet bis entweder 1. T 1 = 0; dann folgt der Zustand (ende). 2. T 2 = 0, T 1 = 1; dann folgt der Zustand (modifiziere). 3. warten zähler= 0, T 2 = 1, T 1 = 1; dann folgt der Rücksprung nach (schleifen anfang). S6 (modifizieren): Erlaubt eine interne algorithmische Veränderung der Parameter (Die Art der Veränderung bleibt Ihnen überlassen); wird nach (schleifen anfang) verlassen, nur wenn T 2 = 1 S7 (ende): Zwischenzustand zum sicheren Beenden; wird nur verlassen wenn T 1 = 1 Gestalten Sie zwei neue, interessante Lichteffekte, indem Sie 1. entweder die Parameter durch Tastschalter 2 gesteuert modifizieren (anderes Muster, andere Geschwindigkeit, andere Funktion z.b. durch Rückkopplung mehrerer Bits) 2. oder statt Tastschalter 2 eine weitere Schleife zur Modifikation des Verhaltens nutzen Als Taktgeber wird die heruntergeteilte Systemfrequenz verwendet (s. Abschnitt 9.1.3). Bereiten Sie zu Hause eine Programmodifikation vor, die mindestens zwei Funktionen zusätzlich enthält. Zeichnen Sie das geänderte Zustandsdiagramm. Sie dürfen hierfür die volle Bandbreite der Sprachund Bibliothekselemente nutzen. Sollten Sie jedoch sehr ambitioniert sein, muß das Design schon zu Hause simuliert werden, da nicht viel Zeit zur Fehlersuche während des Praktikums besteht.
Einführung in die Elektronik 4 start S1 lade_ext_par T1=0 S2 T1=1 modifiziere S6 schleifen_anfang T2=1 S3 funktion_berechnen S4 w()=0 warten ende S5 S7 T2=0 T1=0 T1=1 Abbildung 1: Zustandsdiagramm zur Kontrolle des Lauflichts
Einführung in die Elektronik 5 9.2 Multiplexer Aufgabe ist es, eine der Eingangsinformationen X n (n = 1... N) auf den Ausgang Y zu schalten. Ausgewählt werden die Eingänge durch die Selektorleitungen A k (k = 1... K). Die ausgewählte Leitung n ist binär in A k kodiert. Erstellen Sie eine Wahrheitstabelle und einen Verknüpfungsplan mit Logiksymbolen für N = 4, K = 2. Beschreiben Sie die Aufgabe für 8-Bit mit Booleschen Ausdrücken in AHDL. X n und A k werden über Schalter eingegeben, die Ausgabe Y auf eine LED gelegt. Überprüfen Sie einen aussagekräftigen Teil der Wahrheitstabelle. 9.3 Volladdierer Auf der Grundlage von Übung 8.6 kann ein 8-Bit-Ripple-Carry-Addierer konstruiert werden. Entwerfen Sie ein Design für ein Volladdierer-Element nach Üb. 8, Abb. 13b) mit Booleschen Ausdrücken in AHDL. Durch n-fache Wiederverwendung des Elements und Umbenennung der Bits, bzw. Verkettung der Carry- Signale erhalten Sie einen n-bit-volladdierer. Benutzen Sie Schalter als Dateneingänge A und B. Stellen Sie das Ergebnis C mit der Sieben-Segment- Anzeige hexadezimal dar. Das Carry-Flag c 0 ist mit einem Tastschalter zu bedienen, c 8 mit einer LED darzustellen. 9.4 Debouncer Einfache Schalter haben die Eigenschaft zu prellen ( bouncing ). Das bedeutet, der Schalter schließt, wenn er betätigt wird nicht einfach, sondern prallt eventuell noch einmal zurück, öffnet die Verbindung kurz und schließt dann erst endgültig. Dasselbe passiert analog beim Ausschalten. Diese Vorgänge finden im Inneren des Schalters innerhalb von Mikrosekunden statt und haben nichts mit einem zittrigen Finger zu tun. Benutzt man einen prellenden Schalter bei schnellen Digitalschaltungen, wird ein gegebener Impuls oft als mehrere interpretiert. Dies ist ein Standardproblem der Digitalelektronik, gegen das es unterschiedlich sichere und komplizierte Entpreller oder Debouncer gibt. Unter anderem sind die Taster der DE1 Boards bereits durch einen entsprechenden Schaltkreis entprellt. Wird dieser Aufgabenteil mit dem DE1 Board durchgeführt ist daher einer der nicht entprellten Schiebeschalter für den Takt zu verwenden. Entwerfen Sie ein einfaches Debouncer-Subdesign, das bei Tastendruck einen Zähler (AHDL Bibliotheksfunktion lpm counter) startet. Dessen Überlauf cout soll ein Flipflop setzen. Beim Loslassen des Tasters wird der Zähler wieder gestartet und das Flipflop erst bei erneutem Überlauf des Zählers zurückgesetzt. Der Inhalt des Flipflops ist nun das entprellte Signal. Der Zähler soll mit der Systemclock getaktet werden. Überlegen sie, wieviele Bit breit Ihr Zähler sein muss, um eine Verzögerung von einigen Millisekunden zu erhalten. Um die Funktionsweise zu testen muss noch beispielsweise ein weiterer Zähler verwendet werden, der als clock das Tastensignal erhählt, und dessen Zählerstand auf der Siebensegmentanzeige sichtbar gemacht wird. Mit entprelltem Taster darf der Zähler pro Tastendruck nur eins weiterzählen.