Concurrent Statement | ---- used in ----> | Architecture |
Syntax |
label: for parameter in range generate concurrent statements end generate label; |
Rules and Examples |
The for ..generate statement isd usually used to instantiate
"arrays" of components. The generate parameter may be used to index
array-type signals associated with component ports:
architecture GEN of REG_BANK is component REG port(D,CLK,RESET : in std_ulogic; Q : out std_ulogic); end component; begin GEN_REG: for I in 0 to 3 generate REGX : REG port map (DIN(I), CLK, RESET, DOUT(I)); end generate GEN_REG; end GEN; |
A label is compulsory with a generate statement. | The for ... generate statement is particularily powerful when used with integer generics. |
Instance labels inside a generate statement do not
need to have an index:REGX(I): -- Illegal |
for .. generate statements may be nested to create two-dimensional instance "arrays". |
Another form of generate is the if ... generate
statement. This is usually used within a for .. generate
statement, to account for irregularity. For instance, a ripple-carry
adder with no carry-in:
architecture GEN of RIPPLE is component FULLADD port (A,B,CIN : in bit; SUM, CARRY : out bit); end component; component HALFADD port(A,B : in bit; SUM, CARRY : out bit); end component; signal C : bit_vector(0 to 7); begin GEN_ADD: for I in 0 to 7 generate LOWER_BIT: if I=0 generate U0: HALFADD port map (A(I),B(I),S(I),C(I)); end generate LOWER_BIT; UPPER_BITS: if I>0 generate UX: FULLADD port map (A(I),B(I),C(I-1),S(I),C(I)); end generate UPPER_BITS; end generate GEN_ADD; COUT <= C(7); end GEN; |
Synthesis Issues |
Whats New in '93 |
In VHDL-93, a generate statement may contain local declarations, followed by the kjeyword begin.