-- ############################################################################ -- # Project : VHDL-Modellbibliothek # -- # # -- # Filename : cla_adder_sub.vhd # -- # # -- # Schaltung : Carry-Lookahead-Addierer/Subtrahierer # -- # # -- # Kurzbeschreibung: addiert oder subtrahiert in Abhaengigkeit des Steuer- # -- # signals add_sub die beiden eingegebenen Binaerzahlen: # -- # o add_sub = 1 -> s = a + b # -- # o add_sub = 0 -> s = a - b # -- # # -- # cla_adder_sub # -- # # -- # Designer : Wolfgang Sehr; ueberarbeitet von Stefan Schmechtig # -- # Abteilung : Lehrstul fuer rechnergestuetzten Schaltungsentwurf # -- # Datum : 03.02.1995 # -- ############################################################################ -- ############################################################################ -- # IEEE PACKAGES # -- ############################################################################ Library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; -- ############################################################################ ENTITY cla_adder_sub IS GENERIC (BR : INTEGER := @BITBR);-- Bitbreite der zu addierenden Werte PORT ( a, b : IN SIGNED ((BR-1) DOWNTO 0); add_sub : IN STD_LOGIC; s : OUT UNSIGNED ((BR-1) DOWNTO 0); overflow : OUT STD_LOGIC ); -- a, b : Eingabewerte fuer die beiden zu addierenden Binaerzahlen -- -- add_sub : Auswahl des Modus dieses Moduls: -- : o add_sub = '1': Addition -- : o add_sub = '0': Subtraktion -- -- overflow : Anzeige eines arithmetischen Ueberlaufs: -- : o overflow = '1': Ueberlauf -- : o overflow = '0': kein Ueberlauf -- -- s : vom Addierer berechnete Summe END cla_adder_sub; ARCHITECTURE dataflow OF cla_adder_sub IS SIGNAL carry : UNSIGNED (BR DOWNTO 0); SIGNAL b_int : UNSIGNED ((BR-1) DOWNTO 0); SIGNAL carry_in_int : STD_LOGIC; -- carry : Uebertragssignal fuer die einzelnen Stufen -- -- b_int : internes Signal fuer den negierten Operanden B -- -- carry_in_int : internes Signal fuer den Uebertrag in der 0. Stufe -- : (Wird zur Bildung des 2'er Komplementes verwendet.) BEGIN compl: PROCESS(b, add_sub) VARIABLE carry_in_int_var : STD_LOGIC; VARIABLE b_int_var : UNSIGNED ((BR-1) DOWNTO 0); -- -------------------------------------------------------------------- -- Bildung des 2'er Komplements der Eingangszahl b -- -------------------------------------------------------------------- BEGIN IF (add_sub = '1') THEN FOR i IN 0 TO (BR-1) LOOP b_int_var(i) := b(i); END LOOP; carry_in_int_var := '0'; ELSIF (add_sub = '0') THEN FOR i IN 0 TO (BR-1) LOOP b_int_var(i) := NOT(b(i)); END LOOP; carry_in_int_var := '1'; END IF; b_int <= b_int_var; carry_in_int <= carry_in_int_var; END PROCESS; cla: PROCESS(a,b_int ,carry_in_int, add_sub) -- -------------------------------------------------------------------- -- Dieser Process stellt quasi eine Carry-Look-Ahead Einheit dar und -- berechnet aus den eingegebenen Binaerzahlen a und b und dem ein- -- gegebenen Uebertrag (carry_in) parallel die Uebertraege (Variable c) -- fuer die einzelnen Stufen und weist diese dem Signal carry bzw. -- carry_out zu. -- -------------------------------------------------------------------- VARIABLE p : UNSIGNED ((BR-1) DOWNTO 0); -- "propagate" VARIABLE g : UNSIGNED ((BR-1) DOWNTO 0); -- "generate" VARIABLE c : UNSIGNED ( BR DOWNTO 0); -- Uebertraege der einzelnen Stufen BEGIN FOR i IN 0 TO (BR-1) LOOP g(i) := a(i) AND b_int(i); p(i) := a(i) OR b_int(i); END LOOP; c(0) := carry_in_int ; FOR i IN 0 TO (BR-1) LOOP c(i+1) := g(i) OR (p(i) AND c(i)); END LOOP; FOR i IN 0 TO BR LOOP carry(i) <= c(i); END LOOP; END PROCESS; sum: PROCESS(a,b_int,carry) -- -------------------------------------------------------------------- -- eigentliche Addition -- -------------------------------------------------------------------- BEGIN FOR i IN 0 TO (BR-1) LOOP s(i) <= a(i) XOR b_int(i) XOR carry(i); END LOOP; overflow <= carry(BR) XOR carry(BR-1); END PROCESS; END dataflow; CONFIGURATION CFG_cla_adder_sub OF cla_adder_sub IS FOR dataflow END FOR; END CFG_cla_adder_sub;