Meerdere registers

Het aantal ontwerpen dat je ooit zal maken dat minder dan 2 registers heeft, zal eerder beperkt zijn. Het beschrijven van registers neemt nogal wat regels HDL code in beslag. Stel dat er 2 registers in een design zijn: regA en regB. Een VHDL beschrijving van dit design zal ergens onderstaande twee stukken code bevatten.

    PREGA: process(clock_i)
    begin
        if rising_edge(clock_i) then
            if reset_i = '1' then 
                regA <= (others => '0');
            else
                if load_A = '1' then 
                    regA <= regA_in;
                end if;
            end if;
        end if;
    end process;
    PREGB: process(clock_i)
    begin
        if rising_edge(clock_i) then
            if reset_i = '1' then 
                regB <= (others => '0');
            else
                if load_B = '1' then 
                    regB <= regB_in;
                end if;
            end if;
        end if;
    end process;

Beide registers hebben een synchrone, actief hoge reset. Als, op een rising edge, de respectievelijke load signalen hoog zijn, zullen de register de inkomende data samplen..

Merk op dat labels niet dubbel gebruikt mogen worden. De 2 labels in bovenstaand voorbeeld zijn PREGA en PREGB.

Een compactere manier om deze twee registers te beschrijven is hier weergegeven. Aangezien de 2 beschrijvingen van register A en register B veel op elkaar lijken, kunnen deze beschrijvingen gemakkelijk samengenomen worden.

Extra aandacht moet besteed worden aan de if-then(-else) structuur. Wees jezelf er bewust van dat (in dit voorbeeld) het load_A signaal totaal geen effect heeft op register B. Er mag dus géén else gebruikt worden.

Dit zou echter geen syntax-fouten geven.

Met een else-beschrijving zou er immers beschreven worden dat register B enkel mag laden als load_A laag is EN load_B hoog is. Dit is een perfect plausible gedrag, maar niet gedrag dat in dit voorbeeld beoogd is.

    PREGAB: process(clock_i)
    begin
        if rising_edge(clock_i) then
            if reset_i = '1' then 
                regA <= (others => '0');
                regB <= (others => '0');
            else
                if load_A = '1' then 
                    regA <= regA_in;
                end if;
                
                if load_B = '1' then 
                    regB <= regB_in;
                end if;
            end if;
        end if;
    end process;