VHDL Code Beispiele
Entity and Architecture
library ieee; use ieee.std_logic_1164.all; entity and_gate is port( a_i : in std_ulogic; b_i : in std_ulogic; y_o : out std_ulogic); end and_gate; architecture rtl of and_gate is begin y_o <= a_i and b_i; end architecture rtl;
Strukturelle Beschreibung von Schaltungen
library ieee; use ieee.std_logic_1164.all; entity mux is port ( a_i : in std_ulogic; b_i : in std_ulogic; s_i : in std_ulogic; y_o : out std_ulogic); end mux; architecture structure of mux is component and_gate port( a_i : in std_ulogic; b_i : in std_ulogic; y_o : out std_ulogic); end component; component or_gate port( a_i : in std_ulogic; b_i : in std_ulogic; y_o : out std_ulogic); end component; component inv_gate port( a_i : in std_ulogic; y_o : out std_ulogic); end component; signal s1 : std_ulogic; signal s2 : std_ulogic; signal s3 : std_ulogic; begin inv_gate_i0 : inv_gate port map( a_i => s_i, y_o => s1); and_gate_i0 : and_gate port map( a_i => s1, b_i => a_i, y_o => s2); and_gate_i1 : and_gate port map( a_i => s_i, b_i => b_i, y_o => s3); or_gate_i0 : or_gate port map( a_i => s2, b_i => s3, y_o => y_o); end architecture structure;
Funktionale Beschreibung mit Concurrent Signal Assignments
Eine alternative Beschreibung des Multiplexers mit Funktionen und Concurrent Signal Assignments. Die Funktionen “not” “and”, “or” und andere sind im package ieee.std_logic_1164 definiert.
architecture rtl-1 of mux is signal s1, s2, s3 : std_ulogic; begin s1 <= not s_i; s2 <= s1 and a_i; s3 <= s_i and b_i; y_o <= s2 or s3; end rtl-1
Funktionale Beschreibung mit einem Prozess
Ein Prozess enthält sequentielle Anweisungen. Ein Prozess wird immer ausgeführt, wenn sich ein Signal in der “sensitivity list” ändert.
Die Sequenz der Anweisungen in einem Prozess entspricht nicht einer zeitlichen Sequenz. Das bedeutet der Prozess berechnet die neuen Werte der Signale und diese werden dann alle zeitgleich zugewiesen. Im folgenden Beispiel wurde die Anweisung s3 ⇐ s_i and b_i durch einen Prozess ersetzt. Die Funktion hat sich dadurch nicht geändert.
architecture rtl-2 of mux is signal s1, s2, s3 : std_ulogic; begin s1 <= not s_i; s2 <= s1 and a_i; -- s3 replaced with process y_o <= s2 or s3; s3_and_p : process (s_i, b_i) begin s3 <= '0'; if s_i = '1' and b_i = '1' then s3 <= '1'; end if; end process s3_and_p; end rtl-2
Komplette funtkionale Beschreibung in einem Prozess
Alternativ lässt sich auch die ganze Multiplexerfunktion in einem Prozess beschreiben. Die Lesbarkeit wird durch diese Beschreibung häufig erhöht.
architecture rtl-3 of mux is begin mux_p : process (s_i, a_i, b_i) begin y_o <= '0'; if s_i = '1' then y_o <= b_i; else y_o <= a_i; end if; end process mux_p; end rtl-3
Prozess mit einem case statement
Alternativ lässt sich auch ein case statement in einem Prozess verwenden.
architecture rtl-4 of mux is begin mux_p : process (s_i, a_i, b_i) begin y_o <= '0'; case s_i is when '0' => y_o <= b_i; when '1' => y_o <= a_i; when others => y_o <= '0'; end case; end process mux_p; end rtl-4
Conditional Signal Assignment
Dann gibt es noch das Conditional Signal Assignment.
architecture rtl-5 of mux is begin y_o <= b_i when s_i = '1' else a_i; end rtl-5
Selected Signal Assignment
Noch eine alternative ist das selected signal assignment.
architecture rtl-6 of mux is begin with s_i select y_o <= a_i when '0', b_i when '1'; end rtl-6