Mann, da hats mich selber zerlegt:
StartSM2 = '1' ist ein Flag, das die SM2 anstösst/startet.
StateHSM sind die Zustände der Haupt-SM
StateSM2 sind die Zustände der Sub-SM
(Achtung: StateSM2 sieht fast aus wie StartSM2)
Das
>StartSM2<=IDLE ;
ist ein doofer Tippfehler
richtig ist
>StateSM2<=IDLE ;
StartSM2 = '1' startet die SM2.
In der HSM wird im Zustand HS1 gewartet, bis die SM2 fertig ist.
Wenn die SM2 durch ist, dann wartet die SM2,
bis die HSM auf den nächsten Zustand weitergeschaltet hat.
Dieses letzte Warten (ein Handshake) wäre eigentlich nicht nötig, aber
es definiert eine klare Abhängigkeit der beiden SM. Die SM2 kann hier
erst dann weitermachen, wenn die HSM erkannt hat, dass die SM2 fertig
ist.
Ohne Synchronisation der beiden SM sparst du dir diese Abhängigkeit.
Dann wird SM2 nur gestartet und rennt einmal durch:
(restlicher Code s.o.)
1 | :
|
2 | :
|
3 | case (StateSM2) is
|
4 |
|
5 | when IDLE =>
|
6 | if StartSM2 = '1' then -- SM2 wird gestartet
|
7 | StateSM2<=SM2S1 ;
|
8 | end if;
|
9 | :
|
10 | :
|
11 | when SM2S4 => -- SM2 ist fertig
|
12 | :
|
13 | StateSM2<=IDLE ; -- hier war der Teppfihler StartSM2
|
14 | :
|
15 | :
|
16 | end case;
|
17 | :
|
18 | :
|