SimpleProcessorCore/src/CPU.vhd

222 lines
5.2 KiB
VHDL
Raw Normal View History

----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 10:51:48 05/11/2011
-- Design Name:
-- Module Name: CPU - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
library work;
use work.cpupkg.all;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;
-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity CPU is
Port(
iClk : in std_logic;
iReset : in std_logic;
bdData : inout DATA; --! connection to databus
odAddress : out ADDRESS; --! connection to addressbus
ocEnable : out std_logic; --! enable or disable RAM
ocRnotW : out std_logic --! read/write control
);
end CPU;
architecture Behavioral of CPU is
component Steuerwerk is
port (
iClk : in std_logic; --! iClk signal
iReset : in std_logic; --! iReset signal
icOpCode : in optype; --! icOpCode bus
idCarry : in std_logic; --! carry from register file
idZero : in std_logic; --! zero flag from register file
ocRnotWRam : out std_logic; --! r_notw to RAM
ocLoadEn : out std_logic; --! safe result of alu
ocEnableRAM : out std_logic; --! put akku on databus
ocLoadInstr : out std_logic; --! load instruction control signal
ocNextPC : out std_logic; --! increment pc
ocAddrSel : out std_logic; --! pc on addressbus
ocJump : out std_logic --! do a ocJump
);
end component;
component RegFile is
Port(
iClk : in std_logic;
iReset : in std_logic;
idDataIn : in DATA;
idCarryIn : in std_logic;
idZeroIn : in std_logic;
icLoadEn : in std_logic;
odDataOut : out DATA;
odCarryOut : out std_logic;
odZeroOut : out std_logic
);
end component;
component ALU is
Port(
idOperand1 : in DATA;
idOperand2 : in DATA;
idImmidiate : in DATA;
idCarryIn : in std_logic;
odResult : out DATA;
odCarryOut : out std_logic;
odZeroOut : out std_logic;
icOperation : in OPTYPE
);
end component;
component FetchDecode is
Port(
iClk : in std_logic;
iReset : in std_logic;
idData : in DATA;
icAddrSel : in std_logic;
icLoadInstr : in std_logic;
icJump : in std_logic;
icNextPC : in std_logic;
odAddress : out ADDRESS;
odImmidiate : out DATA;
ocOperation : out OPTYPE
);
end component;
component MemInterface is
Port(
bdDataBus : inout DATA;
odAddress : out ADDRESS;
ocRnotW : out std_logic;
ocEnable : out std_logic;
icBusCtrlCPU : in std_logic;
icRAMEnable : in std_logic;
odDataOutCPU : out DATA;
idDataInCPU : in DATA;
idAddressCPU : in ADDRESS
);
end component;
signal scOpCode : optype;
signal sdCarryRF : std_logic;
signal sdZeroRF : std_logic;
signal scRnotWRam : std_logic;
signal scLoadEn : std_logic;
signal scEnableRAM : std_logic;
signal scLoadInstr : std_logic;
signal scNextPC : std_logic;
signal scAddrSel : std_logic;
signal scJump : std_logic;
signal sdAkkuRes : DATA;
signal sdCarryAkku : std_logic;
signal sdZeroAkku : std_logic;
signal sdDataOut : DATA;
signal sdDataIn : DATA;
signal sdAddress : ADDRESS;
signal sdImmidiate : DATA;
begin
SW : Steuerwerk PORT MAP (
iClk => iClk,
iReset => iReset,
icOpCode => scOpCode,
idCarry => sdCarryRF,
idZero => sdZeroRF,
ocRnotWRam => scRnotWRam,
ocLoadEn => scLoadEn,
ocEnableRAM => scEnableRAM,
ocLoadInstr => scLoadInstr,
ocNextPC => scNextPC,
ocAddrSel => scAddrSel,
ocJump => scJump
);
RF: RegFile PORT MAP(
iClk => iClk,
iReset => iReset,
idDataIn => sdAkkuRes,
idCarryIn => sdCarryAkku,
idZeroIn => sdZeroAkku,
icLoadEn => scLoadEn,
odDataOut => sdDataOut,
odCarryOut => sdCarryRF,
odZeroOut => sdZeroRF
);
Calc : ALU Port MAP(
idOperand1 => sdDataOut,
idOperand2 => sdDataIn,
idImmidiate => sdImmidiate,
idCarryIn => sdCarryRF,
odResult => sdAkkuRes,
odCarryOut => sdCarryAkku,
odZeroOut => sdZeroAkku,
icOperation => scOpCode
);
FaD : FetchDecode PORT MAP(
iClk => iClk,
iReset => iReset,
idData => sdDataIn,
icAddrSel => scAddrSel,
icLoadInstr => scLoadInstr,
icJump => scJump,
icNextPC => scNextPC,
odAddress => sdAddress,
odImmidiate => sdImmidiate,
ocOperation => scOpCode
);
MemIF : MemInterface PORT MAP(
bdDataBus => bdData,
odAddress => odAddress,
ocRnotW => ocRnotW,
ocEnable => ocEnable,
icBusCtrlCPU => scRnotWRam,
icRAMEnable => scEnableRAM,
odDataOutCPU => sdDataIn,
idDataInCPU => sdDataOut,
idAddressCPU => sdAddress
);
end Behavioral;