Roman Gräf
Der Schaltkreis besteht aus dem Input aus zwei Dreierketten von D-Flip-Flops, eine um Drei An-Takte zu überprüfen, und eine um Drei-Aus-Takte zu überprüfen.
Die Dreierketten haben als Input in die D-Flip-Flops immer den Output des vorherigen D-Flip-Flops, geodert mit dem invertierten Reset-Signal und entweder dem Sensor-Input, oder dem invertierten Sensor-Input, für die An/Aus-Kette jeweils. Zusätzlich ist nach den beiden Ketten eine Schaltung um ein Output bis zum nächsten Reset zu erinnern. Der Output der letzten Kette wird an den Bus geschickt.
Dieser Schaltkreis kann fast alle Inputs einfach entweder an Motorcontrol weiterleiten, oder an den Bus zurückleiten. Die Ausnahme bildet C, welches bei einer Änderung des D_in(bus) Signals für einen Takt 1 wird. Dementsprechend ist C das XOR von D_in und dem D_in des letzten Takts (durch ein D-Flip-Flop verzögert)
C ist in dieser Schaltung ungenutzt. Theoretisch könnte C in Verbindung mit dem Signal das in R führt in eine S-R-Latch geführt werden die den Motor an oder Ausschaltet. Das erweist sich allerdings als nicht notwendig, da der Motor sowieso nur läuft wenn er nicht am Ziel ist (welches sich bei einer Änderung von D_in sowieso ändert). Da jedes Signal von C auch eine Änderung an D_in bedeutet, heißt dass das C hier ignoriert werden kann.
Die Schaltung besteht im Wesentlichen aus einer 9-bit D-Flip-Flop Speicherzelle, die solange der Motor läuft entweder 0x1 oder 0x1ff addiert, abhängig von D_in. Hierbei wird der Overflow von Binärzahlen ausgenutzt, wodurch eine Addierung von 0x1ff zu einer Subtraktion von 0x1 führt.
Der aktuelle Zustand der Speicherzelle wird mit entweder 0x0 oder 0x1ff verglichen. Abhängig von der Fahrrichtung (D_in) wird das eine oder das andere Ergebnis gewählt. Das Ergebnis dieser Kalkulation ist ein Wahrheitswert der beschreibt ob wir am Endzustand in diese Richtung sind. Falls dem der Fall ist, wird R gesetzt und der Motor gestoppt. Das Signal an den Motor wird zusätzlich noch mit dem invertiertem Emergency-Input geundet, so dass der Emergency-Knopf die Motoren ausschaltet und die Addierungen anhält.
Die Outputs zu den Motoren sind für beide Motoren gleich, dementsprechend habe ich sie hier zusammengefasst.
| Getränk | Code |
|---|---|
| Wasser | 00001 |
| Wasser m. Eiswürfeln | 00011 |
| Cola | 00101 |
| Cola o. Zucker | 00100 |
| Cola m. Eiswürfeln | 00111 |
| Cola m. Eiswürfeln o. Zucker | 00110 |
| Orange | 01001 |
| Orange o. Zucker | 01000 |
| Orange m. Eiswürfeln | 01011 |
| Orange m. Eiswürfeln o. Zucker | 01010 |
| Zitrone | 01101 |
| Zitrone o. Zucker | 01100 |
| Zitrone m. Eiswürfeln | 01111 |
| Zitrone m. Eiswürfeln o. Zucker | 01110 |
| Kaffee | 10000 |
| Kaffee m. Zucker | 10001 |
| LatteMachiato | 10100 |
| LatteMachiato m. Zucker | 10101 |
| Cappuccino | 10110 |
| Cappuccino m. Zucker | 10111 |
| Tee | 11000 |
| Tee m. Zucker | 11001 |
Diese Kombinationen sind noch nicht besetzt: 11011 11010 10010 10011 11100 11111 11101 11110 00011 00001
Wenn man dem logischem Aufbau der anderen Getränke folgt kann man einen Teil als Wasser (mit oder ohne Eiswürfel) mit Zucker sehen (00001 und 00011). Der Rest wären jeweils zwei Varianten von Tee und Kaffee (jeweils für gezuckert und ungezuckert), sowie ein komplett neues Heisgetränk welches auch zwei mal zwei Varianten hätte.
Der Takt für diese Zweistufenpipeline muss 1/9 Hz sein, da die Wasserkühlung 9s braucht um das Wasser zu kühlen.
Syntax für das hier:
STATE name outputname=outputvalue outputname2=outputvalue
TRANSITION vonname, inputname=inputvalue & inputname2=inputvalue2 -> zuname
n TIMES -> i:
STATE erzeugt einen state, TRANSITION gibt eine transition an. n TIMES wiederholt den block n mal mit der variable i gesetzt.
STATE shutdown
INITIAL_STATE 50_wait
50 TIMES -> i:
STATE $i_wait
32 TIMES -> g:
STATE $i_drink_$g G_in=1 Y(G)=$g
TRANSITION $i_wait, V & $g -> $i_drink_
TRANSITION $i_drink_ -> $i_door_opening
STATE $i_door_opening S_in=1 S_out=1 Y(D_in)=1
TRANSITION $i_door_opening, X(R)=1 -> $i_door_open
TRANSITION $i_door_opening, X(D_in)=0 -> shutdown
STATE $i_door_open L_out=1
TRANSITION $i_door_open, X(O) -> $i_person_passed
STATE $i_person_passed L_in=1 Y(R)=1
TRANSITION $i_person_passed -> $i_door_closing
STATE $i_door_closing S_in=1 S_out=1 Y(D_in)=0
TRANSITION $i_door_closing, X(D_in)=1 -> shutdown
TRANSITION $i_door_closing, X(R)1 -> $i_door_closed
STATE $i_door_closed D_in=1, X(D)=$i
IF $i == 1:
TRANSITION $i_door_closed -> shutdown
ELSE:
TRANSITION $i_door_closed -> $(i-1)_wait
Ich hoffe hier war kein Diagram gefordert, mir war allerdings nicht klar wie ich das mit so vielen Zuständen sinnvoll zeichnen soll.