Verständnisfrage zu State Maschines

Gast #4529279
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
Gast #4529335
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;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren