--************************************************--
--**      Pamt pro mikroprocesou Hazard        **--
--**   Autor: Leos Marsalek    (c) 2002-2003    **--
--**     E-mail: Leos.Marsalek@tiscali.cz       **--
--**      Spolupracovali : Lukas Vaculík,       **--
--**              Miroslav Copian               **--
--************************************************--
 
 -- 16 bitová pamì pro Hazard
 
library IEEE;
use IEEE.std_logic_1164.all;

entity memory is                                                                --pamìt pro CPU Hazard
Port(datainin STD_LOGIC_vector (15 downto 0);                               -- Vstupní 16 bitové slovo
     dataoutout STD_LOGIC_vector (15 downto 0);                             -- Výstupní 16 bitové slovo pamìti
     adrin STD_LOGIC_vector (15 downto 0);                                  -- adresa pamìti
rw,Enable,clk:in STD_LOGIC);                                                -- øídící signály pamìti

end  memory;   

architecture me of memory is                                                    -- Architektura popisující pamì
type memory_type is array (1023 downto 0of STD_LOGIC_vector (15 downto 0);    -- deklarace pomocného typu pro pamì
signal mem:memory_type;                                                         -- velikost je omezena na 2048 Byte

function To_int(a:STD_Logic_vector(15 downto 0))return Integer is               -- funkce která pøevádí STD logiku na Integer
variable vysledek:integer:=0;
begin
    
vysledek
:=0;                                                                -- Algoritmus vycházáí z tvz. Váh dvojkového èísla
    
for i in 15 downto 0 loop                                                   -- 2^i kde i pøedstavuje umístìní bitu napø 64 32 16 8 4 2 1
     
if a(i)='1' then                                                           -- napø 64 32 16 8 4 2 1 Váhy dvojkové soustavy
          
vysledek:=vysledek+2**i;                                              -- 1 1 0 0 0 1 0 Pøevádìné èíslo
     
end if;                                                                    -- 64+32+ +2 =98
    
end loop;
    
return vysledek;
end;

begin                                                                           -- zaèátek architektury
pametprocess (clk,enable,rw)                                                -- Proces který kontroluje zmìnu jednotlivých signálù
     
begin
          if 
To_int
(adr)<1023 then   
               if 
(clk'eventand (clk='1'and (enable='1'and rw='1' then    -- zápis do pamìti
                    
mem(To_int(adr))<=datain
               
end if;        
               
if (clk'eventand (clk='1'and (enable='1'and rw='0' then    -- Ètení z pamìti
                    
dataout<=mem(To_int(adr)); 
               
end if;
          
else
               
dataout
<="1111111111111111";                                     -- pøi vyí ne dovoleé adresaci pamì vrací FFFF
          
end if;     
     
end process pamet;
end;