WebElektronika

ROM megvalósítása VHDL nyelven (csomag nélkül)

person access_time 2015.08.24.
Folytatjuk most a VHDL nyelv gyakorlati szintű megismerését. Elkészítünk egy ROM-ot VHDL nyelven úgy, hogy nem használunk fel sajátkészítésű csomagot.


Készítünk most egy ROM-ot VHDL nyelven. Célszerűbb lenne a típust, altípust egy sajátkészítésű csomagban megadni, de most azt a megoldást nézzük meg, amikor ezek (és a ROM adatokkal való feltöltése) egy VHDL file-ban szerepelnek.

A ROM 8 bites szélességű és 4 rekeszből áll. Az entitás neve (és a VHDL file neve is) : rom3.

library IEEE;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity rom3 is
    generic(romW : integer := 8;
                    romL : integer := 4);
    port(CIM : in std_logic_vector(1 downto 0);
               KI : out std_logic_vector(romW-1 downto 0));
end rom3;

architecture BEH of rom3 is
subtype    romWord is std_logic_vector(romW-1 downto 0);
type    romTabla is array (romL-1 downto 0) of romWord;

constant ROM : romTabla := romTabla'("00000001","10101010","01010101","11111111");
begin

    KI <= ROM(conv_integer(CIM));

end BEH;

A "constant ROM"-nál töltjük fel konkrét értékekkel a ROM-nak a belsejét. A ROM-nak négy rekesze lehet, ezt a romL változónál álítottuk be. A 0. rekeszben a beírt érték 0xFF (11111111), a 3. rekeszben pedig 0x01.

Az elkészült ROM-nak (rom3.vhd) a működését szimuláljuk le, írjunk ehhez egy szimulációs környezetet.

library IEEE;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity rom3sim is
    generic(romW : integer := 8);
    port(KI : out std_logic_vector(romW-1 downto 0));
end rom3sim;

architecture sim of rom3sim is
signal    SCIM    : std_logic_vector(1 downto 0);
begin
    nev : entity memoria.rom3 port map(SCIM, KI);
    process
    begin
        SCIM <= "00";
        wait for 10 ns;
        SCIM <= "01";
        wait for 10 ns;
        SCIM <= "10";
        wait for 10 ns;
        SCIM <= "11";
        wait for 40 ns;
    end process;
end sim;

Az első ábrán látjuk a szimulációs eredményt, a kimenetet (KI), illetve az SCIM-et is, amellyel a memóriánk adott rekeszét címezhetjük meg.

kep
1. ábra   Szimulációs eredmény
 

Írhatunk egyszerűbb szimulációs környezetet is, ahol egy for ciklusban adunk értéket az SCIM jelnek. Ehhez használnuk kell integer -> std_logic_vector konverziót is (a változás sötétítve van).

library IEEE;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;

entity rom3sim2 is
    generic(romW : integer := 8);
    port(KI : out std_logic_vector(romW-1 downto 0));
end rom3sim2;

architecture sim of rom3sim2 is
signal    SCIM    : std_logic_vector(1 downto 0);
begin
    nev : entity memoria.rom3 port map(SCIM, KI);
    process
    begin
        for i in 0 to 3 loop
            SCIM <= std_logic_vector(to_unsigned(i,2));
            wait for 10 ns;
        end loop;

    end process;
end sim;

A szimulációs eredményt láthatjuk a második ábrán, ahol az SCIM változását szintén feltüntettük. Az SCIM-mel azt a címet adhatjuk meg, ahonnan szeretnénk kiolvasni a ROM-unkból a rekeszben tárolt értéket.

kep
2. ábra   Szimulációs eredmény konverzióval