Beruflich Dokumente
Kultur Dokumente
U-Nr.: U20470
Matrikel-Nr.: 11963
Uwe Kemnitz
U-Nr.: U21434
Matrikel-Nr.:
Aufgabe:
Die Aufgabe bestand darin mit 4 Platinen gleicher Bauart eine Addition und
Subtraktion im Hexadezimalbereich durchzuführen und das Ergebnis auszugeben.
Inhaltsverzeichnis
1. Allgemeine Problemstellung
1.1 Aufgabe
2. Benutzerhandbuch
2.1 Ablaufbedingungen
2.3 Bedienungsanleitungen
2.4 Fehlermeldungen
2.5 Wiederanlaufbedingungen
3. Programmierhandbuch
3.1 Entwicklungskonfigurationen
3.4 Programmorganisationen
3.5 EVA-Diagramme
4. Kommentierung
1.Allgemeine Problemstellung:
1.1 Aufgabe :
Die Aufgabe bestand darin mit 4 Platinen gleicher Bauart eine serielle Addition und
Subtraktion im Hexadezimalbereich durchzuführen und das Ergebnis auszugeben.
Die Platine 1 und die Platine 2 dienen bei dieser Aufgabe als Eingabegeräte, diese werden
mit 3 Tastern bedient. Zum Freischalten der Einzelsegmente und Weiterschalten dient der
unten markierte Taster 1, dadurch werden die 7 Segmente der jeweiligen Anzeige zum
Blinken angesteuert, so ist festzustellen welche der 3 verschiedenen Zahlen eingeben
werden.
Taster UP zum
Spannung Hochzählen
Versorgung 5V
Taster Down
Übertragungskabe zum Runter
l zählen
Programmierbar
er Chip
7 Segmentanzeigen
Taster 1
Weiterschalten
Sobald eine der 7 Segmentanzeigen ausgewählt wurde, ist es möglich mit dem Taster UP
oder Down die jeweiligen Ziffern von 0 bis F eingeben zu können. Um Hochzuzählen wird
der jeweilige Taster betätigt bis die gewünschte Zahl erreicht wird.
Nach dem die Zahlen eingegeben sind, ist es möglich auf der Platine 3 zwischen Addition
und Subtraktion auf der Segmentanzeige umzuschalten. Dies kann mit den Schaltern UP
und Down der Platine 3 realisiert werden. Die Platine 3 kann eine serielle Addition und eine
serielle Subtraktion ausführen.
Es muss auch mit den entsprechenden Problemen gerechnet werden die bei einer Addition
oder Subtraktion auftreten, wie z.B. Übertrag bzw. Borgen.
Durch Betätigung mit dem Taster1 der Platine 3 werden die in der 1. und 2. Platine enthalten
Werte, durch die 3x4 Bit Verschiebung in die 3. Platine transferiert. Dort wird die
entsprechende Addition oder Subtraktion durchgeführt und das Ergebnis in die letzte Platine
geschoben (Hexadezimal).
2.Benutzerhandbuch
2.1 Ablaufbedingung
Es müssen alle 4 Platinen mit der Betriebsspannung von 5V betrieben werden und
verbunden sein, sodass man diese auch dementsprechend ansteuern kann. Die
Einzelplatinen lassen sich durch je 3 Taster bedienen.
Die Einzelprogramme werden mit Hilfe einer seriellen Schnittstelle auf die einzelnen Platinen
von dem Programm ispLEVER classic aufgespielt.
Sobald das geschehen ist, können die jeweiligen Platinen verwendet werden.
2.3 Bedienungsanleitung
Platine 1:
Mit dieser Platine kann man zwischen den 7 Segment Anzeigen durchschalten. Wenn eine
Anzeige gewählt wurde, kann sie mit dem Taster Up oder Taster Down erhöht oder
minimiert werden (Hexadezimal).
Platine2:
Platine3:
Bei dieser Platine kann man zwischen Addition und Subtraktion umschalten. Die Werte der
Platine 1 und 2 werden in die Platine 4 mit einem Schieberegister weitergeleitet.
Platine4:
In dieser Platine wird das Ergebnis der zuvor in Platine 3 berechneten Werte gespeichert
und angezeigt.
2.4 Fehlermeldungen
2.5 Wiederanlaufbedingung
Wenn die Addition oder Subtraktion durchgeführt wird, können jederzeit die Werte geändert
werden um eine Berechnung durchführen zu können.
3.Programmierhandbuch
3.1 Entwicklungskonfigurationen
Das gesamte Programm wurde auf einem Rechner mit Windows XP mit der dazugehörigen
Software ispLever, isp VM System erstellt und aufgespielt.
Problematisch ist es, sich mit den Einzelkomponenten auseinander zu setzen. Diese werden
auf einer Testplatine getestet mit den jeweilig selbst geschriebenen Programmen
Taster zum
Hochzählen
Programm
Schnittstelle
Taster zum
Runterzählen
Spannungsv
ersorgung
über USB 7 Segmentanzeigen
Programmierbar
er Chip Taster zum
Weiterschalten
Platine 1 und 2 sind fast identisch, sie unterscheiden sich nur in der Pin Belegung zur
Weiterleitung, es ist zu überlegen, wie man die Zahlen darstellt und zwischen den
Segmenten durchschaltet und diese weitergibt zur Platine3.
Es ist wie folgt vorzugehen: Es wird ein Zähler mit der entsprechenden Segmentansteuerung
realisiert. Dort ist ein Fehler aufgetreten, der von dem weiterschaltenden Signal bei
ansteigender Flanke, Prellen (mehrfaches Schalten bei einer Schaltsequenz) verursacht
wird. Dieses wird mit einem 2 flankengesteuertem D-FlipFlop und einer logischen &
Verknüpfung gelöst.
Nach dem das erledigt ist, können die Zähler hochlaufen bzw. runter laufen. Damit die
Zahlen weitergereicht werden, musste ein 3x4 Bit Schieberegister entwickelt werden welche
später direkt in die zähler indigiert wurden um Macrozellen zu sparen . Die Schieberegister
sind dazu notwendig die 7 Segmente der einzelnen Anzeigen zu verschieben, sodass die
Zahlen in die 3. Platine übertragen werden.
In der 3. Platine ist ein seriellen Addierer und einen seriellen Subtrahierer realisiert, so dass
die von Platine 1 und Platine 2 Werte addiert oder subtrahiert wurden.
Die Anzeige für Add und Sub wurde wie in Platine 1 und 2 ausgegeben, so dass es
ersichtlich ist in welcher Operation die Platine 3 arbeitet.
Probleme: Geringfügige Probleme gab es nur mit dem Überlauf und dem Borgen bei der
Addition und bei der Subtraktion.
-Eine Komponente die endweder die Ergebnisse von ADD oder SUB weitergibt
In der 4. Platine wird nur eine Ausgabe realisiert. Die Werte die in diese Platine geschoben
werden sind auf der 7 Segmentanzeige ersichtlich.
Die 7 Segmentanzeige aus Platine 1 und 2 wird identisch übernommen um die Zahlen
auszugeben.
3.3 Beschreibung grundlegender Datenstrukturen
Jedes der Programme besteht aus einem Grundgerüst wo Eingänge und Ausgänge
beschrieben werden.
Bild:
In diesem Rahmen werden jetzt alle anderen Prozesse oder Komponenten festgelegt auch
die logischen Abfragen wie if und else Anweisungen. (if/else in Prozess)
Die entsprechenden
Komponenten zu den
Instanzen
Instanzen
3.4 Programmorganisation 7
Segmentanzeigen
Übertragungsleitungen
Zähler zum
hoch und
runter zählen
mit der
Ausgabe auf
die 7
Segmente der
Anzeige
Weitergabe
der Zahlen zur
Platine 3
Platine 3
Weitergabe der
umgerechneten
Zahlen in Platine
4
Zahlen von
Platine 1 und 2
Auswahl der
Addition oder
Subtraktion
Übertrag oder
Borgen bei
Addition und
Anzeige über
Subtraktion
Addition oder
Subtraktion
Schieberegiste
r
Platine 4
Schieberegiste
r
Anzeige des
Ergebnisses
aus Platine 3
Zahlen von
Platine 3
Kommentierung
library ieee;
use ieee.std_logic_1164.all;
entity Platiene1 is
port ( schalterUp :in std_logic; -- Taster zum hochzählen
schalterDown :in std_logic; -- Taster zum runterzählen
schalterWahl :in std_logic; -- Taster zum segmente durschalten
clock:in std_logic; -- Schiebe und zähltakt (systemtakt)
clockslow:in std_logic; -- Takt zum Blinken
UebertragungAktiv :in std_logic; -- Bit um Übertragung aktiv zu schalten
S0: out std_logic_vector (0 to 6);
S1: out std_logic_vector (0 to 6);
S2: out std_logic_vector (0 to 6);
BitLeitung: out std_logic); -- Serieller ausgang der platiene
end;
begin
inst1: entprel port map (clock,schalterUp,schalterUpE);
-- Entprell instanz für den HochSchalter
inst2: entprel port map (clock,schalterDown,schalterDownE);
-- Entprell instanz für den RunterSchalter
inst3: entprel port map (clock,schalterWahl,schalterWahlE);
-- Entprell instanz für den WahlSchalter
inst4: zt1 port map (schalterWahlEn,clock,Mode);
--ZT1 instanz um festzulegen welcher ZT2 aktiv ist
inst5:zt2 port
map(clock,clockslow,UebertragungAktiv,Mode(0),schalterUpE,SchalterDownE,BN1,BN0,S0)
;
inst6:zt2 port
map(clock,clockslow,UebertragungAktiv,Mode(1),schalterUpE,SchalterDownE,BN2,BN1,S1)
;
inst7:zt2 port
map(clock,clockslow,UebertragungAktiv,Mode(2),schalterUpE,SchalterDownE,BN0,BN2,S2)
;
-- 3 mal ZT2 istanzen zum zählen schieben und sieben segment ausgabe
Bitleitung <= BN0;
end struktur;
Zählertyp 2
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity zt2 is
port ( clk: in std_logic; -- Takt 32 Hz
-- Übertragungstakt und der Takt für den Zähler st der gleich da sonst
-- ein Multiplever mit dem Takt erzeugt wird
blink: in std_logic; -- langsammer Takt um segmente blinken zu lassen
Send_Enable: in std_logic;--wenn aktiv, Uebertragung mit Bitrate 32 Hz
Count_Enable, Count_Up, Count_Down : in std_logic;-- Steuersig. Zähler
Seriell_In: in std_logic; -- serieller eingang der vorwerte beim schieben
Seriell_Out: out std_logic; -- serieller ausgang beim Schieben
SevSeg: out std_logic_vector(0 to 6)); -- sieben segment ausgang
end;
begin
process (clk)
begin
-- ########## ########## ########## ########## ########## ##########
if clk'event and clk='1' then -- bei ansteigender Taktflanke
if (Send_Enable='0' ) then --wenn nicht übertragen wird dann zähler aktiv
entity zt1 is
port (up, clk: in std_logic; -- up zähler hochzählen, clk event Takt
q: out std_logic_vector (2 downto 0));-- ausgang des
multiplexers
end;
begin
process (clk) -- syncon abhängig von clk
begin
if clk'event and clk = '1' then -- bei TaktFlanke
if (up = '1') then -- und erhöhungsbedinging
value <= value +"01"; -- erhöhen um eins
end if;
end if;
end process;
q(0)<= value(0) and not value(1); -- Taktunabhängiger Multiplexer
q(1)<= not value(0) and value(1); -- Taktunabhängiger Multiplexer
q(2)<= value(0) and value(1); -- Taktunabhängiger Multiplexer
end bhv;
Entprellung
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity entprel is
port (schalter : in std_logic ; -- asynchroner Eingang
clk : in std_logic ; -- Abtasttakt
quit : out std_logic); -- Ausgangssignal
end;
library ieee;
use ieee.std_logic_1164.all;
----------------------------------------------
component Serieladd -- Serieller addierer welcher aus dem
-- volladdierer entseht und den ubertrag speichert
port (ai: in std_logic; -- 1. Summand seriell
bi: in std_logic; -- 2. Summand seriell
clk: in std_logic; -- Takt
ergebniss: out std_logic); -- Ergebniss seriell
end component;
----------------------------------------------
component Serielsub -- Serieller subtrahierer welcher aus dem
-- vollsubtrahierer entseht und den ubertrag speichert
port (ai: in std_logic; -- Minuend seriell
bi: in std_logic; -- Subtrahend seriell
clk: in std_logic; -- Takt
ergebniss: out std_logic); -- Ergebniss seriell
end component;
----------------------------------------------
component ZT3 -- ein zähler der bis 12 zält und sich dan zurücksetzt
-- und solage die übertragung aktiv hält
port ( clk: in std_logic; -- Takt
Los: in std_logic; -- Startsignal um 12 Takte Aktiv zu sein
aktiv : out std_logic); -- wird während des zählens aktiv gesetzt
end component;
----------------------------------------------
component seg -- giebt abhängig von zustand add oder sub
-- auf den ersten 3 segmenten aus
port (zustand: in std_logic;-- zustand add oder sub
seg1: out std_logic_vector(0 to 6); -- ausgabe segmente
seg2: out std_logic_vector(0 to 6); -- ausgabe segmente
seg3: out std_logic_vector(0 to 6)); -- ausgabe segmente
end component;
----------------------------------------------
component zustand -- speichert ob plus oder minus
port (plus :in std_logic; -- setzt auf Plus
minus :in std_logic; -- setzt auf minus
Aktiv :in std_logic; -- sperrt/erlabt änderungen
zustand: out std_logic); -- ausgabe des gespeicherten zustands
end component;
----------------------------------------------
component Wahl -- je nach zustand von zustand wird die addition
-- oder subtraktion durchgereicht
port (add :in std_logic; -- serieller eingang von der addition
sub :in std_logic; -- serieller eingang von der subtraktion
zustand :in std_logic; -- zustand ob add oder sub
ausgang :out std_logic); -- serieller ausgang
end component;
----------------------------------------------
begin
end behavioral;
Segmentansteuerung
Volladdierer
Serieller Addierer
Vollsubtrahierer
Serieller Subtrahierer
ZählerTyp 3
Main Platiene 4
library ieee;
use ieee.std_logic_1164.all;
entity platine4 is
port( BitLeitung: in std_logic; --Serielle Biteing. Leitung von
Platiene 3
Systemtakt: in std_logic; -- Systemtakt von Platiene 3
Uebertragung: in std_logic; -- Signal ob Übertragung aktiv
Seg0: out std_logic_vector (0 to 6); -- Segmentanzeigen ausgänge
Seg1: out std_logic_vector (0 to 6); -- Segmentanzeigen ausgänge
Seg2: out std_logic_vector (0 to 6)); -- Segmentanzeigen ausgänge
end;
end struktur;
Ausgabenetzwerk mit speicher
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
begin
process (uebernahme) -- prozess syncron abhängig von der übernahme
begin
end process;
end behavioral;
Schieberegister mit paralelem ausgang
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;