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

--******************************************************************************
--** ENTITY BranchForw
--**
--** Deskripsi: Struktur ini emnggambarkan branch forwarding unit.
--** Branch Forwarding Unit dibangun dari beberapa 16-bit multiplexers dan
--** branch forwarder sama seperti sebuah zero detector.
--******************************************************************************
ENTITY branchforw IS
    PORT(readOne, readTwo, EX_result       : IN STD_LOGIC_VECTOR(15 DOWNTO 0); 
         MEM_result                        : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
         exmemcrw, memwbc                  : IN STD_LOGIC;
         exmemwb, wbWReg, regin,INSTRUCTION: IN STD_LOGIC_VECTOR(2 DOWNTO 0);
         zero                              : OUT STD_LOGIC;
         intoBU                            : OUT STD_LOGIC_VECTOR(15 DOWNTO 0));
END ENTITY branchforw;

ARCHITECTURE structural_branchforw OF branchforw IS
    --Menentukan isyarat yang dibutuhkan
    
    SIGNAL buSelA, buSelB                   : STD_LOGIC_VECTOR(1 DOWNTO 0);
    SIGNAL zero_temp                        : STD_LOGIC_VECTOR(15 DOWNTO 0);

    --**************************************************************************
    --**** Hal ini menunjukkan dimana structural description dari Branch Forwarding
    --**** unit dimulai. Branch forwarding unit terdiri atas
    --**** entity berikut.
    --**** ENTITIES:
    --****          Bforward, dua multiplexers dan a zero detector.
    --**************************************************************************
    BEGIN
     
     --*************************************************************************
     --**** Branch Forward
     --**** PORT MAP ini menunjukkan bagaimana komponen memutuskan untuk diteruskan atau tidak
     --**** menghubungkan ke Branch Forwarding Unit.
     --*************************************************************************
     forward : work.bforward
        PORT MAP(exmemcrw, memwbc, exmemwb, wbWReg, regin, INSTRUCTION, buSelA, 
                 buSelB);
                 
    --**************************************************************************
    --**** Selector
    --**** PORT MAP ini menunjukkan bagaimana multiplexer yang meneruskan register
    --**** dicek bernilai nol dihubungkan ke Branch Forwarding Unit.
    --**************************************************************************
    mux1 : work.rselector
        PORT MAP(readTwo, EX_result, MEM_result, buSelA, zero_temp);
    
    --**************************************************************************
    --**** Selector
    --**** PORT MAP ini menunjukkan bagaimana multiplexer yang meneruskan register
    --**** diberikan ke Branch Unit dihubungkan ke Branch Forwarding 
    --**** Unit.
    --**************************************************************************
    mux2 : work.rselector
        PORT MAP(readOne, EX_result, MEM_result, buSelB, intoBu);

    --**************************************************************************
    --**** Zero Detector
    --**** PORT MAP ini menunjukkan bagaimana zero detector dihubungkan ke the rest of
    --**** the branch forwarding unit.
    --**************************************************************************
    select2 : work.zdetect
        PORT MAP(zero_temp, zero);

    
END ARCHITECTURE structural_branchforw;
