Forum: FPGA, VHDL & Co. Verständnisfrage zu State Maschines


von Tom89 (Gast)


Lesenswert?

Hallo Leute,

ich habe eine frage bezüglich state machines. Ein Template für einen 
Moore Automaten sieht wie folgt aus:
1
architecture rtl of moore_4s is
2
3
  -- Build an enumerated type for the state machine
4
  type state_type is (s0, s1, s2, s3);
5
  
6
  -- Register to hold the current state
7
  signal state   : state_type;
8
9
begin
10
  -- Logic to advance to the next state
11
  process (clk, reset)
12
  begin
13
    if reset = '1' then
14
      state <= s0;
15
    elsif (rising_edge(clk)) then
16
      case state is
17
        when s0=>
18
          if data_in = '1' then
19
            state <= s1;
20
          else
21
            state <= s0;
22
          end if;
23
        when s1=>
24
          if data_in = '1' then
25
            state <= s2;
26
          else
27
            state <= s1;
28
          end if;
29
        when s2=>
30
          if data_in = '1' then
31
            state <= s3;
32
          else
33
            state <= s2;
34
          end if;
35
        when s3 =>
36
          if data_in = '1' then
37
            state <= s0;
38
          else
39
            state <= s3;
40
          end if;
41
      end case;
42
    end if;
43
  end process;
44
  
45
  -- Output depends solely on the current state
46
  process (state)
47
  begin
48
    case state is
49
      when s0 =>
50
        data_out <= "00";
51
      when s1 =>
52
        data_out <= "01";
53
      when s2 =>
54
        data_out <= "10";
55
      when s3 =>
56
        data_out <= "11";
57
    end case;
58
  end process;
59
  
60
end rtl;

Soweit so gut. Jetzt habe ich aber gehört, dass man Ausgänge möglichst 
nicht kombinatorisch machen sollte. Diese sollten von einem Flip Flop 
kommen. Denn es könnte der Fall sein diese Ausgänge an eine weitere 
kombinatorik angeschlossen werden und dann das delay zwischen 2 Flip 
Flops zu groß wird. Somit könnte es zu Timingverletzungen bei der 
Implementierung kommen. Stimmt das so oder habe ich das falsch 
verstanden?
Wenn ja dann frage ich mich warum die Automaten immer in dieser form in 
der Literatur beschrieben werden...

mfg

Tom

von Bitwurschtler (Gast)


Lesenswert?

es hinderet dich keiner daran die ausgänge durch FF zu schicken wo du 
sie brauchst

process(clk)
begin
 if rising_edge(clk)
  data_out_q <= data_out;
 end if;
end process;

Habe fertig!

von Tom89 (Gast)


Lesenswert?

Bitwurschtler schrieb:
> es hinderet dich keiner daran die ausgänge durch FF zu schicken wo
> du
> sie brauchst
>
> process(clk)
> begin
>  if rising_edge(clk)
>   data_out_q <= data_out;
>  end if;
> end process;
>
> Habe fertig!

Das ist mir schon klar, ich wollte eigentlich nur wissen ob mir jemand 
diese These bestätigen kann.
Wäre dann nicht diese State machine generell besser?
1
  process (clk, reset)
2
  begin
3
    if(reset = '1')then
4
      state <= s0;
5
    elsif(rising_edge(clk)) then
6
      state <= nex_state;
7
    end if;
8
  end process;
9
10
  -- Logic to advance to the next state
11
  process (state, data_in)
12
  begin
13
    case state is
14
      when s0=>
15
        if data_in = '1' then
16
          nex_state <= s1;
17
        end if;
18
      when s1=>
19
        if data_in = '1' then
20
          nex_state <= s2;
21
        end if;
22
      when s2=>
23
        if data_in = '1' then
24
          nex_state <= s0;
25
        end if;
26
    end case;
27
  end process;
28
  
29
  -- Output depends solely on the current state
30
  process (clk, reset)
31
  begin
32
    if(reset = '1')then
33
      data_out <= "00";
34
    elsif(rising_edge(clk)) then
35
      case state is
36
        when s0 =>
37
          data_out <= "00";
38
        when s1 =>
39
          data_out <= "01";
40
        when s2 =>
41
          data_out <= "10";
42
      end case;
43
    end if;
44
  end process;

von Bitwurschtler (Gast)


Lesenswert?

Nö, die ist inkonsistent da Ausgangsignale nicht allein von 
Zustandsvektor abhängen.

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


Lesenswert?

Bitwurschtler schrieb:
> inkonsistent da Ausgangsignale nicht allein von Zustandsvektor abhängen.
Wenn der Synthesizer ein wenig "mitdenkt", dann macht er den 
Zustandsvektor genau so wie den Ausgangsvektor. Diesen Freiheitsgrad hat 
er ja...

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.