GENERATE

Nebenläufige Anweisungen – GENERATE

ENTITY n_bit_register IS
GENERIC (n : IN positive := 4);
PORT (clk : IN bit;
reg_in : IN bit_vector(n-1 DOWNTO 0);
reg_out : OUT bit_vector(n-1 DOWNTO 0) );
END n_bit_register;

ARCHITECTURE structural OF n_bit_register IS
COMPONENT d_ff_socket
PORT (d, clk : IN bit; q : OUT bit) ;
END COMPONENT;
BEGIN

reg : FOR i IN n-1 DOWNTO 0 GENERATE

d_ff_instance: d_ff_socket
PORT MAP (reg_in(i), clk, reg_out(i)) ;
END GENERATE ;


END structural ;
Die GENERATE-Anweisung kann dazu benutzt werden, viele gleichartige nebenläufige Anweisungen (z.B. Komponenteninstantiierungen) kompakt darzustellen.

GENERATE-Anweisungen müssen ein Label besitzen.

In diesem ersten Beispiel wird die Variante einer FOR-Schleife verwendet. Der GENERATE-Konstrukt wird so oft durchlaufen, bis der (implizit deklarierte) Schleifenindex i alle Werte im Bereich (hier: n DOWNTO 0) angenommen hat. In diesem Fall wurde die Breite des hier realisierten Registers sogar über einen GENERIC realisiert, ist damit parametrisierbar.

ENTITY shift_register IS
GENERIC (n : IN positive RANGE 2 TO 64 := 4);
PORT (clk, ser_in : IN bit;
ser_out : OUT bit );
END shift_register;

ARCHITECTURE structural OF shift_register IS
SIGNAL intern : bit_vector(1 TO n-1);
COMPONENT d_ff_socket
PORT (d, clk : IN bit; q : OUT bit) ;
END COMPONENT;
BEGIN

reg : FOR i IN n DOWNTO 1 GENERATE

reg_begin: IF i = 1 GENERATE

d_ff_begin: d_ff_socket
PORT MAP (ser_in, clk, intern(i)) ;
END GENERATE ;


reg_middle: IF i > 1 AND i < n GENERATE

d_ff_middle: d_ff_socket
PORT MAP (intern(i-1), clk, intern(i)) ;
END GENERATE ;


reg_end: IF i = n GENERATE

d_ff_end: d_ff_socket
PORT MAP (intern(i-1), clk, ser_out) ;
END GENERATE ;

END GENERATE ;


END structural ;
In diesem Beispiel wird ein Schieberegister mit Hilfe von zwei verschachtelten GENERATES realisiert. Die innere Ebene verwendet die zweite Syntaxmöglichkeit, die Angabe einer Bedingung. Hiermit wird zwischen dem ersten, den mittleren und dem letztetn FlipFlop des Schieberegisters unterschieden.