Dein Problem ist nicht mealy oder moore sondern wann werden signale
zugeweisen die in einem getakteten Prozess stehen und wann wenn sie
ausserhalb des Prozess stehen. Beispiel.
Moore
1 | process(clk_i)
|
2 | begin
|
3 | if rising_edge(clk_i) then
|
4 | case state_q is
|
5 | when st1 =>
|
6 | if ein1_i = '1' then
|
7 | state_q <= st2;
|
8 | end if;
|
9 | when st2 =>
|
10 | if ein2_i = '1' then
|
11 | state_q <= st1;
|
12 | end if;
|
13 | end case;
|
14 | end if;
|
15 | end process;
|
16 |
|
17 | out1_o <= '1' when state_q = st1 else '0';
|
18 | out2_o <= '1' when state_q = st2 else '0';
|
Mealy:
1 | process(clk_i)
|
2 | begin
|
3 | if rising_edge(clk_i) then
|
4 | case state_q is
|
5 | when st1 =>
|
6 | if ein1_i = '1' then
|
7 | state_q <= st2;
|
8 | end if;
|
9 | when st2 =>
|
10 | if ein2_i = '1' then
|
11 | state_q <= st1;
|
12 | end if;
|
13 | end case;
|
14 | end if;
|
15 | end process;
|
16 |
|
17 | out1_o <= '1' when state_q = st1 and ein1 /= '1' or
|
18 | state_q = st2 and ein2_i = '1' else
|
19 | '0';
|
20 |
|
21 | out2_o <= '1' when state_q = st2 and ein2 /= '1' or
|
22 | state_q = st1 and ein1_i = '1' else
|
23 | '0';
|
Bei beiden ist out1_o '1' when st1 aktiv ist und es wird '1' wenn der
Übergang zu st1 ausgeführt wird. Bei st2 und Übergang zu st2 ist es
'0'., egal ob mealy oder Moore.
Schreibst du die out -Zuweisungen in den Prozess werden diese erst zu
nächsten clk_i Flanke gültig
Moore:
1 | process(clk_i)
|
2 | begin
|
3 | if rising_edge(clk_i) then
|
4 | case state_q is
|
5 | when st1 =>
|
6 | out1_oq <= '1';
|
7 | out2_oq <= '0';
|
8 | if ein1_i = '1' then
|
9 | state_q <= st2;
|
10 | end if;
|
11 |
|
12 | when st2 =>
|
13 | out1_oq <= '0';
|
14 | out2_oq <= '1';
|
15 | if ein2_i = '1' then
|
16 | state_q <= st1;
|
17 | end if;
|
18 | end case;
|
19 | end if;
|
20 | end process;
|
Hier wird bei der ersten Flanke in den nächsten State gewechselt, bei
der zweiten wird entsprechend des States die Ausgangsgrößen gesetzt.
Dafür werden deine ausgangssignale aus FF getrieben. Schreibst du sie
ausserhalb des Prozesses wie oben. dann werden sie in der selben Periode
wie der zustandwechsel zugeweisen (sind aber nicht mehr aus FF)
getrieben. wenn man die ausgangssignale früher wechseln lassen will
(also mit dem Zustandwechsel), schreibt man eine zweite Bedingung zum
setzten der Ausgange, die Gleichzeitig mit dem Zustandwechsel aktiv
wird:
Mealy
1 | process(clk_i)
|
2 | begin
|
3 | if rising_edge(clk_i) then
|
4 | case state_q is
|
5 | when st1 =>
|
6 | out1_oq <= '1';
|
7 | out2_oq <= '0';
|
8 | if ein1_i = '1' then
|
9 | out1_oq <= '0';
|
10 | out2_oq <= '1';
|
11 | state_q <= st2;
|
12 | end if;
|
13 | when st2 =>
|
14 | out1_oq <= '0';
|
15 | out2_oq <= '1';
|
16 | if ein2_i = '1' then
|
17 | out1_oq <= '1';
|
18 | out2_oq <= '0';
|
19 | state_q <= st1;
|
20 | end if;
|
21 | end case;
|
22 | end if;
|
23 | end process;
|
Also wie oben gezeigt ist mealy-Moore bei kombinatorischen Ausgängen
(ausserhalb Prozess) im zeitlichen verhalten gleich. bei Ausgängen aus
FF (innerhalb prozess beschrieben, kommt bei Moore die AusgangsZuweisung
ein takt später.
Schwierig zu beschreiben, das Problem ist.