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