WebElektronika

RAM megvalósítása VHDL nyelven

person access_time 2015.05.15.
Folytatjuk most a VHDL nyelvben használt konverziók áttekintését. Elkészítünk egy RAM-ot VHDL nyelven úgy, hogy olyan függvényt használunk fel, amely konverziót valósít meg. A RAM megoldásunk paraméterezhető.


Most az std.logic_arith csomagban található függvényeket használjuk fel. Az architektúrális leírásban definiálunk egy típust, amelynek a neve memtomb. Ennek a szélessége és a mélysége a generic-ben megadott paraméterek értékétől függ. Alapesetben a memória szélessége 8 bit és a mélysége 25. A memóriának külön bemeneti és kimeneti busza van, illetve rendelkezik egy CLK bemenettel is.

 

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

entity ram is
    generic(m: integer := 8;
            w : integer := 5);
    port(CLK, WR : in std_logic;
        DBE : in std_logic_vector(m-1 downto 0);
        CIM : in std_logic_vector(w-1 downto 0);
        DKI : out std_logic_vector(m-1 downto 0));
end ram;

architecture pelda of ram is
type memtomb is array(2**w-1 downto 0) of std_logic_vector(m-1 downto 0);
signal    memoria : memtomb;
begin

    process(CLK, WR, DBE, CIM)
    begin
        if CLK'event and CLK = '1' then
            if WR = '1' then
                memoria(conv_integer(CIM)) <= DBE;
            else
                DKI <= memoria(conv_integer(CIM));
                    end if;
        else
            null;
        end if;                
    end process;

end pelda;

Ha a WR jel logikai 0-ban van, és a CLK jel 0-ból 1-be megy, akkor a DBE adatbuszról beolvassuk az eltárolni kívánt adatot. De hova kerül a beolvasott adat? Ezt a CIM vektorral állítjuk be. Csinálhatjuk azt is, hogy egészként (integer) ábrázoljuk a CIM-et, de akkor nem tudnánk implementálni például egy FPGA-ba a RAM-ot. Ezért egy konverziót alkalmazunk, amelynek segítségével az std_logic_vector-ból integer-t állítunk elő. Ez a szám a memoria nevű memtomb típusú tömbnek az indexe.

A következő VHDL kód a tesztkörnyezet, amelybe behelyeztük a szimulálandó RAM megoldásunkat. Az órajel periódikus változásáról egy külön process gondoskodik. A tesztkörnyezetben a for ciklus ciklusváltozója integer típus, amelyből std_logic_vector-t állítunk elő.

 

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

entity ramsim is
    generic(m: integer := 8;
            w : integer := 5);
    port(DKI : out std_logic_vector(m-1 downto 0));
end ramsim;

architecture sim of ramsim is
signal    SCLK, SWR : std_logic;
signal    SDBE : std_logic_vector(m-1 downto 0);
signal    SCIM : std_logic_vector(w-1 downto 0);
begin

    nev : entity konverzio1.ram port map(SCLK, SWR, SDBE, SCIM, DKI);
    
    process
    begin
        SCLK <= '0';
        wait for 10 ns;
        SCLK <= '1';
        wait for 10 ns;
    end process;
    
    process
    begin
        SWR <= '0';
        wait for 10 ns;
        SWR <= '1';
        for i in 0 to 2**w - 1 loop
            SDBE <= std_logic_vector(conv_unsigned(i+5,m));
            SCIM <= std_logic_vector(conv_unsigned(i,w));
            wait for 20 ns;
        end loop;
        SWR <= '0';
        for i in 0 to 2**w - 1 loop
            SCIM <= std_logic_vector(conv_unsigned(i,w));
            wait for 20 ns;
        end loop;
    end process;

end sim;

 

A szimulácis eredmény látható az első ábrán.

kep
1. ábra   Szimulációs eredmény (Kattints a képre)