Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| dt-code-vecnum [2011/01/13 08:34] – created beckmanf | dt-code-vecnum [2011/01/13 10:26] (current) – sensitivity list beckmanf | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| === VHDL Code für Arrays und Arithmetik === | === VHDL Code für Arrays und Arithmetik === | ||
| + | == Arrays == | ||
| + | Im folgenden ein Beispiel für Arrays - hier mit einem Schieberegister, | ||
| + | nach links und rechts schieben, sowie um 2 Stellen nach links rotieren kann. | ||
| <code vhdl> | <code vhdl> | ||
| Line 12: | Line 15: | ||
| reset_ni: | reset_ni: | ||
| load_i: | load_i: | ||
| - | shift_right_i: | + | shift_right_i: |
| - | shift_left_i: | + | shift_left_i: |
| rotate_left_by2_i: | rotate_left_by2_i: | ||
| data_i: | data_i: | ||
| Line 33: | Line 36: | ||
| end process seq_p; | end process seq_p; | ||
| - | comb_p : process(load_i, | + | comb_p : process(load_i, |
| begin | begin | ||
| new_sr <= sr; | new_sr <= sr; | ||
| if load_i = ' | if load_i = ' | ||
| - | | + | |
| elsif shift_right_i = ' | elsif shift_right_i = ' | ||
| new_sr(7) <= ' | new_sr(7) <= ' | ||
| Line 51: | Line 54: | ||
| </ | </ | ||
| + | |||
| + | == Signed und Unsigned == | ||
| + | Mit dem IEEE numeric.std package können Vektoren auch als Zahlen interpretiert werden. | ||
| + | Dies entspricht | ||
| + | |||
| + | |||
| + | |||
| + | <code vhdl> | ||
| + | use ieee.std_logic_1164.all; | ||
| + | use ieee.numeric_std.all; | ||
| + | |||
| + | architecture rtl of compute is | ||
| + | signal a, b : std_ulogic_vector(15 downto 0); | ||
| + | signal u, v, w : signed(15 downto 0); | ||
| + | signal x, y, z : unsigned(15 downto 0); | ||
| + | begin | ||
| + | |||
| + | -- Umwandlung in verschiedene Typen durch Casts | ||
| + | -- Bei diesen Casts entstehen keine Schaltungen. Die Vektoren werden nur anders interpretiert. | ||
| + | u <= signed(a); | ||
| + | x <= unsigned(b); | ||
| + | b <= std_ulogic_vector(y); | ||
| + | |||
| + | -- Signed und Unsigned Typen werden Vektoren zugewiesen | ||
| + | u <= " | ||
| + | x <= " | ||
| + | |||
| + | -- Mit Signed und Unsigned Typen kann man rechnen | ||
| + | z <= x + y; | ||
| + | z <= x - y; | ||
| + | z <= x * y; | ||
| + | z <= x + 13; | ||
| + | u <= 17 + v; | ||
| + | |||
| + | -- Und man kann die Arrays vergleichen. Entweder Array mit Array oder Array mit Integer | ||
| + | |||
| + | z <= x when u > v else y; | ||
| + | z <= x when u = v else y; | ||
| + | z <= x when u <= 5 else y; | ||
| + | |||
| + | end architecutre; | ||
| + | </ | ||
| + | |||
| + | == Integer Zahlen == | ||
| + | |||
| + | Es gibt in VHDL auch den Typen integer, der Zahlen darstellt. Mit integer können auch gerechnet und verglichen werden. | ||
| + | Integer Zahlen können auch in die Typen signed und unsigned umgewandelt werden | ||
| + | |||
| + | <code vhdl> | ||
| + | library ieee; | ||
| + | use ieee.std_logic_1164.all; | ||
| + | use ieee.numeric_std.all; | ||
| + | |||
| + | architecture rtl of compute is | ||
| + | signal a, b, c : integer range 0 to 230; | ||
| + | signal u, v, w : signed(7 downto 0); | ||
| + | signal x, y, z : unsigned(7 downto 0); | ||
| + | begin | ||
| + | |||
| + | a <= 5; | ||
| + | b <= a + 3 when c >= 5 else 9; | ||
| + | |||
| + | -- Umwandlung von Integer nach Signed und Unsigned | ||
| + | -- Bei der Umwandlung muss man angeben wieviele Elemente der Ausgangsvektor haben soll | ||
| + | x <= to_unsigned(a, | ||
| + | u <= to_signed(a, | ||
| + | |||
| + | -- Umwandlung von signed, unsigned in integer | ||
| + | a <= to_integer(u); | ||
| + | b <= to_integer(x); | ||
| + | |||
| + | end architecture; | ||
| + | </ | ||
| + | |||