Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision Next revision Both sides next revision | ||
dt-code [2010/12/20 13:42] beckmanf created |
dt-code [2011/03/29 13:09] beckmanf end component eingefügt |
||
---|---|---|---|
Line 42: | Line 42: | ||
b_i : in std_ulogic; | b_i : in std_ulogic; | ||
y_o : out std_ulogic); | y_o : out std_ulogic); | ||
+ | end component; | ||
| | ||
component or_gate | component or_gate | ||
Line 48: | Line 49: | ||
b_i : in std_ulogic; | b_i : in std_ulogic; | ||
y_o : out std_ulogic); | y_o : out std_ulogic); | ||
- | | + | end component; |
+ | | ||
component inv_gate | component inv_gate | ||
port( | port( | ||
a_i : in std_ulogic; | a_i : in std_ulogic; | ||
y_o : out std_ulogic); | y_o : out std_ulogic); | ||
- | | + | end component; |
+ | | ||
signal s1 : std_ulogic; | signal s1 : std_ulogic; | ||
signal s2 : std_ulogic; | signal s2 : std_ulogic; | ||
Line 86: | Line 89: | ||
</code> | </code> | ||
+ | |||
+ | == 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. | ||
+ | |||
+ | <code vhdl> | ||
+ | |||
+ | 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 | ||
+ | </code> | ||
+ | |||
+ | == 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. | ||
+ | |||
+ | <code vhdl> | ||
+ | |||
+ | 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 | ||
+ | </code> | ||
+ | |||
+ | == 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. | ||
+ | |||
+ | <code vhdl> | ||
+ | |||
+ | 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 | ||
+ | </code> | ||
+ | |||
+ | == Prozess mit einem case statement == | ||
+ | |||
+ | Alternativ lässt sich auch ein case statement in einem Prozess verwenden. | ||
+ | |||
+ | <code vhdl> | ||
+ | |||
+ | 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 | ||
+ | </code> | ||
+ | |||
+ | == Conditional Signal Assignment == | ||
+ | |||
+ | Dann gibt es noch das Conditional Signal Assignment. | ||
+ | |||
+ | <code vhdl> | ||
+ | |||
+ | architecture rtl-5 of mux is | ||
+ | |||
+ | begin | ||
+ | |||
+ | y_o <= b_i when s_i = '1' else a_i; | ||
+ | |||
+ | end rtl-5 | ||
+ | </code> | ||
+ | |||
+ | == Selected Signal Assignment == | ||
+ | |||
+ | Noch eine alternative ist das selected signal assignment. | ||
+ | |||
+ | <code vhdl> | ||
+ | |||
+ | architecture rtl-6 of mux is | ||
+ | |||
+ | begin | ||
+ | |||
+ | with s_i select | ||
+ | y_o <= a_i when '0', | ||
+ | y_o <= b_i when '1'; | ||
+ | |||
+ | end rtl-6 | ||
+ | </code> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ |