Hallo in die Runde!
Folgende Situation: Ich möchte einen endlichen Zustandsautomaten
realisieren, welcher Taktsynchron den Zustand wechselt. In der
Hochschule lernt man oftmals solch einen Automaten in zwei Prozessen zu
realisieren, ala:
1 | -- ...
|
2 |
|
3 | SW: process(CLK, RESET)
|
4 | begin
|
5 |
|
6 | if RESET = '1' then
|
7 | STATE <= INITi;
|
8 | elsif CLK'event and CLK = '1' then
|
9 | STATE <= NEXT_STATE;
|
10 | end if;
|
11 |
|
12 | end process SW;
|
13 |
|
14 | -- ...
|
15 |
|
16 | SN: process(INPUTs, STATE)
|
17 | begin
|
18 |
|
19 | count <= count - 1; -- "Timer" (downward)
|
20 |
|
21 | case STATE is
|
22 |
|
23 | when X => if ( count = 0 ) then -- # Sekunden vorbei
|
24 | NEXT_STATE <= Y;
|
25 | count <= 100; -- Aufladen auf A Sekunden
|
26 | end if;
|
27 |
|
28 | when Y => if ( count = 0 ) then -- # Sekunden vorbei
|
29 | NEXT_STATE <= Y;
|
30 | count <= 1000; -- Aufladen auf A*10 Sekunden
|
31 | end if;
|
32 |
|
33 | end case;
|
34 |
|
35 | end process SW;
|
Auch wenn das Beispiel total Sinnfrei ist, möchte ich damit mein Problem
verdeutlichen: Der Wechsel eines Zustandes soll unter anderem durch
Eingänge (hier nicht ausgeführt) eben auch durch eine bereits im
aktuellen Zustand verweilte Zeit möglich sein: "Nach A Sekunden in den
Zustand Y wechseln" ... "Nach A*10 Sekunden in den Zustand X wechseln".
Das Problem dabei ist, dass ich das:
Ja eigentlich im Taktsynchronen Prozess schreiben muss, ansonsten ist es
ja totaler Mist. Dann jedoch kann ich den Counter/Timer ja nicht mehr
entsprechend für den Folgeprozess "aufladen" (--> Mehrere Quellen für
ein Signal).
Hier ist quasi meine Frage wie man das am Besten lösen kann? Auch
interessiert es mich weshalb man so etwas überhaupt in zwei Prozessen
macht. Auf der Seite von Lothar Miller habe ich gesehen, dass man sowas
durchaus auch in einem Prozess machen kann!?
Vielen Dank für Eure Hilfe!
Gruß Justus Jonas ;)