Physical Type
Formal Definition
Physical type
is a numeric scalar that represents some quantity. Each value of a
physical type has a position number that is an integer value. Any
value of a physical type is a straight multiple of the primary unit
of measurement for that type.
Simplified Syntax
type type_name is
range left_bound to right_bound
units
primary_unit_name
secondary_unit_name = number primary_unit_name
secondary_unit_name = number primary_unit_name
. . .
end units type_name
type type_name is
range left_bound downto right_bound
units
primary_unit_name
secondary_unit_name = number primary_unit_name
secondary_unit_name = number primary_unit_name
. . .
end units type_name
Description
A physical type allows to define measurement units for some physical
quantity, like length, time, pressure, capacity, etc.
The range, specified at the beginning of a physical type, defines the
minimum and maximum values of a given quantity expressed in the base
units (see primary unit declaration below). The bounds of the range
of a physical type should be in the form of locally static
expression. The expression is classified as locally static if it is
possible to determine its value without running the code. The value
of an expression used as a range for a physical type must be of
integer type. It is legal to use negative bounds.
At the core of a physical type declaration is the definition of a primary
unit, and optionally, multiple secondary
units. The primary
unit serves as the base unit for representing values of the specified
type. The secondary units
are defined as multiplicity of primary
units or previously specified secondary
units. Their declarations may contain only integer literals.
Each value of a physical type has
a corresponding position number, which is the number of primary units
represented by that unit name. This way values specified in different
units of the same type can be compared (Example 2).
For all physical types, both TIME
and user-defined, relational and arithmetic operators can be used.
The VHDL standard predefines only one physical type: TIME, which is
defined in the STANDARD package.
The value of one unit can be written in short form using the name of
the unit only (i.e. without the value 1 - Example 3).
Examples
Example 1
type CAPACITY is range
0 to 1E5
units
pF; -- picofarad
nF = 1000 pF; -- nanofarad
uF = 1000 nF; -- microfarad
mF = 1000 uF; -- milifarad
F = 1000 mF; -- farad
end units CAPACITY;
The primary unit in this example is one picofarad and the maximum
value of the CAPACITY type object is 105 pF.
Example 2.
type DISTANCE is range 0 to 1E5
units
um; -- micrometer
mm = 1000 um; -- millimeter
in_a = 25400 um; -- inch
end units DISTANCE;
variable Dis1, Dis2 : DISTANCE;
Dis1 := 28 mm;
Dis2 := 2 in_a - 1 mm;
if Dis1 < Dis2 then ...
Both, a comparison and an arithmetic operation can be performed on
visually different measurement units as long as they are defined as
the same type with the same base unit.
Example 3
SomeVar := mF;
This assignment means that the variable SomeVar will be assigned the
value of 1 mF.
Important Notes
-
Physical types are not synthesizeable. As a result, delays in signal
assignments are not synthesizeable as well.
-
It is not allowed to use floating point values in physical type
declarations, i.e. if a conversion from millimeters to inches (25.4
mm = 1 in) would have to be performed, then millimeters could not be
used as the base unit.
|