Latches

Naast een register is het ook mogelijk om een latch te hebben. Allebei hebben ze een geheugenwerking en werken ze ten opzichte van een clock. Toch is er een belangrijk verschil.

Register vs Latch

Een register zal op een stijgende (of dalende) klokflank een sample nemen van de input.

Een latch zal tijdens de positieve (of negatieve) halve klok periode een sample nemen van de input.

Alhoewel een latch wel de bedoeling kan zijn bij het design van een ASIC, bij het design voor een FPGA zijn Latches absoluut te vermijden. De tools kunnen heel slecht om (timing gewijs) met latches en meestal zijn ze ook niet gewenst.

Onbedoelde latches

Helaas zijn er een aantal constructies waarbij er een latch gemaakt wordt zonder dat de designer dit wenst.

Deze VHDL code probeert een beschrijving te geven van een multiplexer.

De sensitivy list is echter niet compleet. Als de input rotate_right verandert, wordt de output (transformed) echter niet aangepast.

    PMUX: process(rotate_left, MUX_select)
    begin
        if MUX_select = '0' then 
            transformed <= rotate_left;
        else 
            transformed <= rotate_right;
        end if;
    end process PMUX;
    PMUX: process(rotate_left, rotate_right, MUX_select)
    begin
        if MUX_select = '0' then 
            transformed <= rotate_left;
        else if MUX_select = '1' then
            transformed <= rotate_right;
        end if;
    end process PMUX;

Deze VHDL code probeert een beschrijving te geven van een multiplexer.

De sensitivy list is correct, maar niet alle keuze opties zijn beschreven.

Wat ontbreekt?

In dit voorbeeld is de sensitivy list volledig en zijn alle opties van result(0) gecovered.

Wat is de waarde van even in het geval dat result(0) 1 is?

    PEVENODD: process(result)
    begin
        if result(0) = '0' then 
            even <= '1';
        else 
            odd <= '1'
        end if;
    end process PEVENODD;

Even voor de zekerheid … latches moeten vermeden worden bij FPGA design