Forum: FPGA, VHDL & Co. State Machine Zähler-Problem


von Julian (Gast)


Angehängte Dateien:

Lesenswert?

Hallo miteinander!

Ich bin grad dabei für meine Studienarbeit was kleines in VHDL zu 
programmieren. Soll eine Ansteuerung für nen Display werden 
(Schachbrettmuster). Das Problem ist dabei der Counter in einer der 
State Machines. Der macht leider nicht unbedingt was er soll. Ich hab 
das ganze mal nur auf den Counter (c) reduziert und die zustände 
eingeschränkt und direkt verzweigt (ohne IFs), damits net so 
unübersichtlich ist.


1
library IEEE;
2
use IEEE.std_logic_1164.all;
3
4
entity state_machine is
5
6
port(reset, clk : in std_logic;
7
  co: out INTEGER RANGE 0 to 7);
8
9
end state_machine;
10
11
architecture behavioral of state_machine is
12
13
type statetype is (state0, state1, state2);
14
signal state,next_state : statetype:=state0;
15
signal c: integer:=0;
16
17
begin
18
19
process(state)
20
21
begin
22
23
case state is
24
  when state0=>
25
    --Grundzustand
26
    
27
    c<= 0; --  c zurücksetzen
28
    
29
    next_state <= state1;
30
    
31
  when state1=>
32
  
33
    c<=c+1;
34
    -- Zählzustand
35
    next_state <= state2;
36
      
37
  when state2 =>
38
      
39
    c<=c; -- c beibehalten
40
    
41
    --andere befehle 
42
    
43
    next_state <= state0;
44
    
45
end case;
46
47
end process;
48
49
50
clk_process:process(clk, reset)
51
52
begin
53
54
if CLK = '1' and CLK'event then
55
56
  if reset='1' then
57
    state<=state0;
58
  else 
59
    state<=next_state;
60
    co<=c;
61
  end if;
62
end if;
63
  
64
end process clk_process;
65
66
end behavioral;


Das sollte, meinem Verständnis nach, folgendes bewirken:

1. Fängt in state0 an und setzt c=0
2. Wechsel zu state1
3. addiert 1 auf c -> c=1
4. Wechsel zu state2
5. Zustand behält c bei -> c=1
6. Kehrt in Grundzustand state0 zurück

Leider kommt ziemliches Hickhack raus. (s. angehängte 
Simulationsergebnisse)

Wäre super, wenn mir wer helfen könnte, bin schon am verzweifeln! :)

Danke!

Gruß
Julian

von SeriousSam (Gast)


Lesenswert?

Ev braucht dein Counter einen Takt auf den er reagieren kann.
Wenn du das case aus dem ersten process in den else Zweig im zweiten 
process packst, und statt next_state direkt state verwendest könnte es 
schon fast funktionieren.

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


Lesenswert?

>    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.

von Julian (Gast)


Lesenswert?

Ja, das war ein Fehler in der Denkweise. Hab ich mir auch schon gedacht, 
aber leider bin ich net draufgekommen. Bin VHDL noch nicht so gewohnt. 
:)

Aber vielen Dank! Jetzt funktionierts.

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.