Nach Moore wird die abweisende eines Zustands 'Z1' durchlaufen, wenn die Übergangsbedingung zu 'Z2' erfüllt ist. Während dem Übergang, also zwischen Eintreten der Übergangsbedingung und rising_edge, erfolgt - entgegen Mealy - jedoch noch KEINE Ausgabe der Ausgangsvariablen des Folgezustandes, sondern erst dann wenn dieser erreicht wurde. Ich habe zur Beschreibung einer Ablaufsteuerung die "case"-Funktion eingesetzt und muss nun für genau diese abweisende Kante von 'Z1' >> 'Z2' auch eine Ausgangsbelegung angeben. Entscheidet nun genau diese Bescheibung darüber welche Art von Automat synthetisiert wird? Welche Ausgangsbelegung ist zweckmäßig, zulässig, gebräuchlich, oder liegt ein genereller Denkfehler vor? Danke Chris
Anbei ein Beispiel als Ergänzung: MOORE: ==================================== when Z1 => if(A='1') then y1<='1'; zvneu<=Z1; else y1<='1'; -- ! zvneu<=Z2; end if; when Z2 => if(B='...') then y1<='0'; zvneu<=...; else ... MEALY: ==================================== when Z1 => if(A='1') then y1<='1'; zvneu<=Z1; else y1<='0'; --! zvneu<=Z2; end if; when Z2 => if(B='...') then y1<='0'; zvneu<=...; else ...
Bitte noch eine zusätzliche Frage mit selbem Bezug: "case" wird parallel verarbeitet, "when" sequentiell. Besteht innerhalb eines process mit case ein unterschied zwischen folgenden zwei Beschreibungsformen: Zuerst Übergangsbedingung zum Folgezustand, danach innerhalb else die Ausgabe im aktuellen Zustand when B => if (s4='1') then k2<='1'; k3<='1'; zvneu<=C; elsif (s6='1') then k2<='1'; k3<='1'; zvneu<=init; elsif (s1='1') then k2<='1'; k3<='1'; zvneu<=C; else k2<='1'; k3<='1'; zvneu<=B; end if; Zuerst die Ausgabe im aktuellen Zustand, danach die Übergangsbedingung zum Folgezustand (üblich) when B => k2<='1'; k3<='1'; -- zvneu<=B; if (s4='1') then k2<='1'; k3<='1'; zvneu<=C; elsif (s6='1') then k2<='1'; k3<='1'; zvneu<=init; elsif (s1='1') then k2<='1'; k3<='1'; zvneu<=C; end if;
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.