L8_Subprograms and Packages
-
Upload
usitggsipu -
Category
Documents
-
view
219 -
download
0
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)