>Habt ihr noch Verbesserungen vorzuschlagen.
Geht es dir nur um das Zweierkomplement?
Dann gibt es kürzere und übersichtlichere Wege: Antatt die Struktur zu
beschreiben ist es i.A. besser lesbar, das Verhalten zu beschreiben:
1 | library IEEE;
|
2 | USE ieee.std_logic_1164.ALL;
|
3 | USE ieee.std_logic_unsigned.all;
|
4 | USE ieee.numeric_std.ALL;
|
5 |
|
6 | entity Komplement is
|
7 | generic (n : natural := 4);
|
8 | Port ( x : in STD_LOGIC_VECTOR (n-1 downto 0);
|
9 | z : out STD_LOGIC_VECTOR (n-1 downto 0));
|
10 | end Komplement;
|
11 |
|
12 | architecture Verhalten of Komplement is
|
13 | begin
|
14 | z <= (not x) + 1;
|
15 | end Verhalten;
|
Oder alternativ mit der aktuellen numeric_std-Lib:
1 | library IEEE;
|
2 | use IEEE.STD_LOGIC_1164.ALL;
|
3 | use IEEE.numeric_std.ALL;
|
4 |
|
5 | entity Komplement is
|
6 | generic (n : natural := 4);
|
7 | Port ( x : in STD_LOGIC_VECTOR (n-1 downto 0);
|
8 | z : out STD_LOGIC_VECTOR (n-1 downto 0));
|
9 | end Komplement;
|
10 |
|
11 | architecture Behavioral of Komplement is
|
12 | begin
|
13 | z <= std_logic_vector((not unsigned(x))+1);
|
14 | end Behavioral;
|
Oder so:
1 | library IEEE;
|
2 | use IEEE.STD_LOGIC_1164.ALL;
|
3 | use IEEE.numeric_std.ALL;
|
4 |
|
5 | entity Komplement is
|
6 | generic (n : natural := 4);
|
7 | Port ( x : in STD_LOGIC_VECTOR (n-1 downto 0);
|
8 | z : out STD_LOGIC_VECTOR (n-1 downto 0));
|
9 | end Komplement;
|
10 |
|
11 | architecture Behavioral of Komplement is
|
12 | begin
|
13 | z <= std_logic_vector(0 - signed(x));
|
14 | end Behavioral;
|
Es gibt also etliche elegantere Methoden, als Berechnungen über eine
Struktur zu beschreiben. Aber zum Lernen einer Strukturbeschreibung ist
dieser Umweg (handgestrickte Addierer usw.) ok.