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 PBUFFER_16
--**
--** Deskripsi: Struktur entity ini menguraiakan Prefetch Buffer. 
--******************************************************************************
ENTITY pbuffer_16 IS
    PORT(ReadAddress, Data                  : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
         clk, mem_taken                     : IN STD_LOGIC;
         instruction, fetch                 : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
         pbpcenable, sysclock               : OUT STD_LOGIC);
END ENTITY pbuffer_16;

ARCHITECTURE structural_pbuffer_16 OF pbuffer_16 IS
    --Declare Signals Needed
    signal fetchingAddress, fetchedAddress  : STD_LOGIC_VECTOR(15 DOWNTO 0);
    signal pbenable_bit                     : STD_LOGIC;
    signal miss_bit                         : STD_LOGIC;

    --**************************************************************************
    --**** Ini dimana strukstur entity dari prefetch buffer 
    --**** dimulai. Prefetch buffer terdiri atas buffer dimana data
    --**** akan dituliskan dan juga sebuah prefetching controller, yang mengontrol
    --**** atau tidak ke fetch sebuah instruksi dari memori.
    --**************************************************************************
    BEGIN
    --**************************************************************************
    --**** Prefetch Buffer
    --**** PORT MAP ini menunjukkan bagaimana buffer  dihubungkan ke the rest of the
    --**** prefetch circuit.
    --**************************************************************************
    pbuffer : work.pbuffer
        PORT MAP(ReadAddress, fetchedAddress, Data, pbenable_bit, clk, 
                 fetchingAddress, instruction, miss_bit);
    
    --**************************************************************************
    --**** Prefetching Control Unit
    --**** PORT MAP ini menunjukkan bagaimana prefetching control unit dihubungkan ke
    --**** the rest of the prefetching unit.
    --**************************************************************************
    precontrol : work.prefcon
        PORT MAP(ReadAddress, fetchingAddress, miss_bit, mem_taken,
                 pbenable_bit, pbpcenable, fetchedAddress);
    
    --**************************************************************************
    --**** CPUCLOCK
    --**** PORT MAP ini digunakan untuk mengubah  seluruh kecepatan clock kedalam
    --**** kecepatan clock untuk the rest of the processor. ie dibagi oleh 2.
    --**************************************************************************
    cpuclock : work.cpuclock
        PORT MAP(clk, sysclock);

    --**************************************************************************
    --**** Outputs
    --**** PORT MAP ini digunakan untuk mengubah suatu isyarat ke output.
    --**************************************************************************
    select4 : work.through
        PORT MAP(fetchedAddress, fetch);
        
END ARCHITECTURE structural_pbuffer_16;
