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:
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.