Projekt 7-Segmentanzeige

Theorie
Die 7-Segmentanzeige ist die einfachste Möglichkeit die Zahlen 0 bis 9 darzustellen. Die Anzeige besteht aus 7 einzeln ansteuerbaren Leds. Davon sind auf dem DE2-115 Board insgesamt 8 Stück vorhanden. Für die Darstellung im Binärsystem der Zahlen 0 bis 9 werden insgesamt 4 Bit benötigt. Diesen Code bezeichnetet man mit BCD (Binär codierte Dezimalzahl).

Die gesamte Anleitung kann auch als Anleitung_7_Segmentdekoder.pdf oder im Downloadbereich heruntergeladen werden.

1.Schritt Gestartet wird auch dieses Projekt mit dem Projekt-Wizard. Vorher wurde ein Ordner mit dem Namen Segmentanzeige angelegt (Hinweis: Die Verwendung von Sonderzeichen, Umlauten und Zahlen in den Ordnernamen und Projektnamen sollte man vermeiden, u.U. Gibt es sonst unerwartete Fehlermeldungen). Nach der Zuordnung auf den neuen Ordner wird als Projektnamen Segmentanzeige und für die Top-Level-Entity Seg_top eingetragen. Nun kann mit der Schaltfäche Use Existing Project Settings... das erste Projekt eingelesen werden. Beide Warnhinweise werden jeweils mit NO quittiert und danach mit Finish der Wizard beendet.
2.Schritt Zur Erstellung unserer VHDL-Datei verwenden wir wieder den BLOCK-Editor, den wir mit File New und der Option Block Diagram aufrufen. Nachdem wir den neuen Block erstellt haben, klicken wir mit der rechten Maustaste in den Block und in dem neuen Fenster wählen wir Properties aus (ausführlich ist dies in der Anleitung zum Flip-Flop beschrieben). Der Blockname lautet wie unsere Top-Level-Entity Seg_top. Bei dem I/O-Reiter könnten wir jetzt 4 Eingabeports und 7 Ausgabeports einzeln eintragen, das ist sehr lästig. Wir tragen jetzt nur einen Eingabeport seg_in und einen Ausgabeport seg-out ein. Mit der rechten Maustaste klicken wir wieder in den Block und wählen diesmal den Punkt Create Designfile From Selected Block an. Wir markieren VHDL und als Filenamen geben wir Seg_top.vhd an. Aus dem danach angezeigten VHDL-File löschen wir wieder alle grünen Kommentarzeilen heraus. Haben wir alles richtig gemacht, erhalten wir folgendes VHDL-File:


3.Schritt
Nun müssen wir die Schnittstellen in der Entity per Hand ändern. Neben der Definition von einzelnen Signalen können wir auch ganze Signalblöcke, auch als Signalbusse bezeichnet, definieren. Dazu dient der Schlüsselbegriff STD_LOGIC_VECTOR. In Klammern wird dahinter angegeben, wie „breit“ der Bus ist. Für die Eingabe benötigen wir 4 Signale, für die Ausgabe 7. Möchten wir die in der Informatik übliche Nummerierung der Bits verwenden, sollten wir die Busse von links nach rechts durchzählen. Der Befehl dazu lautet z.B. (3 downto 0) für unseren Eingabe-Bus. Damit sieht unser File nun so aus:


4.Schritt
Ist das VHDL-File soweit fertig gestellt, können wir das Projekt das erste Mal mit Start Analysis & Synthesis für den PIN-Planer vorbereiten, den wir nach erfolgreichem Abschluß aufrufen. Dort sind nun alle Pins aufgeführt (11 Stück), die wir jetzt einzeln zuweisen müssen. Die genaue Belegung aller Pins des DE2-115 ist in der PIN-Planer Anleitung zu finden. Für unsere Anzeige verwenden wir die erste 7-Segmentanzeige, die mit HEX0 bezeichnet wird.


5.Schritt
Jetzt müssen wir uns erst mal Gedanken zu unserer Anzeige machen. Wir wollen die Zahlen 0 bis 9 darstellen. Die Bits werden dabei von oben im Uhrzeigersinn von 0 bis 5 durchgezählt. Das Bit 6 ist dann der Strich in der Mitte. Das Punkt unter links brauchen wir für unsere Anzeige nicht, er ist deshalb hier nicht aufgeführt.


So sehen die einzelnen Zahlen aus:
0
1
2
3
4
5
6
7
8
9











 
BCD
7 Segment
Bit3
Bit2
Bit1
Bit0
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
 0
0
0
0
0
0
1
1
1
1
1
1
1
0
0
0
1
0
0
0
0
1
1
0
2
0
0
1
0
1
0
1
1
0
1
1
3
0
0
1
1
1
0
0
1
1
1
1
4
0
1
0
0
1
1
0
0
1
1
0
5
0
1
0
1
1
1
0
1
1
0
1
6
0
1
1
0
1
1
1
1
1
0
0
7
0
1
1
1
0
0
0
0
1
1
1
8
1
0
0
0
1
1
1
1
1
1
1
9
1
0
0
1
1
1
0
0
1
1
1

Wir müssen jetzt noch folgendes beachten: Die Eingabetaster liefern bei gedrücktem Taster den Wert '0' und bei nicht gedrücktem Taster den Wert '1'. Deshalb definieren wir ein internes Signal mit der Bezeichnung bcd, dies erleichtert uns später die Weiterentwicklung.

Die zweite Stolperfalle ist, dass die 7-Segmentanzeigen eine gemeinsame Anode (+ Pol) haben. Daher leuchtet bei einer logische '0' das Segment, bei einer logischen '1' nicht. Wir definieren auch hier ein internes Signal mit der Bezeichnung seg7, welches genau unserer Wahrheitstabelle entspricht. Nun sind wir in der Lage, unsere Anzeige umzusetzen.

Hinter ARCHITECTURE werden die beiden besprochenen Signale definiert. Beide müssen die gleiche Busbreite haben wie die Eingangs- bzw. Ausgangssignale.


Mit einer CASE-Liste wird nun die Wahrheitstabelle umgesetzt. Die Bedingung ist das bcd-Signal, dem Signal seg7 wird dann genau unsere Wahrheitstabelle zugeordnet.

Mit seg_out <= not seg7 erfolgt die Umsetzung auf die 7-Segmentanzeige. Würde man eine 7-Segmentanzeige mit gemeinsamer Kathode (- Pol) benutzen, könnte diese Anweisung entfallen.

Der Befehl others in der CASE-Liste ist wichtig, da sonst undefinierte Zustände übrig bleiben, was zu einer Fehlermeldung führt. In unserem Fall wird die Anzeige bei den verbleibenden 6 Zuständen einfach dunkel geschaltet.


Das komplette VHDL-File kann als Seg_top.txt hier heruntergeladen werden und mit Copy und Paste eingefügt werden.                    


6.Schritt
Das Programm muss jetzt nur noch übersetzt und übertragen werden. Die Vorgehensweise ist ausführlich im ersten Beispiel beschrieben.

Das ganze Projekt kann als Segmentanzeige.zip hier heruntergeladen werden.