> c <= c+1;
Grundsätzlich: Zählen können nur FFs, keine Kombinatorik.
Und FFs sind getaktet.
Das geht in der Simulation nur durch, weil deine Sensitivity-Liste
unvollständig ist.
1 | process(state,c) <<< Kombinatorik, hier fehlt c
|
2 | begin
|
3 | case state is
|
4 | when state0=>
|
5 | --Grundzustand
|
6 | c<= 0; -- c zurücksetzen
|
7 | next_state <= state1;
|
8 |
|
9 | when state1=>
|
10 | c<=c+1;
|
11 | -- Zählzustand
|
12 | next_state <= state2;
|
13 |
|
14 | when state2 =>
|
15 | c<=c; -- c beibehalten
|
16 | --andere befehle
|
17 | next_state <= state0;
|
18 |
|
19 | end case;
|
20 | end process;
|
Wenn du die korrigierst, dann wird deine Simulation das machen, was die
Hardware aucht tut: im State1 c mit maximaler Geschwindigkeit
hochzählen.
Dein Fehler ist jetzt noch nicht behoben, der liegt nämlich in deiner
Denkweise. Du denkst, der getaktete Teil ist nur zum Weiterschalten des
States, richtig? Aber ist nicht ein Zähler auch nur eine SM? und müsste
der Zähler dann nicht auch ein wenig vom Takt abbekommen, (z.B.
wenigstens eine steigende Flanke)?
1) Sieh dir mal den Beitrag "Re: FSM springt nicht in nächsten Status"
an.
2) Bringe dir die 1-Prozess-Schreibweise (such mal hier im Forum) bei.
2) Wirf das Buch weg, wenn nur diese 2-Prozess-Schreibweise drinsteht.