|
The Quartus® II software includes inherently parameterized megafunctions, including library of parameterized modules (LPM) functions. For example, parameters are used to specify the width of a port or whether a block of RAM should be implemented as synchronous or asynchronous memory. Parameterized functions can contain other subdesigns, which may be parameterized or unparameterized, however, primitives cannot be parameterized. All Quartus II logic functions can be used to create hierarchical logic designs. Megafunctions are automatically installed in the \quartus\libraries\megafunctions directory created during installation; primitive logic is built into AHDL.
Parameterized functions are instantiated with an in-line logic function reference or an Instance Declaration in the same way as unparameterized functions, as described in Using Altera-Provided Unparameterized Functions, with a few additional steps:
The logic function instance must include a WITH
clause, which is based on the WITH
clause in the Function Prototype, that lists the parameters used by the instance. You can use the WITH
clause to optionally assign parameter values on an instance; however, for all required parameters in a function, a parameter value must be supplied somewhere within the project. If the instance itself does not include some or all of the values for required parameters, the Compiler searches for them in parameter value search order.
Since parameterized megafunctions do not necessarily have default values for unconnected inputs, you must ensure that all required ports are connected. In contrast, primitives always have default values for unconnected inputs.
The inputs, outputs, and parameters of the function are declared with a Function Prototype Statement. The Quartus II software provides AHDL Include Files (.inc) that contain Function Prototypes for all Quartus II megafunctions in the \quartus\libraries\megafunctions directory.
The lpm_add1.tdf file shown below implements an 8-bit adder with an in-line logic function reference to the parameterized lpm_add_sub
megafunction:
INCLUDE "lpm_add_sub.inc"; SUBDESIGN lpm_add1 ( a[8..1], b[8..1] : INPUT; c[8..1] : OUTPUT; carry_out : OUTPUT; ) BEGIN % Megafunction instance with positional port association % (c[], carry_out, ) = lpm_add_sub(GND, a[], b[], GND,,) WITH (LPM_WIDTH=8, LPM_REPRESENTATION="unsigned"); % Equivalent instance with named port association % -- (c[], carry_out, ) = lpm_add_sub(.dataa[]=a[], .datab[]=b[], -- .cin=GND, .add_sub=GND) -- WITH (LPM_WIDTH=8, -- LPM_REPRESENTATION="unsigned"); END;
The Function Prototype for lpm_add_sub
, which is stored in the AHDL Include File lpm_add_sub.inc, is shown below:
FUNCTION lpm_add_sub(cin, dataa[LPM_WIDTH-1..0], datab[LPM_WIDTH-1..0], add_sub) WITH (LPM_WIDTH, LPM_REPRESENTATION, LPM_DIRECTION, ADDERTYPE, ONE_INPUT_IS_CONSTANT) RETURNS (result[LPM_WIDTH-1..0], cout, overflow);
Only the LPM_WIDTH
parameter is required, and the instance of the lpm_add_sub
function in lpm_add1.tdf specifies parameter values only for the LPM_WIDTH
and LPM_REPRESENTATION
parameters.
The lpm_add2.tdf file shown below is identical to lpm_add1.tdf, but implements the 8-bit adder with an Instance Declaration:
INCLUDE "lpm_add_sub.inc"; SUBDESIGN lpm_add2 ( a[8..1], b[8..1] : INPUT; c[8..1] : OUTPUT; carry_out : OUTPUT; ) VARIABLE 8bitadder : lpm_add_sub WITH (LPM_WIDTH=8, LPM_REPRESENTATION="unsigned"); BEGIN 8bitadder.cin = GND 8bitadder.dataa[] = a[] 8bitadder.datab[] = b[] 8bitadder.add_sub = GND c[] = 8bitadder.result[] carry_out = 8bitadder.cout END;
- PLDWorld - |
|
Created by chm2web html help conversion utility. |