Records

In voorgaande cursustekst is het al meermaals aangehaald dat VHDL “sterk getypeerd” is. Een STD_LOGIC_VECTOR en een STD_LOGIC_UNSIGNED (bijvoorbeeld) kunnen niet zonder meer aan elkaar gekoppeld worden, zonder type-conversie.

Er is al gebruikt gemaakt (in hoofdstuk 4) van het feit dat een type zelf gecreeerd kan worden. Ook samengestelde vormen kunnen soms een meerwaarde bieden, zoals een struct in C. In VHDL kan dit bekomen worden door een record te maken.

    type T_bus_if_o is record
        data : STD_LOGIC_VECTOR(C_DATAWIDTH-1 downto 0);
        address : STD_LOGIC_VECTOR(C_DATAWIDTH-1 downto 0);
        we : STD_LOGIC_VECTOR(C_DATAWIDTH/8-1 downto 0);
    end record;

Door een record aan te maken (zoals in het voorbeeld) kunnen een groep signalen samengenomen worden. Van zo een record wordt vervolgens een type gemaakt zodat dit ook gebruikt worden in VHDL beschrijvingen. Merk op dat er hier geen sprake is van een richting (in en out).

Voorbeeld

library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;

library work;
    use work.PKG_disch.ALL;

entity processor is
    generic(
        G_DATAWIDTH : natural := 32;
        G_REGCOUNT_LOG2 : natural := 5
    );
    port(
        clock : in STD_LOGIC;
        reset : in STD_LOGIC;
        ce : in STD_LOGIC;
        inst : in STD_LOGIC_VECTOR(G_DATAWIDTH-1 downto 0);
        pc : out STD_LOGIC_VECTOR(G_DATAWIDTH-1 downto 0);
        bus_o : out T_bus_if_o;
        bus_i : in T_bus_if_i
    );
end entity processor;

In dit voorbeeld heeft de processor een bus_o en een bus_i port. De bus_o-poort is van het type zoals hierboven gedeclareerd. Deze “ene poort” is eigenlijk 3 bussen: ‘data’, ‘address’ en ‘we’.

Om één bepaalde bus (of veld) te selecteren is de syntax als volgt:

bus_o.data <= (others => '1');

De voordelen van het gebruik van records komen pas wanneer er veel losse signalen “samen horen”. Dit is typisch het geval bij interface zoals AXI4 of wishbone bussen. Wanneer je bovendien een array aan records maakt als type, dan kan er veel type-werk bespaard worden.

Het gebruik van records zal geen impact hebben op het design dat gemaakt wordt, maar is eerder bedoeld om de “arme designer” te helpen met de beschrijving van het design.

Voor de volledigheid dient er vermeld te worden dat records genest kunnen worden. Een record kan dus bestaan uit verschillende types van velden waaronder dus ook een (andere) record.