--************************************************--
--**     Registry pro mikroprocesou Hazard      **--
--**   Autor: Leos Marsalek    (c) 2002-2003    **--
--**     E-mail: Leos.Marsalek@tiscali.cz       **--
--**      Spolupracovali : Lukas Vaculík,       **--
--**              Miroslav Copian               **--
--************************************************--

library IEEE; -- Zviditelneni knihovny
use IEEE.std_logic_1164.all;

entity banka_registru is 
    
port (A:in STD_LOGIC_vector(15 downto 0);
          
Src_out,dst_out:out STD_logic_vector(15 downto 0); 
          
Adr_src,Adr_dst:in std_logic_vector(downto 0);
          
clk,enable,rw_dst,rw_srcSTD_logic);
end;  

Architecture Reg_src_dst of banka_registru is

type memory_type is array 
(39 downto 0of STD_LOGIC_vector (15 downto 0);    -- deklarace pomocného typu pro pamì omezení na 40 16-bitových reg.

signal src,dst:memory_type;                                                         

function To_int(a:STD_Logic_vector(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 5 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
     
Akce
:process (clk,enable)
          
Begin
          if 
TO_int
(adr_src)<40 or TO_int(adr_dst)<40 then
               if 
(clk'eventand (clk='1'and (enable='1'and rw_src='1' then    -- zápis do src
                         
src(To_int(adr_src))<=A;
               
end if;
               
if (clk'eventand (clk='1'and (enable='1'and rw_dst='1' then    -- zápis do dst
                         
dst(To_int(adr_dst))<=A;
               
End if;
               
if (clk'eventand (clk='0'and (enable='1'and rw_src='0' then    -- ètení z src
                         
src_out<=src(To_int(adr_src));
               
End if;
               
if (clk'eventand (clk='0'and (enable='1'and rw_dst='0' then    -- ètení z dst
                         
dst_out<=dst(To_int(adr_dst));
               
End if;          
          
else
              
src_out
<="0000000000000000";
              
dst_out<="0000000000000000";
          
end if;
          
end process Akce;
end Reg_src_dst;