| 
		 | 	
  
Parameterized adder/subtractor megafunction. Altera® recommends using the lpm_add_sub function to replace all other types of adder/subtractor functions.
Altera also recommends instantiating this function as described in Using the MegaWizard® Plug-In Manager.
This topic contains the following information:
FUNCTION lpm_add_sub (cin, dataa[LPM_WIDTH-1..0], datab[LPM_WIDTH-1..0],
      add_sub, clock, aclr, clken)
   WITH (LPM_WIDTH, LPM_REPRESENTATION, LPM_DIRECTION, ONE_INPUT_IS_CONSTANT,
      LPM_PIPELINE, MAXIMIZE_SPEED, USE_WYS) RETURNS (result[LPM_WIDTH-1..0], cout, overflow);
COMPONENT lpm_add_sub
   GENERIC (LPM_WIDTH: POSITIVE;
      LPM_DIRECTION: STRING := "UNUSED";
      LPM_REPRESENTATION: STRING := "SIGNED";
      LPM_PIPELINE: INTEGER := 0;
      LPM_TYPE: STRING := "LPM_ADD_SUB";
      LPM_HINT: STRING := "UNUSED"
      ONE_INPUT_IS_CONSTANT: STRING := "NO";
      MAXIMIZE_SPEED: INTEGER; 
      USE_WYS: STRING :=	"OFF");
   PORT (dataa, datab: IN STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0);
      aclr, clock, cin: IN STD_LOGIC := '0';
      clken, add_sub: IN STD_LOGIC := '1';
      result: OUT STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0);
      cout, overflow: OUT STD_LOGIC);
END COMPONENT;
LIBRARY lpm; USE lpm.lpm_components.all;
INPUT PORTS
| Port Name | Required | Description | Comments | 
|---|---|---|---|
cin | 
    No | Carry-in to the low-order bit. | If omitted, the default is 0. | 
dataa[] | 
    Yes | Augend/Minuend | Input port LPM_WIDTH wide. | 
  
datab[] | 
    Yes | Addend/Subtrahend | Input port LPM_WIDTH wide. | 
  
add_sub | 
    No | If the signal is high, the operation = dataa[]+datab[]+cin. 
      If the signal is low, the operation = dataa[]-datab[]+cin-1. | 
    If the LPM_DIRECTION parameter is 
      used, add_sub cannot be used. If omitted, the default is "ADD". 
      Altera recommends that you use the LPM_DIRECTION parameter 
      to specify the operation of the lpm_add_sub function, rather 
      than assigning a constant to the add_sub port. | 
  
clock | 
    No | Clock for pipelined usage. | The clock port provides pipelined 
      operation for the lpm_add_sub function. For LPM_PIPELINE 
      values other than 0 (default value), the clock port must be connected. | 
  
clken | 
    No | Clock enable for pipelined usage. | If omitted, the default is 1. | 
aclr | 
    No | Asynchronous clear for pipelined usage. | The pipeline initializes to an undefined (X) 
      logic level. The aclr port can be used at any time to reset 
      the pipeline to all 0s, asynchronously to the clock signal. | 
  
OUTPUT PORTS
| Port Name | Required | Description | Comments | 
|---|---|---|---|
result[] | 
    Yes | dataa[]+datab[]+cin or dataa[]-datab[]+cin-1. | 
    Output port LPM_WIDTH wide. | 
  
cout | 
    No | Carry-out (borrow-in) of the MSB. Note (4) | The cout port has a physical interpretation 
      as the carry-out (borrow-in) of the MSB. The cout port is most meaningful 
      for detecting overflow in "UNSIGNED" operations. The cout port operates in the same manner for "SIGNED" and "UNSIGNED" operations. | 
  
overflow | 
    No | Result exceeds available precision. Note (5) | The overflow port has a physical interpretation 
      as the XOR of the carry-in to the MSB with the carry-out of 
      the MSB. overflow is meaningful only when the LPM_REPRESENTATION 
      parameter value is "SIGNED". | 
  
| Parameter | Type | Required | Description | 
|---|---|---|---|
LPM_WIDTH | 
    Integer | Yes | Width of the dataa[],datab[], 
      and result[] ports. | 
  
LPM_DIRECTION | 
    String | No | Values are "ADD", "SUB", 
      and "UNUSED". 
      If omitted, the default is "DEFAULT", which directs 
      the parameter to take its value from the add_sub port. The 
      add_sub port cannot be used if LPM_DIRECTION is 
      used. Altera recommends that you use the LPM_DIRECTION parameter 
      to specify the operation of the lpm_add_sub function, rather 
      than assigning a constant to the add_sub port. | 
  
LPM_REPRESENTATION | 
    String | No | Type of addition performed: "SIGNED", 
      "UNSIGNED", or "UNUSED". 
      If omitted, the default is "SIGNED". The signed representation for all library of parameterized modules (LPM) megafunctions is two's complement. | 
  
LPM_PIPELINE | 
    Integer | No | Specifies the number of Clock cycles of latency 
      associated with the result[] output. A value of zero (0) indicates 
      that no latency exists, and that a purely combinatorial function will be 
      instantiated. If omitted, the default is 0 (non-pipelined). | 
  
LPM_HINT | 
    String | No | Allows you to specify Altera-specific 
      parameters in VHDL Design Files (.vhd). 
      The default is "UNUSED". | 
  
LPM_TYPE | 
    String | No | Identifies the library of parameterized modules (LPM) entity name in VHDL Design Files. | 
ONE_INPUT_ IS_CONSTANT | 
    String | No | Altera-specific 
      parameter. Values are "YES", "NO", 
      and "UNUSED". 
      Provides greater optimization if one input is constant. If omitted, the 
      default is "NO". | 
  
MAXIMIZE_SPEED | 
    Integer | No | Altera-specific 
      parameter. You can specify a value between 0 and 10. If used, the Quartus® II software 
      attempts to optimize a specific instance of the lpm_add_sub 
      function for speed rather than routability, and overrides the setting of the Optimization 
      Technique option in the Assignment Organizer  (Assignments menu). If MAXIMIZE_SPEED 
      is unused, the value of the Optimization Technique option is used 
      instead. If the setting for MAXIMIZE_SPEED is 6 or higher, 
      the Compiler optimizes lpm_add_sub megafunctions for higher 
      speed using carry chains; if the setting is 5 or less, the Compiler implements the design without carry chains. This parameter should be specified for APEX II and Mercury devices only when the USE_WYS parameter is not used. This parameter should be specified for Cyclone, Stratix, and Stratix GX devices only when the USE_WYS parameter and the add_sub port are not used. | 
  
USE_WYS | 
    String | No | Specifies whether to construct an optimized accumulator with the data from the result[] port that cannot be merged with any other logic. Values are "ON" and "OFF". If omitted, the default is "OFF". For Cyclone, Stratix, and Stratix GX designs, if you turn on the add_sub port, this parameter setting must be "ON". This parameter is available for Cyclone, APEX II, Mercury, Stratix, and Stratix GX devices only. | 
  
| UNSIGNED | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
 
      
  | 
  ||||||||||||||||||||
| SIGNED | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
 
      
  | 
  ||||||||||||||||||||
The following table summarizes the resource usage for an lpm_add_sub megafunction used to implement a 16-bit unsigned adder with a carry-in input and a carry-out output. Logic cell usage scales linearly in proportion to adder width.
| Design Goals | Design Results | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
 
      
  | 
	
     
      
  | 
  
Numbers of shared expanders used are shown in parentheses ( ).
| This topic prints best in Landscape orientation. | 
| 
       - PLDWorld -  | 
    
| 
       
  | 
  
| Created by chm2web html help conversion utility. |