WebElektronika

ROM megvalósítása VHDL nyelven csomag használatával

person access_time 2015.08.31.
Megnézzük most, hogyan tudunk készíteni egy egyszerű csomagot VHDL nyelven. A korábban bemutatott ROM megvalósítást fogjuk elővenni, és amit lehet, "kiszervezzük" egy csomagba.


Korábbi cikkünkben megnéztük a ROM-nak a megvalósítását, amikor nem használtunk csomagot.

Most azt a lehetőséget nézzük meg, amikor a ROM-ot nem egy "sima" VHDL file-ban valósítjuk meg, hanem egy sajátkészítésű csomagban, és ezt a csomagot (memoria.vhd) fogjuk felhasználni a későbbi ROM megvalósításoknál.

Ebben a csomagban adjuk meg a különböző konstansokat (a ROM szélessége és mélysége), az altípust, típust, majd végezetül a ROM-unkat feltöltjük különböző értékekkel. Láthatjuk, hogy két "romTabla" típusunk van, a RMHex és a ROMBin. Az elsőnél hex formátumban töltöttük fel értékekkel, a másodiknál pedig binárisan.

library IEEE;
use ieee.std_logic_1164.all;

package memoria is

constant romW : integer := 8;
constant romL : integer := 4;
subtype     romWord is std_logic_vector(romW-1 downto 0);
type     romTabla is array (romL-1 downto 0) of romWord;

constant ROMBin : romTabla := romTabla'("00000001","00000010","00000011","00000100");
constant ROMHex : romTabla := romTabla'(X"13",X"25",X"37",X"49");

end;

package body memoria is
end memoria;

Láthatjuk a csomagunk (memoria.vhd) kódjában, hogy a body rész üres, de nem is szükséges most kitöltenünk ezt a részt.

Készítsünk most el egy VHDL file-t, amelyben a csomagunkat meghivatkozzuk, azaz, a korábbi file-ban megadott konstansokat itt felhasználjuk.
A sötéttel jelölt résszel mutatjuk meg, hogy a sajátkészítésű csomag hogyan hivatkoztatható meg.

library IEEE;
use ieee.std_logic_1164.all;

use work.memoria.all;

entity rom5 is
    port(KIBin, KIHex : out romWord);
end rom5;

architecture BEH of rom5 is
begin

    process
    begin
        for i in 0 to 3 loop
            KIBin <= ROMBin(i);
            KIHex <= ROMHex(i);
            wait for 10 ns;
        end loop;
    end process;    

end BEH;

A for ciklusban 0-tól 3-ig adjuk meg a ROM-unknak azt a címét, ahonnan szeretnénk kiolvasni a rekeszben lévő értéket. Vegyük észre, hogy ebben a file-ban két ROM is van. Az egyik ROM-nak a kimenete a KIBin, a másiké a KIHex.

A szimulációs eredményt (a két ROM-nak a kimenete) látjuk az első ábrán.

kep
1. ábra   A két ROM kimenetének a szimulációs eredménye
 

A következő VHDL kód (rom6.vhd) egy olyan ROM-ot valósít meg, amelynek van címbemenete, tehát a cím "kívülről" adható meg.

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

use work.memoria.all;

entity rom6 is
    port(CIM : in std_logic_vector(1 downto 0);
        KI : out romWord);
end rom6;

architecture BEH of rom6 is
begin

    KI <= ROMHex(conv_integer(CIM));

end BEH;

A ROMHex egy romTabla típus, amelyet a memoria.vhd file-ban adtunk meg.