Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
Klausur 14.04.2012
Tach,
kann jemand für die 3a) eine Musterlösung anbieten? Hintergrund ist das bei mir im Praktikum an dem Zustandsdiagramm rumgenörgelt wurde.
Im Anhang ist meine Lösung.
Attachment:
Aufgabe3a.png: https://fsi.cs.fau.de/unb-attachments/post_119782/Aufgabe3a.png
Danke. Hab ich mehr oder weniger auch so. Bei Sta => S0 hab ich allerdings G! & T!
5c (VHDL)
Moin,
wäre echt super, wenn mir jemand zu Aufgabe 5c weiterhelfen könnte. Da bin ich nämlich grad am Verzweifeln…
Die Zustandssteuerung muss doch anders reagieren, jenachdem in welchem Zustand die Kaffeemaschine grade ist, richtig? Nun bekommt doch aber die Zustandssteuerung den Zustand gar nicht als Eingang. Wie soll die also wissen, in welchem Zustand die Maschine ist? Ich hab das Gefühl, ich verstehe irgendwas grundsätzliches nicht…
Der Zustand kommt doch über te_state rein oder?
Ja? Dachte ich zuerst auch, aber signal ist doch nur sowas wie eine Variablendeklaration, oder? Da steht doch nirgends, was genau für ein Signal, da reinkommt, oder sehe ich das bloß nicht? Was mich weiterhin verwirrt, ist, dass ich auch auf diesem Bild kein Signal zur Zustandssteuerung entdecken kann, das den Zustand beinhalten könnte…
5c
Der VHDL Teil sorgt bei mir auch für reine Verwirrung - kein Wunder, dass “so viele Studenten beim VHDL abkacken” (wie es ein Tutor mal so schön formuliert hat) bei solchen Aufgabenstellungen…
Trotzdem mal meine Sicht der Dinge:
te_state kann wirklich als nur eine Variable angesehen werden (Die bloß am Ende des Prozess aktualisiert wird), weil te_state nur in der Architecture und nicht in der Entity bzw. als port deklariert wurde.
“Reinkommen” muss der Zustand ja auch gar nicht, weil sich ja gerade darum die Zustandssteuerung kümmern soll und te_state nur zur Speicherung des Zustands dienen soll. Das einzigste Problem das ich dabei sehe ist die Initialisierung, darf man da se_state <= t_WTG;
vor dem Prozess schreiben?
Hier ist mal meine Lösung inklusive der Portbeschreibung aus 3b. Verbesserungsvorschläge sind erwünscht
-- 5b)
ENTITY zustandssteuerung IS
PORT(
ZuckertankInstalliert, KaffeeFertig, Enter, Z_LEER, B_LEER, W_LEER : IN BIT;
KZB, WZS, WKZ, WTG : OUT BIT
);
END ENTITY;
-- 5c)
ARCHITECTURE zs1 OF zustandssteuerung IS
TYPE te_state IS (t_WTG, _WKS, _WZS, _KZB);
SIGNAL se_state : te_state; -- State
BEGIN -- sz1
se_state <= t_WTG;
PROCESS (se_state)
BEGIN
CASE se_state IS
WHEN t_WTG =>
IF (Enter = '1' AND W_LEER = '0') THEN
se_state <= _WKS;
WTG <= '0';
WKZ <= '1';
WZS <= '0';
KZB <= '0';
END IF;
WHEN _WKS =>
IF (Enter = '1' AND B_LEER = '0') THEN
IF (ZuckertankInstalliert = '1') THEN
se_state <= _WZS;
WTG <= '0';
WKZ <= '0';
WZS <= '1';
KZB <= '0';
ELSE
se_state <= _KZB;
WTG <= '0';
WKZ <= '0';
WZS <= '0';
KZB <= '1';
END IF;
END IF;
WHEN _KZB =>
IF (KaffeeFertig = '1') THEN
se_state <= t_WTG;
WTG <= '1';
WKZ <= '0';
WZS <= '0';
KZB <= '0';
END IF;
WHEN _WZS =>
IF (Enter = '1' AND Z_LEER = '0') THEN
se_state <= t_WTG;
WTG <= '1';
WKZ <= '0';
WZS <= '0';
KZB <= '0';
END IF;
END CASE;
END PROCESS
END ARCHITECTURE;
Also als erstens mal ist die Lösung von der 5a) meiner Meinung nach das da der Takteingang und der Reset fehlt. (=> synchron getaktetes Schaltwerk).
Folglich fehlt das bei dir auch in der zustandssteuerung.
– 5b)
ENTITY zustandssteuerung IS
PORT(
Zuckertank, Kaffeefertig, Enter, Z_LEER, B_LEER, W_LEER, Plus, Minus, CLK, RST: in std_logic;
variable WZS, WKS, WTG : integer Range 0 to 5; -- Tassengroesse, Kaffeestaerke, Zuckerstaerke
KZB: out std_logic;
STATE_t_WTG : out std_logic;
STATE_WKS : out std_logic;
STATE_WZS : out std_logic;
STATE_KZB : out std_logic
);
END ENTITY;
– 5c) meine lösung:
ARCHITECTURE zs1 OF zustandssteuerung IS
TYPE te_state IS (t_WTG, _WKS, _WZS, _KZB);
SIGNAL se_state : te_state; -- State
BEGIN -- sz1
pFSM: process(CLK)
BEGIN
-- synchroner automat
IF (CLK'event and CLK = '1' ) THEN
IF RST = '1' THEN
se_state <= t_WTG;
END IF;
ELSE
CASE se_state IS
WHEN t_WTG =>
IF (Enter = '1' AND W_LEER = '0') THEN
se_state <= _WKS;
END IF;
WHEN _WKS =>
IF (Enter = '1' AND B_LEER = '0' and Zuckertank = '1') THEN
se_state <= _WZS;
ELSE IF (Enter = '1' AND B_LEER = '0' and Zuckertank = '0') THEN
se_state <= _KZB;
END IF;
WHEN _KZB =>
IF (Kaffeefertig = '1') THEN
se_state <= t_WTG;
END IF;
WHEN _WZS =>
IF (Enter = '1' AND Z_LEER = '0') THEN
se_state <= t_WTG;
END IF;
WHEN others => --nix
END CASE;
END PROCESS;
STATE_t_WTG <= '1' when se_state = t_WTG;
STATE_WKS <= '1' when se_state = _WKS;
STATE_WZS <= '1' when se_state = _WZS;
STATE_KZB <= '1' when se_state = _KZB;
END ARCHITECTURE;
5d)
ARCHITECTURE btc1 OF BeanTrunkCounter IS
SIGNAL gefuellt : in std_logic;
variable kap: integer RANGE 220 to 0;
BEGIN
pBeanCounter: process(CLK)
BEGIN
IF (CLK'event and CLK = '1' ) THEN
IF gefuellt= '1' THEN
kap = 220;
ELSE
IF Enter = '1' and se_state = '_WKS' THEN
IF (kap-WKS) >= 0 THEN
kap = kap-WKS;
B_leer = 0;
ELSE
B_leer = 1;
END IF;
END IF;
END IF;
END IF;
END process;
Stimmt den Takt hab ich komplett vergessen. Laut Spezifikation darf ja immer nur ein Ausgang ‘1’ sein die Anderen müssen auf ‘0’ sein. Werden bei deiner Lösung aber nicht alle Ausgänge nach einmaligem Durchschalten der Zustände zu ‘1’ und bleiben das auch oder überseh ich da etwas?
Heute in der Fragestunde wurde das folgendermaßen gelöst:
ARCHITECTURE zs1 OF zustandssteuerung IS
TYPE te_state IS (t_WTG, t_WKS, t_WZS, t_KZB);
SIGNAL se_state : te_state; -- State
BEGIN
PROCESS(clk) is
BEGIN
IF ( rising_edge(clk)) THEN
WTG <= '0';
WKS <= '0';
WZS <= '0';
KZB <= '0';
IF (rst = '1') THEN
se_state = t_WTG;
WTG <= '1';
ELSE
CASE (se_state) IS
WHEN t_WTG =>
IF(Enter='1' AND (NOT (W_LEER='1')))THEN
se_state <= t_WKS;
WKS <= '1';
ELSE
se_state <= t_WTG;
WTG <= '1';
END IF;
WHEN t_WKS =>
IF (Enter = '1' AND B_LEER = '0') THEN
IF (ZuckertankInstalliert = '1') THEN
se_state <= t_WZS;
WZS <= '1';
ELSE
se_state <= t_KZB;
KZB <= '1';
END IF;
ELSE
se_state <= t_WKS;
WKS <= '1';
END IF;
WHEN t_WZS =>
IF (Enter='1' AND Z_LEER='0') THEN
se_state <= t_KZB;
KZB <= '1';
ELSE
se_state <= t_WZS;
WZS <= '1';
END IF;
WHEN t_KZB =>
IF (KaffeeFertig = '1') THEN
se_state <= t_WTG;
WTG <= '1';
ELSE
se_state <= t_KZB;
KZB <= '1';
END IF
END CASE
END IF
END IF
END PROCESS
END ARCHITECTURE
ups nein du hast recht
Vielen Dank euch beiden! Ich glaube, ich verstehe es jetzt schon besser, obwohl ich auf diese Lösung wohl nicht einmal in meinen kühnsten Träumen von selbst kommen würde…
Noch eine kleine Frage: wieso wird bei dieser TYPE-Deklaration nur vor _WTG ein t geschrieben und vor die anderen nicht und in den Fällen von dem Case-Block steht ja doch wieder vor jedem ein t. Gibt es da eine allgemeine Regel dafür?
Da hatte sich ein Fehler eingeschlichen. Sollte eigentlich alle mit t_ beginnen um nicht die gleichen Bezeichner als die Ausgänge zu haben.
in deinen whens am Ende von 5 c) fehlt der else Zweig
in 5 d): Variablen nur in Prozessen verwenden und auf Zuweisungsoperatoren achten, sowie auf die Hochkommas (‘1’) bei std_logic
was ist der unterschied zwischen t_WTG und WTG.
t_WTG ist ein typ oder bin ich da auch schon falsch?
woher weiß ich was ich wo benutze?
A2 a) (CMOS):
zuerstmal soll man das Pull-Down-Netzwerk ergänzen. Ich würde dafür den schaltalgebraischen Ausdruck verwenden und doppelt negieren, allerdings soll man den erst in A2 c) hinschreiben… daher vermute ich es gibt auch ne leichtere Lösung.
Und:
ist dieser (- steht im folgenden für negation): -x5 + ( -x4 * (-x1 + -x3) * (x0 + -x2)) ? Oder doch -x0? Bin etwas verwirrt von der doppelten verlinkung von x0 links.
Für mein PD-Netzwerk hätte ich dann -[x5 * (x4 + x1x3 + ((-)?)x0x2)], je nachdem obs vorher x0 oder -x0 ist. Kann mich da jemand erleuchten?
edit: zur schnelleren Lösung der a), es reicht wohl auch wenn man alle sequentiellen in parallele Teile und umgekehrt umwandelt. Korrekt?
edit2: Etwas später, bei der A4 c) ii), es geht um Fehlerkorrektur bei einem (7/4)-Hamming-Code. Die letzte empfangene Sequenz ist: 1010 101 . Hier liegt auf jedenfall mehr als ein 1-Fach-Fehler vor, kann ich das dann überhaupt korrigieren?