Chapter start Previous page Next page 10.8 Type DeclarationsIn some programming languages you must declare objects to be integer, real, Boolean, and so on. VHDL (and ADA, the DoD programming language to which VHDL is related) goes further: You must declare the type of an object, and there are strict rules on mixing objects of different types. We say VHDL is strongly typed. For example, you can use one type for temperatures in Centigrade and a different type for Fahrenheit, even though both types are real numbers. If you try to add a temperature in Centigrade to a temperature in Fahrenheit, VHDL catches your error and tells you that you have a type mismatch. This is the formal (expanded) BNF definition of a type declaration: type_declaration ::= type identifier ; | type identifier is (identifier|'graphic_character' {, identifier|'graphic_character'}) ; | range_constraint ; | physical_type_definition ; | record_type_definition ; | access subtype_indication ; | file of type_name ; | file of subtype_name ; | array index_constraint of element_subtype_indication ; | array (type_name|subtype_name range <> {, type_name|subtype_name range <>}) of element_subtype_indication ; There are four type classes in VHDL [VHDL LRM3]: scalar types, composite types, access types, and file types. The scalar types are: integer type, floating-point type, physical type, and enumeration type. Integer and enumeration types are discrete types. Integer, floating-point, and physical types are numeric types. The range of an integer is implementation dependent but is guaranteed to include -2147483647 to +2147483647. Notice the integer range is symmetric and equal to -(231- 1) to (231- 1). Floating-point size is implementation dependent, but the range includes the bounds -1.0E38 and +1.0E38, and must include a minimum of six decimal digits of precision. Physical types correspond to time, voltage, current, and so on and have dimensions--a unit of measure (seconds, for example). Access types are pointers, useful in abstract data structures, but less so in ASIC design. File types are used for file I/O. You may also declare a subset of an existing type, known as a subtype, in a subtype declaration. We shall discuss the different treatment of types and subtypes in expressions in Section 10.12. Here are some examples of scalar type [VHDL LRM4.1] and subtype declarations [VHDL LRM4.2]: entity Declaration_1 is end; architecture Behave of Declaration_1 is type F is range 32 to 212; -- Integer type, ascending range. type C is range 0 to 100; -- Range 0 to 100 is the range constraint. subtype G is INTEGER range 9 to 0; -- Base type INTEGER, descending. -- This is illegal: type Bad100 is INTEGER range 0 to 100; -- don't use INTEGER in declaration of type (but OK in subtype). type Rainbow is (R, O, Y, G, B, I, V); -- An enumeration type. -- Enumeration types always have an ascending range. type MVL4 is ('X', '0', '1', 'Z'); -- Note that 'X' and 'x' are different character literals. -- The default initial value is MVL4'LEFT = 'X'. -- We say '0' and '1' (already enumeration literals -- for predefined type BIT) are overloaded. -- Illegal enumeration type: type Bad4 is ("X", "0", "1", "Z"); -- Enumeration literals must be character literals or identifiers. begin end; The most common composite type is the array type [VHDL LRM3.2.1]. The following examples illustrate the semantics of array declarations: entity Arrays_1 is end; architecture Behave of Arrays_1 is type Word is array (0 to 31) of BIT; -- a 32-bit array, ascending type Byte is array (NATURAL range 7 downto 0) of BIT; -- descending type BigBit is array (NATURAL range <>) of BIT; -- We call <> a box, it means the range is undefined for now. -- We call BigBit an unconstrained array. -- This is OK, we constrain the range of an object that uses -- type BigBit when we declare the object, like this: subtype Nibble is BigBit(3 downto 0); type T1 is array (POSITIVE range 1 to 32) of BIT; -- T1, a constrained array declaration, is equivalent to a type T2 -- with the following three declarations: subtype index_subtype is POSITIVE range 1 to 32; type array_type is array (index_subtype range <>) of BIT; subtype T2 is array_type (index_subtype); -- We refer to index_subtype and array_type as being -- anonymous subtypes of T1 (since they don't really exist). begin end; You can assign values to an array using aggregate notation [VHDL LRM7.3.2]: entity Aggregate_1 is end; architecture Behave of Aggregate_1 is type D is array (0 to 3) of BIT; type Mask is array (1 to 2) of BIT; signal MyData : D := ('0', others => '1'); -- positional aggregate signal MyMask : Mask := (2 => '0', 1 => '1'); -- named aggregate begin end; The other composite type is the record type that groups elements together: entity Record_2 is end; architecture Behave of Record_2 is type Complex is record real : INTEGER; imag : INTEGER; end record; signal s1 : Complex := (0, others => 1); signal s2: Complex; begin s2 <= (imag => 2, real => 1); end; |
|||||
|
|||||
|