A data type appears in a declaration to identify the type used at that point. There are four classes of types in VHDL
        • Scalar types:
represent a single numeric value, or in the case of enumerated types, an
        enumeration value.
        The standard types that fall into this class are:
    
        • Composite types:
represent a collection of values.
        The standard types that fall into this call are:
    
The bit data type is the most fundamental representation of a wire in VHDL. the bit type has only two possible values. '0' and '1' that can used to represent logical 0 and 1 values (respectively) in a digital system.
           type activated : bit ;
        
        The bit type is the basic type to represent logical values. Note that there are only two values defined for the
        bit type and it is not possible to use it for high impedance and other non-trivial values such as Unknown,
        Resistive Weak, etc. (see Std_logic).
        According to the type definition, its leftmost value is '0', therefore the default value of any
        object of the
        bit type is '0'.
        As the bit type is defined in the Standard package, it can be used in any VHDL specification without additional
        declarations.
        Signals of the bit type are not resolved which means that such a signal can be assigned to an expression only
        once in the entire architecture.
    
           variable activated : bit := '1';
           signal output : bit ;
           constant pause : bit := '0';
         The Boolean type has two possible values, true and false.
           type light_on : boolean ;
        
        The boolean type is used for conditional operations. Boolean objects can be used with any of the relational
        operators <, >, <, <=, = or /=.
        According to the definition type, the leftmost value of the Boolean type is false,
therefore the default
        value
        of any object of the Boolean type is false.
        Since the boolean type is defined in the Standard package, it can be used in any VHDL specification without
        additional declarations.
    
        variable light_on : boolean := false;
        variable is_greater_than : boolean := true;
         
        variable name : INTEGER  := a_integer_number ;
        type new_name is  integer_left_bound to  integer_right_bound; -- descending
        type new_name is  integer_left_bound downto  integer_right_bound; -- ascending
    
        An integer type is a numeric type which consists of integer numbers within the specified range. There is only
        one predefined Integer type, and that is type Integer which range depends on the implementation,
        but must cover at least the range +/-(2E31 - 1).
        A user-defined integer type can be constructed on the basis of the predefined Integer type by constraining its
        range.
        
All integer types (including user-defined) have the same set of arithmetic operators, defined in the package
        Standard, namely: addition, subtraction, multiplication, division, modulus, and remainder.
        
In all cases both operands and the result are of the integer type.
        Relations can be checked on integer operands:equal, unequal, greater than, less than, greater or equal than,
            and less or equal than.
        
 In all cases, the result is of the Boolean type.
    
        variable number_of_cards: INTEGER := 52;
        type Level is range 0 to  7;
        type student_grade is range 0 to 100;
    
        constant name : REAL := real_number ;
        type new_name is range real_number_left_bound downto  real_number_right_bound; -- descending
        type new_name is range real_number_left_bound to  real_number_right_bound;  -- ascending
    
        A floating point type is a numeric type consisting of real numbers which values are constrained by a specified
        range.
        There exists only one predefined floating point type: Real.
 The range of the values for the type Real are
        implementation-dependent,
        but it is required by the standard that it covers the values from -1.0E38 to +1.0E38.
        A user-defined floating point type can be constructed on the basis of the predefined Real type by constraining
        its range.
        The bounds of the range of a user-defined floating point type must be static floating point type expressions.
        
All floating point types (including user-defined) have the same set of arithmetic operators, namely:
        addition, subtraction, multiplication, division, absolute function and exponentiation.
    
        constant pi : REAL := 3.14159 ;
        type InputLevel is range -6.55 to  +12.35;
        type Int64K is range -65536.00 to 65535.00;
    
                constant POSITIVE_INF : REAL := 1.0E308;
                constant NEGATIVE_INF REAL := -1.0E308;
            
                library ieee;
                use ieee.float_pkg.all;
                variable limit : float32 := INF; -- Positive Infinity
                variable distance float32:= -INF;  -- Negative Infinity
            
        type new_name is range left_bound to downto right_bound;
        units
            primary_unit_name;
            secondary_unit_name = number primary_unit_name;
            ...
        end units [ new_name ];
            A physical type allows to define measurement units for some physical quantity, like length, time, pressure,
            capacity, etc.
            A physical type declaration starts with the definition of a primary unit,
            
which is optionally followed by, one or more 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.
        
        type Capacity  is range to integer'high
        units
            pF; -- picofarad
            nF = 1000 pF ; -- nanofarad
            mF = 1000 nF ; -- microfarad
            mF = 1000 uF ; -- milifarad
            F = 1000 mF ; -- Farad
        end units
           type new_name is  ( type_element, type_element, ...);
        
            The enumeration type is a type with an ordered set of values, called enumeration literals, and consisting of
            identifiers and character literals.
 The same value cannot appear twice in the same type, but may appear
            in
            two (or more) different enumeration types. This is called overloading.
            All enumerated values are ordered and each of them has a numeric (integer) value assigned to it. This number
            indicates the position of the value in the list.
            The first value in the definition has position number zero and each subsequent has the number increased by
            one
            from its predecessor.
        
            type FSM_States is (idle, start, stop, clear);
            type std_ulogic is ('U', 'X', '0', '1', 'Z', 'W', 'L', 'H', '-');
         
        type character is (
                            NUL, SOH, STX, ETX, EOT, ENQ, ACK, BEL,
                            BS, HT, LF, VT, FF, CR, SO, SI,
                            DLE, DC1, DC2, DC3, DC4, NAK, SYN, ETB,
                            CAN, EM, SUB, ESC, FSP, GSP, RSP, USP,
                            ' ', '!', '"', '#', '$', '%', &, ''',
                            '(', ')', '*', '+', ',', '-', '.', '/',
                            '0', '1', '2', '3', '4', '5', '6', '7',
                            '8', '9', ':', ';', '<', '=', '>', '?',
                            '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
                            'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
                            'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
                            'X', 'Y', 'Z', '[', '\', ']', '^', '_',
                            '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
                            'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
                            'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
                            'x', 'y', 'z', '{', '|', '}', '~', DEL
                        );
        The CHARACTER data type enumerates the ASCII character set. Nonprinting characters are represented by a three-letter name, such as NUL for the null character. Printable characters are represented by themselves, in single quotation marks
            variable CHARACTER_VAR: CHARACTER;
            CHARACTER_VAR := 'A';