Generate

De meeste designs hebben ergens wel een bus, of een signaal dat een vector is. Daarom kan het ook vaak voorkomen dat VHDL-code nogal veel herhalingen heeft. Neem bijvoorbeeld het design hier onder, waarbij er een and gedaan wordt voor elke input-paar. Rechts zie je een beschrijving hiervan in VHDL.

Design voor for-generate

    ...
    y(0) <= x(0) and x(1);
    y(1) <= x(2) and x(3);
    y(2) <= x(4) and x(5);
    y(3) <= x(6) and x(7);
    ...

Zolang dat het aantal bits in deze X-vector behapbaar blijft, kan je dat volledig uitschrijven. Als deze vector te breed wordt, dan begint het pijnlijk te worden. In VHDL wordt hieraan tegemoet gekomen mbv een for-generate. Deze constructie bespaart aanzienlijk veel “beschrijf werkt” zonder aan de functionaliteit te komen.

Het uiteindelijke design verandert niet omdat een for-generate gebruikt wordt.

    ...

    GENERATE_LABEL_DAT_JE_ZELF_MAG_KIEZEN: for i in 0 to 3 generate
        y(i) <= x(i*2) and x(i*2+1)
    end generate GENERATE_LABEL_DAT_JE_ZELF_MAG_KIEZEN;
    ...

Het kan, voor beginnende VHDL-gebruikers soms verwarrend zijn hoe deze indices gebruikt moeten worden. Een goede tip is om de eerste 2-3 instanties volledig uit te schrijven. Hiermee kan het patroon van de indices gemakkelijker herkend worden.

Componenten instantiëren mbv een for-generate

Ook het instantiëren van een component kan gebeuren met een for-generate. Indien men het bovenstaande voorbeeld willen beschrijven met de AND-poort uit het vorige hoofdstuk, kan dit als volgt:

    ...
    GEN_AND: for i in 0 to 3 generate

        and_gate_inst: component and_gate port map(
                A => x(i*2),
                B => x(i*2+1),
                Z => y(i)
            );

    end generate GEN_AND;
    ...

Vivado kan een schematische voorstelling maken van de hardware beschrijving met RTL analysis elaborate design.