46 lines
1.3 KiB
VHDL
46 lines
1.3 KiB
VHDL
|
ARCHITECTURE noPipe OF pipelineAdder IS
|
||
|
|
||
|
constant stageBitNb : positive := sum'length/stageNb;
|
||
|
subtype stageOperandType is signed(stageBitNb-1 downto 0);
|
||
|
type stageOperandArrayType is array(stageNb-1 downto 0) of stageOperandType;
|
||
|
subtype carryType is std_ulogic_vector(stageNb downto 0);
|
||
|
|
||
|
signal a_int, b_int, sum_int : stageOperandArrayType;
|
||
|
signal carryIn : carryType;
|
||
|
|
||
|
COMPONENT parallelAdder
|
||
|
GENERIC (
|
||
|
bitNb : positive := 32
|
||
|
);
|
||
|
PORT (
|
||
|
sum : OUT signed (bitNb-1 DOWNTO 0);
|
||
|
cIn : IN std_ulogic ;
|
||
|
cOut : OUT std_ulogic ;
|
||
|
a : IN signed (bitNb-1 DOWNTO 0);
|
||
|
b : IN signed (bitNb-1 DOWNTO 0)
|
||
|
);
|
||
|
END COMPONENT;
|
||
|
|
||
|
BEGIN
|
||
|
|
||
|
carryIn(0) <= cIn;
|
||
|
|
||
|
pipeline: for index in stageOperandArrayType'range generate
|
||
|
a_int(index) <= a(index*stageBitNb+stageBitNb-1 downto index*stageBitNb);
|
||
|
b_int(index) <= b(index*stageBitNb+stageBitNb-1 downto index*stageBitNb);
|
||
|
partialAdder: parallelAdder
|
||
|
GENERIC MAP (bitNb => stageBitNb)
|
||
|
PORT MAP (
|
||
|
a => a_int(index),
|
||
|
b => b_int(index),
|
||
|
sum => sum_int(index),
|
||
|
cIn => carryIn(index),
|
||
|
cOut => carryIn(index+1)
|
||
|
);
|
||
|
sum(index*stageBitNb+stageBitNb-1 downto index*stageBitNb) <= sum_int(index);
|
||
|
end generate pipeline;
|
||
|
|
||
|
cOut <= carryIn(carryIn'high);
|
||
|
|
||
|
END ARCHITECTURE noPipe;
|