Was passiert eigentlich mit einem mit dem when others in einem case, in dem alle Zustände verwendet sind? Frisch ans Werk und ausprobiert. Man definiere sich ein paar Zustände, mache dann eine SM, und verwende alle diese Zustände und füge zusätzlich (zur Sicherheit) noch einen when others Zweig mit einem error Flag ein. So etwa:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity SM_ueberdefiniert is
Port ( clk : in STD_LOGIC;
leds : out STD_LOGIC_VECTOR (1 downto 0);
error : out STD_LOGIC);
end SM_ueberdefiniert;
architecture Behavioral of SM_ueberdefiniert is
type dtyp is (aa, ab, ac);
signal a : dtyp;
begin
process begin
wait until rising_edge(clk);
error <= '0'; -- default
case a is
when aa => a<=ab; leds<="00";
when ab => a<=ac; leds<="01";
when ac => a<=aa; leds<="10";
when others => a<=aa; error <= '1';
end case;
end process;
end Behavioral;
Was kommt bei der Synthese dabei heraus?
Erst mal eine Warnung:
WARNING:Xst:1710 - FF/Latch <error> has a constant value of 0 in block <SM_ueberdefiniert>.
Und das schlägt sich dann auch im Syntheseergebnis nieder:
error wird einfach fest auf GND gelegt, weil der others Zweig nicht behandelt wird.
Fazit:
bei einer vollständig auscodierten Statemachine ist der when others Zweig unnötig. Er wird von der Synthese ganz einfach ignoriert, und könnte bestenfalls im Quelltext für Verwirrung sorgen.
ISE in der Version 13 lässt sich sogar zu einer Info herunter und sagt:
INFO:HDLCompiler:679 - Case statement is complete. others clause is never selected
Aber ACHTUNG:
wenn man z.B. 4 Zustände mit einem 2 Bit breiten std_logic_vector auscodiert, dann hat man (für die Simulation) nicht nur "00", "01", "10" und "11". Sondern man hat noch 77 andere Zustände (wie z.B. "XU", "1-", "ZH", usw), weil ja std_logic eine 9-wertige Logik beschreibt, und mit 2 Stellen insgesamt 9x9=81 Zustände codierbar wären.
Deshalb macht dort für die Simulation der when others Pfad durchaus Sinn. Besser wäre es aber, Zustände einer FSM gar nicht manuell zu codieren, sondern dies (wie im obigen Beispiel) immer mit einem entsprechenden Typ erledigt, und so der Synthese Platz zur Optimierung (Gray, OneHot, Binär,...) lässt.