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;
beginprocess(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);
beginnev : 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.
1. ábra Szimulációs eredmény (Kattints a képre)
Elkészítünk most VHDL nyelven egy PWM modult. Természetesen digitális úton állítunk elő PWM jelet.. . . .
Készítünk VHDL nyelven most egy programozható szélességű multiplexert, amelyet azután elhelyezünk egy Spartan 6-os FPGA-ban. A bemenet (és a kiválasztó jel) szélessége paraméteresen állítható be a fordítás előtt.. . . .
Készítünk VHDL nyelven most egy programozható szélességű multiplexert, amelyet azután elhelyezünk egy Spartan 6-os FPGA-ban. A bemenet (és a kiválasztó jel) szélessége paraméteresen állítható be a fordítás előtt.. . . .