--************************************************--
--**      Dekoder instrukci pro MC Mazard       **--
--**   Autor: Leos Marsalek    (c) 2002-2003    **--
--**     E-mail: Leos.Marsalek@tiscali.cz       **--
--**      Spolupracovali : Lukas Vaculík,       **--
--**              Miroslav Copian               **--
--************************************************--

library IEEE;           -- Zpøistupnìni knihovny
use IEEE.std_logic_1164.all;    -- Vyuziti knihovny

entity dekoder_instr is           -- entita
    
port (A:in STD_LOGIC_vector(15 downto 0);C_bit:in STD_logic;
  B:out STD_logic_vector(downto 0);C_out:out Std_logic);
end;           


Architecture DEKFORALU of dekoder_instr is    -- architektura entity
alias Instr:STD_logic_vector(downto 0is A(15 downto 12);

-- dvojoperandova instrukce 15-12 operacni kod
-- 11 adresace neprima prima
-- 10-6 adresa registru SRC
-- 5 adresace prima neprima
-- 4-0 adresa registru DST

alias Subinstr:STD_logic_vector (downto 0is A(11 downto 6);
begin
    
dek
:Process(A)
        
begin
            
case instr is
            
when "1111" => 
B<=instr;   --instrukce Mov
c_out<='0';
            
when "1110" => 
B<=instr;   -- Add Pro alu A + B +Cin
C_out<='0';
            
When "1101" =>
B<="1110"-- AddC Pro alu A + B + cin
C_out<=c_bit;
            
When "1100" => 
B<=instr;   -- Subb Pro alu A + not B + cin
c_out<='1';
            
when "1010" => 
B<="1100";    -- SubbC Pro Alu A + Not B + cin
c_out<=not C_bit;
            
when "1011" =>
 B<="1100";    -- Compare Pro Alu A + Not B + Cin Bez zapisu do registru D
c_out<='1';
            
When "0000" =>  
                    
Case subinstr is
                    
when "111111" =>
 B<="1110";  -- inc Pro alu A + B + Cin kde B nebo Cin=1
 C_out<='1';
                    
when "111100" =>
 B<="1100";  -- dec Pro Alu A + Not B + Cin
c_out<='1';
                    
When "111000" =>
 B<="0000";  -- clr pro Alu A = 0
c_out<='0';
                    
When "110000" =>
 B<="0111";  -- jmp instrukce
c_out<='0';
                    
when others => null;
                    
end case
           
when others => null;
           
end case;          
                   
        
end process dek;
 
end  dekforalu;