Klausur 14.04.2012

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

2 „Gefällt mir“

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

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


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

@DaniSt:

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? :smiley:

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?