0% found this document useful (0 votes)
157 views

VHDL Data Types

This document discusses VHDL data types. It describes scalar types like enumeration, integer, physical, and floating point types. It also covers composite types like arrays and records. Specifically, it defines enumeration, integer, and floating point types. It provides examples of array declarations and how to access array elements. It also discusses unconstrained arrays and predefined array types like STRING and BIT_VECTOR.

Uploaded by

Akundi Akundi
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
157 views

VHDL Data Types

This document discusses VHDL data types. It describes scalar types like enumeration, integer, physical, and floating point types. It also covers composite types like arrays and records. Specifically, it defines enumeration, integer, and floating point types. It provides examples of array declarations and how to access array elements. It also discusses unconstrained arrays and predefined array types like STRING and BIT_VECTOR.

Uploaded by

Akundi Akundi
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
You are on page 1/ 22

G.H.

RAISONI COLLEGE OF ENGINEERING, NAGPUR


(AN AUTONOMOUS INSTITUTE AFFILIATED TO RTM NAGPUR UNIVESITY

VHDL DATA TYPES

NAME: A.Harshvardhan
C-18
Artificial Intelligence
Modelling Of Digital Circuits
Prof. Rahul Agarwal
VHDL Data Types
DATA TYPES
 Every data object in VHDL can hold a value that belongs to a set of
values. This set of values is specified by using a type declaration.
 A type is a name that has associated with it a set of values and a set of
operations.
 The language also provides the facility to define new types by using type
declarations and also to define a set of operations on these types by
writing functions that return values of this new type.
 All the possible types that can exist in the language can be categorized
into the following four major categories:
1. Scalar types: Values belonging to these types appear in a sequential
order.
2. Composite types: These are composed of elements of a single type (an
array type) or elements of different types (a record type).
3. Access types: These provide access to objects of a given type (via
pointers).
4. File types: These provides access to objects that contain a sequence of
values of a given type.
SUBTYPES
 A subtype is a type with a constraint.
 The constraint specifies the subset of values for the type.
 The type is called the base type of the subtype.
 An object is said to belong to a subtype if it is of the base type
and if it satisfies the constraint.
 Subtype declarations are used to declare subtypes.
 An object can be declared to either belong to a type or to a
subtype.
 Examples of subtypes are
subtype MY_INTEGER is INTEGER range 48 to 156 ;
type DIGIT is ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') ;
subtype MIDDLE is DIGIT range '3' to '7' ;
 A subtype need not impose a constraint. In such a case, the
subtype simply gives another name to an already existing type.
For example:
subtype NUMBER is DIGIT;
SCALAR TYPES
 The values belonging to this type are ordered, that is, relational
operators can be used on these values.
 For example, BIT is a scalar type and the expression '0' < 1' is
valid.
 There are four different kinds of scalar types:
1. enumeration,
2. integer,
3. physical,
4. floating point.
 Integer types, floating point types, and physical types are
classified as numeric types since the values associated with
these types are numeric.
 Further, enumeration and integer types are called discrete types
since these types have discrete values associated with them.
Enumeration Types
 An enumeration type declaration defines a type that has a set of
user-defined values consisting of identifiers and character
literals.
 Examples are
type MVL is ('U','0','1','Z);
type MICRO_OP is (LOAD, STORE, ADD, SUB, MUL, DIV);
subtype ARITH_OP is MICRO_OP range ADD to DIV;
 Examples of objects defined for these types are
signal CONTROL_A: MVL;
signal CLOCK: MVL range '0' to '1';
variable IC: MICRO_OP := STORE;
variable ALU: ARITH_OP;
Contd…
 The predefined enumeration types of the language are
CHARACTER, BIT, BOOLEAN, and SEVERITY_LEVEL.
 Values belonging to the type CHARACTER constitute the 128
characters of the ASCII character set. These values are called
character literals and are always written between two single
quotes (' ').
 Examples are
'A', '_', '" (the single quote character itself),
'3' (the character literal 3)
 The predefined type BIT has the literals '0' and 1’
 BOOLEAN has the literals FALSE and TRUE
 Type SEVERITY_LEVEL has the values NOTE, WARNING,
ERROR, and FAILURE
Integer Types
 An integer type defines a type whose set of values fall within a
specified integer range.
 Examples of integer type declarations are
type INDEX is range 0 to 15;
type WORD_LENGTH is range 31 downto 0;
subtype DATA_WORD is WORD_LENGTH range 15 downto
0;
type MY_WORD is range 4 to 6;
 Some object declarations using these types are
constant MUX_ADDRESS: INDEX := 5;
signal DATA_BUS: DATA_WORD;
Floating Point Types
 A floating point type has a set of values in a given range of real
numbers. Examples of floating point type declarations are
type TTL_VOLTAGE is range -5.5 to -1.4;
type REAL_DATA is range 0.0 to 31.9;
 An example of an object declaration is
variable LENGTH: REAL_DATA range 0.0 to 15.9;
...
variable L1, L2, L3: REAL_DATA range 0.0 to 15.9;

subtype RD16 is REAL_DATA range 0.0 to 15.9;


...
variable LENGTH: RD16;
...
variable L1, L2, L3: RD16;
Contd…
 Floating point literals differ from integer literals by the presence
of the dot ( . ) character.
 Thus 0 is an integer literal while 0.0 is a floating point literal.
 Floating point literals can also be expressed in an exponential
form. The exponent represents a power of ten and the exponent
value must be an integer. Examples are
62.3 E-2 5.0 E+2
 The only predefined floating point type is REAL.
 The range of REAL is again implementation dependent but it
must at least cover the range -1.0E38 to +1.0E38 and it must
allow for at least six decimal digits of precision.
Physical Types
 A physical type contains values that represent measurement of
some physical quantity, like time, length, voltage, and current.
Values of this type are expressed as integer multiples of a base
unit. An example of a physical type declaration is
type CURRENT is range 0 to 1E9
units
nA; -- (base unit) nano-ampere
uA = 1000 nA; -- micro-ampere
mA = 1000 μA; --milli-ampere
Amp = 1000 mA; -- ampere
end units;

subtype FILTER_CURRENT is CURRENT range 10 μA to 5 mA;


COMPOSITE TYPES
 A composite type represents a collection of values.
 There are two composite types: an array type and a record type.
 An array type represents a collection of values all belonging to a
single type
 A record type represents a collection of values that may belong to
same or different types.
 An element of a composite type could have a value belonging to
either a scalar type, a composite type, or an access type.
 For example, a composite type may be defined to represent an
array of an array of records.
Array Types
 An object of an array type consists of elements that have the
same type.
 Examples of array type declarations are
type ADDRESS_WORD is array (0 to 63) of BIT;
type DATA_WORD is array (7 downto 0) of MVL;
type ROM is array (0 to 125) of DATA_WORD;
type DECODE_MATRIX is array (POSITIVE range 15
downto 1, NATURAL range 3 downto 0) of MVL;
 --POSITIVE and NATURAL are predefined subtypes; these are:
 subtype NATURAL is INTEGER range 0 to INTEGER'HIGH;
 subtype POSITIVE is INTEGER range 1 to INTEGER'HIGH;
 -- The HIGH attribute gives the highest value belonging to the
type.
Contd…
 Examples of object declarations using these types are
variable ROM_ADDR: ROM;
signal ADDRESS.BUS: ADDRESS_WORD;
constant DECODER: DECODE_MATRIX;
variable DECODE_VALUE: DECODE_MATRIX;
 ROM_ADDR is a one-dimensional array object that consists of
126 elements, each element being another array object
consisting of 8 elements of type MVL.
 Elements of an array can be accessed by specifying the index
values into the array.
 For example, ADDRESS_BUS(26) refers to the 27th element of
ADDRESS_BUS array object; ROM_ADDR(10)(5) refers to the
value (of type MVL) at index 5 of the ROM_ADDR(10) data object
(of type DATA_WORD); DECODER(5,2) refers to the value of the
element at the 2nd column and 5th row of the two-dimensional
object.
Contd…
 The language also allows array types to be unconstrained, in this
case, the number of elements in the array is not specified in the
type declaration.
 Instead, the object declaration for that type declares the number
of elements of the array.
 A subtype declaration may also specify the index constraint for
an unconstrained array type.
 Examples of unconstrained array declarations are
type STACK_TYPE is array (INTEGER range <>) of
ADDRESS_WORD;
subtype STACK is STACK_TYPE(0 to 63);
type OP_TYPE is (ADD, SUB, MUL, DIV);
type TIMING is array (OP_TYPE range <>, OP_TYPE range <>)
of TIME;
Contd…
 Examples of object declarations using these types are
variable FAST_STK: STACK_TYPE(-127 to 127);
constant ALU_TIMING: TIMING :=
--ADD, SUB, MUL
((10 ns, 20 ns, 45 ns), -- ADD
(20 ns, 15 ns, 40 ns), -- SUB
(45 ns, 40 ns, 30 ns)); -- MUL
 There are two predefined one-dimensional unconstrained array
types in the language, STRING and BIT_VECTOR.
 STRING is an array of characters while BIT_VECTOR is an array
of bits. Examples are
variable MESSAGE: STRING(1 to 17) := "Hello, VHDL world";
signal RX_BUS: BIT_VECTOR(0 to 5) := O"37";
--O"37" is a bit-string literal representing the octal value 37.
constant ADD_CODE: BIT_VECTOR := ('0', '1', '1', '1', '0'):
Contd…
 There are many different ways to assign values to an array
object. Here are some examples.
variable OP_CODES : BIT_VECTOR(1 to 5);
OP_CODES := "01001"; -- A string literal is assigned.
OP_CODES := ('0', '1', '0', '0', '1'); -- Positional association is
implicit;
-- first value is assigned to OP_CODES(0), second value to
OP_CODES(1), and so on.
OP_CODES := (2=>'1', 5=>'1', others=>'0'); -- Named association;
-- second and fifth element of OP_CODES get the value '1', and
-- the rest get a value of '0'.
OP_CODES := (others=>'0'); -- All values set to '0'.
 The expressions used in the last three assignments to
OP_CODES are examples of array aggregates. An aggregate is a
set of comma separated elements enclosed within parenthesis.
Record Types
 An object of a record type is composed of elements of same or
different types.
 An example of a record type declaration is
type PIN_TYPE is range 0 to 10;
type MODULE is
record
SIZE: INTEGER range 20 to 200;
CRITICAL_DLY: TIME;
NO_INPUTS: PIN_TYPE:
NO_OUTPUTS: PIN_TYPE;
end record;
Contd…
 Values can be assigned to a record type object using aggregates.
For example,
variable NAND_COMP: MODULE;
-- NAND_COMP is an object of record type MODULE.
NAND_COMP := (50, 20 ns, 3,2);
-- Implies 50 is assigned to SIZE, 20 ns is assigned to
CRITICAL_DLY, etc.
 Values can be assigned to a record type object from another
record type object of the same type using a single assignment
statement.
 In the following example, each element of NAND_GENERIC is
assigned the value of the corresponding element in NAND_COMP.
signal NAND_GENERIC: MODULE;
NAND_GENERIC <= NAND_COMP;
Access Types
 Values belonging to an access type are pointers to a dynamically
allocated object of some other type.
 Examples of access type declarations are
-- MODULE is a record type declared in the previous sub-section.
type PTR is access MODULE;
type FIFO is array (0 to 63, 0 to 7) of BIT;
type FIFO_PTR is access FIFO;
 PTR is an access type whose values are addresses that point to
objects of type MODULE.
variable MOD1PTR, MOD2PTR: PTR; - Default value is null.
 Objects that access types point to, can be created using
allocators. Allocators provide a mechanism to dynamically create
objects of a specific type.
MOD1PTR := new MODULE;
Contd…
 The new in this assignment causes an object of type MODULE to
be created and the pointer to this object is returned.
 The values of the elements of the MODULE record are the default
values of each element;
 These are 20 (the leftmost value of the implied subtype) for the
SIZE element, TIME'LEFT for the CRITICAL_DLY element, and
the value 0 (this is PIN_TYPE'LEFT) for the NO_INPUTS and
NO_OUTPUTS elements. Initial values can also be assigned to a
newly created object by explicitly specifying the values as shown
in the following example.
MOD2PTR := new MODULE'(25, 10ns, 4, 9);
 Pointers can be assigned to other pointer variables of the same
access type. Therefore,
MOD1PTR := MOD2PTR;
is a legal assignment. Both MOD1PTR and MOD2PTR now point
to the same object.
File Types
 Objects of file types represent files in the host environment. They
provide a mechanism by which a VHDL design communicates
with the host environment. The syntax of a file type declaration is
type file-type-name Is file of type-name,
 The type-name is the type of values contained in the file. Here are
two examples.
type VECTORS is file of BIT_VECTOR;
type NAMES is file of STRING;
 A file of type VECTORS has a sequence of values of type
BIT_VECTOR; a file of type NAMES has a sequence of strings as
values in it.
 A file is declared using a file declaration. The syntax of a file
declaration is:
file file-name: file-type-name is mode string-expression ',
Thanks…

You might also like