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;
 |