Forum: FPGA, VHDL & Co. Taktsynchroner Zustandsautomat (Problem mit zeitbedingtem Zustandwechsel)


von Justus Jonas (Gast)


Lesenswert?

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:
1
count <= count - 1;

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 ;)

von Justus Jonas (Gast)


Lesenswert?

Ich sehe gerade, dass ich im Falle eines Resets in den Zustand INITi 
gehe. Hier sollte eigentlich entweder X oder Y stehen!

von Achim S. (Gast)


Lesenswert?

Justus Jonas schrieb:
> Das Problem dabei ist, dass ich das:
> count <= count - 1;
> Ja eigentlich im Taktsynchronen Prozess schreiben muss, ansonsten ist es
> ja totaler Mist.

Auch ein Counter ist sowas wie eine Statemachine.

Also schreibe im kombinatorischen Prozess:
   next_count <= count -1;
bzw.
   next_count <= 100;

Und in den getakteten Prozess kommt:

   count <= next_count;

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Justus Jonas schrieb:
> Das Problem dabei ist, dass ich das:count <= count - 1;
Du hast zuallererst ein Problem mit der Zwei-Prozess-Schreibweise eines 
Automaten. Und daraus resultiert dann eine kombinatorische Schleife.
Siehe
http://www.lothar-miller.de/s9y/archives/43-Ein-oder-Zwei-Prozess-Schreibweise-fuer-FSM.html
Und
http://www.lothar-miller.de/s9y/categories/36-Kombinatorische-Schleife
Und als Konsequenz
http://www.lothar-miller.de/s9y/archives/16-Takt-im-Prozess.html
Und die Sache mit dem Reset solltest du dir auch nochmal ansehen. Aber 
was sage ich? Das ist ja ein "Running Gag", der gefühlt einmal pro Woche 
kommt...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.