Wenn ich eine State-Machine in der Hardware debuggen will, ist es oft sinnvoll, auf ein paar LEDs oder Ausgangspins am Logikanalyzer zu sehen, was gerade in der SM abgeht. Die manuelle Variante ist nun, dem Debugport die States in einem extra dafür gerschriebenen Prozess die Information zuzuordnen:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;
entity DebugFSM is
Port ( clk : in STD_LOGIC;
state_as_vector : out STD_LOGIC_VECTOR (3 downto 0));
end DebugFSM;
architecture Behavioral of DebugFSM is
type states is (s0,s1,s2,s3,s4,s5);
signal state : states := s0;
begin
process begin
wait until rising_edge(clk);
case state is
when s0 => state <= s1;
:
when s5 => state <= s0;
when others => state <= s0;
end case;
end process;
-- Kombinatorisches Zuweisen der States auf die Debug-Signale
process (state) begin
case state is
when s0 => state_as_vector <= "0000";
when s1 => state_as_vector <= "0001";
when s2 => state_as_vector <= "0010";
when s3 => state_as_vector <= "0011";
when s4 => state_as_vector <= "0100";
when s5 => state_as_vector <= "0101";
end case;
end process;
end Behavioral;
Wesentlich eleganter geht es allerdings, wenn das attribut 'pos auf den Aufzählungstyp angewendet wird:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;
entity DebugFSM is
Port ( clk : in STD_LOGIC;
state_as_vector : out STD_LOGIC_VECTOR (3 downto 0));
end DebugFSM;
architecture Behavioral of DebugFSM is
type states is (s0,s1,s2,s3,s4,s5);
signal state : states := s0;
begin
process begin
wait until rising_edge(clk);
case state is
when s0 => state <= s1;
:
when s5 => state <= s0;
when others => state <= s0;
end case;
end process;
-- Zuweisen der States auf die Debug-Signale
state_as_vector <= std_logic_vector(to_unsigned(states'pos(state),4));
end Behavioral;
Da Zählung (Enumeration) des entsprechenden Zustandes links mit 0 beginnt, bestimmt die Position auch den Zahlenwert. Die beiden beschriebenen Beispiele verhalten sich also unabhängig von der tatsächlichen Implementation der Statemachine (Binär, One-Hot, Gray,...) gleich.