-- ############################################################################ -- # Project : VHDL-Modellbibliothek # -- # # -- # Filename : cla_adder.vhd # -- # # -- # Schaltung : Carry-Lookahead-Adder # -- # # -- # Modell : cla_adder # -- # # -- # Designer : Wolfgang Sehr; ueberarbeitet von Stefan Schmechtig # -- # Abteilung : Lehrstul fuer rechnergestuetzten Schaltungsentwurf # -- # Datum : 12.12.1994 # -- ############################################################################ -- ############################################################################ -- # IEEE PACKAGES # -- ############################################################################ Library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; -- ############################################################################ ENTITY cla_adder IS GENERIC (BR : INTEGER := @BITBR); -- Bitbreite der zu addierenden Werte PORT ( a, b : IN UNSIGNED ((BR-1) DOWNTO 0); carry_in : IN STD_LOGIC; s : OUT UNSIGNED ((BR-1) DOWNTO 0); carry_out : OUT STD_LOGIC ); -- a, b : Eingabewerte fuer die beiden zu addierenden Binaerzahlen -- carry_in : Uebertragseingang von einen Addierer, dessen Ordnungs- -- stufe geringer ist. -- s : vom Addierer berechnete Summe -- carry_out : vom Addierer berechneter Uebertrag fuer einen Addierer -- der naechsthoeheren Ordnung; END cla_adder; ARCHITECTURE verhalten OF cla_adder IS SIGNAL carry :UNSIGNED (BR-1 DOWNTO 0); BEGIN cla: PROCESS(a,b,carry_in) -- 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(i); p(i) := a(i) OR b(i); END LOOP; c(0) := carry_in ; 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-1) LOOP carry(i) <= c(i); END LOOP; carry_out <= c(BR); END PROCESS; sum: PROCESS(a,b,carry) -- eigentliche Addition BEGIN FOR i IN 0 TO (BR-1) LOOP s(i) <= a(i) XOR b(i) XOR carry(i); END LOOP; END PROCESS; END verhalten; CONFIGURATION CFG_cla_adder OF cla_adder IS FOR verhalten END FOR; END CFG_cla_adder;