FPGA ile İşlemci Tasarımı / BT-I / #9 (BT-I)

Önceki yazılarda tasarladığımız modülleri bu yazıda birleştirip, BT-I işlemcisine son halini vereceğiz. Modüllerin birleştirilmesi iç mimari yazısında gösterilen iç mimari şemasına göre yapılacaktır. VHDL kodu:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity BT_I is
    port(Clk : in std_logic;                          --Clk girişi
        Data : inout std_logic_vector(15 downto 0);    --Çift yönlü veri ylu
        Address : out std_logic_vector(15 downto 0);   --Adres yolu
        R_W, Bus_Active : out std_logic;               --Yol kontrol çıkışları
        PC_Test : out std_logic_vector(7 downto 0));   --Debug için eklediğim 8 bitlik progam counter çıkışı
end BT_I;

architecture Behavioral of BT_I is

--Önceden oluşturduğumuz komponentlerin çağrılması
component Program_Counter
    port(Clk : in std_logic;
        Rl_Address : in std_logic_vector(7 downto 0);
        Im_Address : in std_logic_vector(15 downto 0);
        Branch_Sel : in std_logic_vector(1 downto 0);
        PC : out std_logic_vector(15 downto 0));
end component;

component Registers
    port(Clk : in std_logic;
        Enable : in std_logic;
        Rn, Rm : in std_logic_vector(2 downto 0);
        Rd : in std_logic_vector(2 downto 0);
        Dn, Dm : out std_logic_vector(15 downto 0);
        Dd : in std_logic_vector(15 downto 0));
end component;

component ALU
    port(A, B: in std_logic_vector(15 downto 0);
        Arithmetical_Operations : in std_logic_vector(1 downto 0);
        Logic_Operations : in std_logic_vector(1 downto 0);
        ALU_Operations : in std_logic;
        Flags_Update : in std_logic;
        Flags_In : in std_logic_vector(1 downto 0); 
        Flags_Out : out std_logic_vector(1 downto 0);
        O : out std_logic_vector(15 downto 0));
end component;

component Instruction_Decoder
    port(Instruction_In : in std_logic_vector(15 downto 0);
        Flags_In : in std_logic_vector(1 downto 0);
        
        Enable : out std_logic;
        Rn, Rm : out std_logic_vector(2 downto 0);
        Rd : out std_logic_vector(2 downto 0);
        
        ALU_Operations : out std_logic;
        Arithmetical_Operations : out std_logic_vector(1 downto 0);
        Logic_Operations : out std_logic_vector(1 downto 0);
        Flags_Update : out std_logic;
        
        Branch : out std_logic_vector(1 downto 0);
        
        ALU_Mux : out std_logic;
        ALU_Zero_Mux : out std_logic;
        Return_Mux : out std_logic;
        
        R_W : out std_logic;
        Bus_Active : out std_logic;
        Im_Data_Out : out std_logic_vector(7 downto 0));
end component;

component Register_16
    port(Clk : in std_logic;
        Enable : in std_logic;
        Data_In : in std_logic_vector(15 downto 0);
        Data_Out : out std_logic_vector(15 downto 0));
end component;

--1 bitlik D tipi flip-flop
component Register_Bit
    port(Clk : in std_logic;
        Enable : in std_logic;
        Data_In : in std_logic;
        Data_Out : out std_logic);
end component;

--Komut hafızası
component ROM
    port(Address : in std_logic_vector(15 downto 0);
        Data_Out : out std_logic_vector(15 downto 0));
end component;

    signal Im_Data : std_logic_vector(7 downto 0);
    signal Branch : std_logic_vector(1 downto 0);
    signal PC_Out : std_logic_vector(15 downto 0);
    signal IR_Out : std_logic_vector(15 downto 0);
    signal ROM_Out : std_logic_vector(15 downto 0);
    signal Flags_In, Flags_Out : std_logic_vector(1 downto 0);
    signal Rn, Rm, Rd : std_logic_vector(2 downto 0);
    signal Dn, Dm, Dd : std_logic_vector(15 downto 0);
    signal Registers_Enable : std_logic;
    signal ALU_Operations : std_logic;
    signal Arithmetical_Operations, Logic_Operations : std_logic_vector(1 downto 0);
    signal Flags_Update : std_logic;
    signal ALU_Mux, ALU_Zero_Mux, Return_Mux : std_logic;
    signal R_WSignal : std_logic;
    signal A, B, O : std_logic_vector(15 downto 0);
    signal Bus_ActiveS : std_logic;
    
begin
    
    --Program counterin yerleştirilmesi
    PC : Program_Counter
        port map(Clk, Im_Data, X"0000", Branch, PC_Out);
    
    --Program hafızasının yerleştirilmesi
    Code : ROM
        port map(PC_Out, ROM_Out);
    
    --Komut registeri(IR)
    IR : Register_16
        port map(not Clk, '1', ROM_Out, IR_Out);
    
    --Komut çözücünün yerleştirilmesi
    ID : Instruction_Decoder
        port map(IR_Out, Flags_In, 
            Registers_Enable, Rn, Rm, Rd,
            ALU_Operations, Arithmetical_Operations, Logic_Operations, Flags_Update,
            Branch, 
            ALU_Mux, ALU_Zero_Mux, Return_Mux,
            R_WSignal, Bus_ActiveS, Im_Data);
    
   --Bayraklar    
    Carry : Register_Bit
        port map(Clk, '1', Flags_Out(0), Flags_In(0));
        
    Zero : Register_Bit
        port map(Clk, '1', Flags_Out(1), Flags_In(1));
    
   --Genel kullanım registerlerinin yerleştirilmesi    
    Regs : Registers
        port map(Clk, Registers_Enable, Rn, Rm, Rd, Dn, Dm, Dd);
    
    --İşlemci içi veri kontrol multiplexerları
    with ALU_Mux select
        B <= Dm when '0',
              (X"00" & Im_Data) when others;
              
    with ALU_Zero_Mux select
        A <= Dn when '0',
              X"0000" when others;
              
    with Return_Mux select
        Dd <= O when '0',
                Data when others;
    
   --ALU'nun yerleştirilmesi     
    ALUM : ALU
        port map(A, B,
            Arithmetical_Operations, Logic_Operations, ALU_Operations,
            Flags_Update, Flags_In, Flags_Out, O);
            
    Address <= O;
    
    --Veri hattına R/W sinyali ile kontrol edilebilen tri-state buffer yerleştirilmesi
    with R_WSignal select
        Data <= Dm when '0',
                  "ZZZZZZZZZZZZZZZZ" when others;
                  
    R_W <= R_WSignal;
    Bus_Active <= Bus_ActiveS;
    
    
    --Program sayacının ilk 8 bitini debug için dışarıya aktardım
    PC_Test <= PC_Out(7 downto 0);
    
end Behavioral;

Tasarımın Quartus II programı tarafından oluşturulan RTL şeması:

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.