====== Generate statement ======
===== generate_statement =====
generate _label :
generation_scheme generate
[ { block_declarative_item }
begin ]
{ concurrent_statement }
end generate [ generate _label ] ;
===== Parents =====
* architecture_statement_part
* block_statement_part
===== Further definitions =====
==== label ====
* [[.:bnf#identifier]]
==== generation_scheme ====
''**for** //generate// _[[.:bnf#parameter_specification]]''
''**if** [[.:bnf#condition]]''
==== block_declarative_item ====
* [[.:bnf#subprogram_declaration]]
* [[.:bnf#subprogram_body]]
* [[.:bnf#type_declaration]]
* [[.:bnf#subtype_declaration]]
* [[.:bnf#constant_declaration]]
* [[.:bnf#signal_declaration]]
* //shared// _[[.:bnf#variable_declaration]]
* [[.:bnf#file_declaration]]
* [[.:bnf#alias_declaration]]
* [[.:bnf#component_declaration]]
* [[.:bnf#attribute_declaration]]
* [[.:bnf#attribute_specification]]
* [[.:bnf#configuration_specification]]
* [[.:bnf#disconnection_specification]]
* [[.:bnf#use_clause]]
* [[.:bnf#group_template_declaration]]
* [[.:bnf#group_declaration]]
==== concurrent_statement ====
* [[.:bnf#block_statement]]
* [[.:bnf#process_statement]]
* [[.:bnf#concurrent_procedure_call_statement]]
* [[.:bnf#concurrent_assertion_statement]]
* [[.:bnf#concurrent_signal_assignment_statement]]
* [[.:bnf#component_instantiation_statement]]
* [[.:bnf#generate_statement]]
===== Comment =====
In VHDL'87 there was no declarative region.
===== Examples =====
This generate-statement forms a parallel chain out of the two components //comp_1// and //comp_2// with a length of 5.
lbl_1 :
FOR i IN 1 TO 5 GENERATE
c1 : comp_1 PORT MAP
( ck => clock,
d => a(i),
q => a(i+1) ) ;
c2 : comp_2 PORT MAP
( ck => clock, d => a(i) ) ;
END GENERATE ;
----
If the generic //n// is bigger than 0 the signal assignments take effect and the component //my_comp// is instantiated.
lbl_2 :
IF n > 0 GENERATE
sig_1 <= '1' AFTER 5 ns ;
sig_2 <= sig_1 AFTER 2 ns ;
c : my_comp PORT MAP (a, b, c) ;
END GENERATE ;
----
Example of a chained generate-statement.
Within the external statement several components are instantiated irrespective of the counter variable //i// .
cadd :
FOR i IN 1 TO n GENERATE
cb : IF i = 1 GENERATE
add_b : add_begin PORT MAP
( ... ) ;
END GENERATE ;
cm : IF i > 1 AND i < n GENERATE
add_m : add_middle PORT MAP
( ... ) ;
END GENERATE ;
ce : IF i = n GENERATE
add_e : add_end PORT MAP
( ... ) ;
END GENERATE ;
END GENERATE cadd ;
----
Example of the wide range of applications for the generate statement.
In order to make them easier to survey the chained generate-statements at label //l2// were duplicated at label //l6// with an altered **IF** -condition.
The generate-statement at label //l8// can also be stated within the generate-statement at label //l3// .
b : BLOCK
BEGIN
l1 : cell PORT MAP ( top, bottom,
a(0), b(0) ) ;
l2 : FOR i IN 1 TO 3 GENERATE
l3 : FOR j IN 1 TO 3 GENERATE
l4 : IF i + j > 4 GENERATE
l5 : cell PORT MAP ( a(i-1),
b(j-1), a(i),b(j));
END GENERATE ;
END GENERATE ;
END GENERATE ;
l6 : FOR i IN 1 TO 3 GENERATE
l7 : FOR j IN 1 TO 3 GENERATE
l8 : IF i + j < 4 GENERATE
l9 : cell PORT MAP ( a(i+1),
b(j+1), a(i), b(j));
END GENERATE ;
END GENERATE ;
END GENERATE ;
END BLOCK b ;