====== Attribute declarations ======
===== attribute_declaration =====
attribute identifier : type_mark ;
Attributes can be used to poll the characteristics of objects (e.g. signals). In many cases this allows a shorter and more elegant VHDL description to be created. The most important attributes are [[.:Predefined attributes|predefined ones]].
In order to be able to use one`s own attributes one has to write a corresponding function which then provides the
attribute`s value at any given time. For further information go to: [[.:Attribute specification]].
===== Parents =====
* entity_declarative_part
* architecture_declarative_part
* package
* block_declarative_part
* function_declarative_part
* procedure_declarative_part
* process_declarative_part
===== Further definitions =====
==== identifier ====
* [[.:bnf#basic_identifier]]
* [[.:bnf#extended_identifier]]
==== type_mark ====
''type _[[.:bnf#name]]''
''subtype _[[.:bnf#name]]''
===== Examples =====
//capacitance_value// is declared as an attribute of the type //capacitance// .
ATTRIBUTE capacitance_value :
capacitance ;
----
The attribute //pin_number// declared here is of the subtype //pin_natural// .
SUBTYPE pin_natural IS natural
RANGE 1 TO 24 ;
ATTRIBUTE pin_number : pin_natural ;
----
Two different attributes are declared.
//location// is of the type //coordinate// which is a Record type.
//pin_no// is of the type //positive// which is a subtype of //integer// .
TYPE coordinate IS
RECORD
x, y : integer ;
END RECORD ;
TYPE positive IS integer
RANGE 1 TO integer'high ;
ATTRIBUTE location : coordinate ;
ATTRIBUTE pin_no : positive ;
----
By using [[.:predefined attributes]] the loop-instruction can be written in a different way as well:
FOR i IN a1'LOW TO a1'HIGH
FOR i IN a1'RIGHT TO a1'LEFT
FOR i IN a1'REVERSE_RANGE
FOR i IN a1'RANGE
SIGNAL a1: bit_vector(3 DOWNTO 0) ;
...
PROCESS (a)
BEGIN
z<= "0000";
FOR i in 0 TO 3 LOOP
IF (a = i) THEN
z(i) <= '1' ;
END IF ;
END LOOP ;
END PROCESS ;
...