Ich habe lange mit mir gekämpft, bin aber jetzt zum Schluss gekommen, dass diese Beschreibung eines getakteten Prozesses am schönsten und am wenigsten fehlerträchtig ist:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;
entity Beispiel is
Port ( clk : in STD_LOGIC;
inp : in STD_LOGIC_VECTOR (7 downto 0);
outp : out STD_LOGIC_VECTOR (7 downto 0);
sel : in STD_LOGIC);
end Beispiel;
architecture Behavioral of Beispiel is
begin
-- Prozess ohne Sensitiv-Liste
process begin
wait until rising_edge(clk);
if (sel1='1') then
outp <= inp;
else
outp <= not inp;
end if;
end process;
end Behavioral;
1) Durch das Fehlen der Sensitvity-Liste funktioniert die Simulation immer wie die Hardware. Es können keine Signale in der Liste "vergessen" werden, was bekanntermaßen zu Unterschieden zwischen Simulation und Realitiät führt.
2) Durch das Fehlen der Sensitvity-Liste kann es keine asynchronen Teile des Prozesses geben. Der Prozess ist quasi automatisch synchron.
3) Es wird zum Formatieren des Quelltextes eine Indent-Ebene (Einrück-Ebene) gespart.
Ein Beispiel zum Thema unvollständige Sensitiv-Liste (Punkte 1 und 2) gibts hier.
Mal angenommen, ich habe in einer Beschreibung einen Fehler gemacht und bei der Beschreibung eines Taktes das and clk'event vergessen:
process (reset,clk) begin -- Sensitiv-Liste unvollständig,
-- weil "and clk'event" fehlt, müsste "inp"
-- für eine korrekte Simulation mit aufgenommen werden
if (reset='1') then
outp <= '0';
elsif (clk='1') then -- hier wurde "and clk'event" vergessen
outp <= inp;
end if;
end process;
Durch das fehlende clk'event wird bei der Synthese ein Latch (Kombinatorik) erzeugt: wenn reset = '0' und clk = '0' sind, dann (und nur dann) wird der Wert von inp in outp gespeichert. In der Simulation sieht diese Beschreibung allerdings wegen der unvollständigen Sensitivity-Liste genauso aus wie diese getaktete korrekte Beschreibung:
process (reset,clk) begin
if (reset='1') then
outp <= '0';
elsif (clk='1' and clk'event) then
outp <= inp;
end if;
end process;