L8_Subprograms and Packages

download L8_Subprograms and Packages

of 27

Transcript of L8_Subprograms and Packages

  • 8/6/2019 L8_Subprograms and Packages

    1/27

    5/7/2011

    Packages The primary purpose of a package is to

    encapsulate elements that can be shared (globally)

    among two or more design units. A package is a common storage area used to hold

    data to be shared among a number of entities

    Declaring data inside of a package allows the data

    to be referenced by other entities; thus data can be

    shared.

  • 8/6/2019 L8_Subprograms and Packages

    2/27

    5/7/2011

    Package (cont..) A package consists of two parts:

    A package declaration section

    A package body

  • 8/6/2019 L8_Subprograms and Packages

    3/27

    5/7/2011

    Package Declaration The package declaration section can contain

    the following declaration:

    Subprogram declaration

    Type, Subtype declaration

    Constant, deferred constant

    Component declaration Attribute declaration

    File declaration

  • 8/6/2019 L8_Subprograms and Packages

    4/27

    5/7/2011

    Package declaration (example)Package example is

    type nineval is (z0,z1,z2,r0,r1,r2,f0,f1,f2);

    type t_cluster is arary (0 to 15) or nineval;type t_clus_vec is array (natural range ) oft_cluster;

    function resolve (s : t_clus_vec)

    return t_cluster;subtype t_wclus is resolve_cluster t_cluster;

    constant undriven : t_wclus;

    End example;

  • 8/6/2019 L8_Subprograms and Packages

    5/27

    5/7/2011

    Package body The package body can also contain the

    following declaration:

    Subprogram declaration/body

    Type, subtype declaration

    Constant declaration

    File declaration

    Alias declaration

    Use clause

  • 8/6/2019 L8_Subprograms and Packages

    6/27

    5/7/2011

    Package body (example)Package body cluspack is

    constant undriven : t_wclus:= (zx,zx);

    function resolve_cluster (s: t_clus_vec)return t_cluster is

    variable result : t_cluster;

    variable drive_const: integer;

    begin

    if slength = 0 then return undriven

    end if;

  • 8/6/2019 L8_Subprograms and Packages

    7/27

    5/7/2011

    (cont..)

    For I in srange loop

    if s(I) /= undriven then

    drive_count := drive_count + 1;

    if drive_count = 1 thenresult := a (I);

    else

    result : = undriven

    end if;End loop

    Return result; -- return value

    End resolve_cluster; -- end function

    End cluspack; -- end package

  • 8/6/2019 L8_Subprograms and Packages

    8/27

    5/7/2011

    Subprograms Subprograms consist of

    Procedure

    Function

  • 8/6/2019 L8_Subprograms and Packages

    9/27

    5/7/2011

    Subprogram properties Similar to PROCESS statements

    IF, CASE, and LOOP, WAIT is not allowed.

    Fundamental difference at the level of application. Process is intended for immediate use in the main

    code, the others are intended mainly for Libraryallocation, I.e. their purpose is to store commonly

    used pieces of code, so they can be reused orshared by other projects.

    If, desired, a Function or Procedure can also beinstalled in the main code itself.

  • 8/6/2019 L8_Subprograms and Packages

    10/27

    5/7/2011

    Procedure and Function A procedure can

    return more than one

    argument. A procedure can have

    input parameters,

    output parameters and

    inout parameters

    A function always returnsjust one.

    All parameters are inputparameters

    E.g. data type conversions,logical operations,arithmetic computations,

    new operator andattributes

    Signal declaration andcomponent instantiation isnot allowed.

  • 8/6/2019 L8_Subprograms and Packages

    11/27

    5/7/2011

    Function syntax To construct and use of a function, two

    parts are necessary:

    The function body and

    A call to the function

  • 8/6/2019 L8_Subprograms and Packages

    12/27

    5/7/2011

    Function bodyFUNCTION function_name [] RETURN data_type is

    [declaration]

    Begin

    [sequential statements]

    END function_name;

  • 8/6/2019 L8_Subprograms and Packages

    13/27

    5/7/2011

    Function body (cont..) = [CONSTANT] constant_name: constant_type; or

    = SIGNAL signal_name:signal_type;

    VARIABLES are not allowed. There can be any type of synthesizable data types.

    No range specification should be included (e.g. do not

    enter range when using INTEGER or TO/Down to when

    using std_logic_vector) There is only one return value, whose type is specified by

    data_type.

  • 8/6/2019 L8_Subprograms and Packages

    14/27

    5/7/2011

    Example of function bodyFUNCTION f1

    (a,b : integer;

    signal c : std_logic_vector)

    return BOOLEAN is

    Begin

    (sequential statements)

    END f1;

  • 8/6/2019 L8_Subprograms and Packages

    15/27

    5/7/2011

    Function call A function is called as par of an expression. The

    expression can obviously appear by itself or

    associated to a statement (either concurrent orsequential).

    Example of function calls:

    X

  • 8/6/2019 L8_Subprograms and Packages

    16/27

    5/7/2011

    FunctionUse library ieee;

    Use ieee.std_logic_1164.all;

    package num_type is

    type log8 is array (0 to 7) of std_logic;

    end num_type;

  • 8/6/2019 L8_Subprograms and Packages

    17/27

    5/7/2011

    Use library ieee;

    Use ieee.std_logic_1164.all;Use work.num_type.all;

    Entity convert is

    port (i1 : in log8;

    o1 : out integer);

    End convert;

  • 8/6/2019 L8_Subprograms and Packages

    18/27

    5/7/2011

    Architecture behave of convert is

    function vector_to_int (s : log8)

    return integer isvariable result : integer := 0;

    begin

    for I in 0 to 7 loop

    result : = result * 2:

    if s(I) = 1 then

    result := result + 1;

    end if;

    end loop;

    return result;

    end vector_to_int;

    Begin

    o1

  • 8/6/2019 L8_Subprograms and Packages

    19/27

    5/7/2011

    Conversion Function Conversion Function are used to convert an

    object of one type to another.

    They are used in component instantiation

    statement to allow mapping of signals and

    ports of different types.

  • 8/6/2019 L8_Subprograms and Packages

    20/27

    5/7/2011

    Conversion function (example)Function conversion4val (s: fourval)

    return fourvalue is

    Begincase s is

    when x => return x;

    when L => return 0;

    when H => return 1

    when z => return z;

    end case;

    End convert4val;

  • 8/6/2019 L8_Subprograms and Packages

    21/27

    5/7/2011

    Resolution Function A resolution function is used to return the value of

    a signal when the signal is driven by multiple

    drivers. A resolution function consists of a function that is

    called whenever one of the drivers for the signal

    has an event occur on it.

    The resolution function is executed and returns a

    single value from all of the driver values; this

    value is the new value of the signal.

  • 8/6/2019 L8_Subprograms and Packages

    22/27

    5/7/2011

    Operator Overloading When a standard operator symbol is made to

    behave differently based on the type of its

    operands, the operator is said to be overloaded. Function bodies are written to define the behavior

    of overloaded operators.

    The number of parameters in such a function must

    match in cardinality with that of the predefined

    operator.

  • 8/6/2019 L8_Subprograms and Packages

    23/27

    5/7/2011

    Procedure A procedure is very similar to a function.

    A procedure can return more than one value

    Two parts are required to construct and use

    a procedure

    Procedure body

    Procedure call

  • 8/6/2019 L8_Subprograms and Packages

    24/27

    5/7/2011

    Procedure bodyProcedure procedure_name [] is

    [declarations]

    Begin

    (sequential statements)

    End procedure_name;

  • 8/6/2019 L8_Subprograms and Packages

    25/27

    5/7/2011

    Procedure (example) Procedure my_procedure( a : in std_logic;

    signal b,c : in std_logic;

    signal x : out std_logic_vector(7 downto 0);

    signal y : inout integer range 0 to 99) is

    Begin

    ------End my_procedure;

  • 8/6/2019 L8_Subprograms and Packages

    26/27

    5/7/2011

    = [CONSTANT] constant_name: mode type

    = SIGNAL signal_name: mode type; or

    = VARIABLE variable_name : mode type

    A procedure can have any number of IN,OUT or INOUT parameters,

    Which can be SIGNALS, VARIABLES, or CONSTANTS.

  • 8/6/2019 L8_Subprograms and Packages

    27/27

    5/7/2011

    Procedure call Procedure call is a statement on its own.

    It can appear by itself or associated to a

    statement (either concurrent or sequential)

    Ex.

    Compute_min_max(in1,in2,out1,out2)