diff --git a/Hardware/processor.vhd b/Hardware/processor.vhd new file mode 100644 index 0000000000000000000000000000000000000000..87e1203e2b04bc002c5d7a0108e66e0c1560cb25 --- /dev/null +++ b/Hardware/processor.vhd @@ -0,0 +1,168 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +use work.pkgProcessor.all; + +entity processor is + port ( + -------------------------------------------------- + -- external processor signals -------------------- + -------------------------------------------------- + + clock : in std_logic; + nR : in std_logic; + + -- IO signals to / from the uROM + uAddr : out std_logic_vector(7 downto 0); + uData : in std_logic_vector(35 downto 0); + + -- IO signals to / from RAM and ROM + nCSROM : out std_logic; + nCSRAM : out std_logic; + outRegNOE : out std_logic; + outRegNWE : out std_logic; + addrBus : inout std_logic_vector(15 downto 0); + dataBus : inout std_logic_vector(15 downto 0) + ); +end processor; + +architecture arcProcessor of processor is + signal omnibus : std_logic_vector(15 downto 0); + + -- signal that are required by the control unit + signal carry : std_logic; + + -- signals that are required for memory addressing + signal DY : std_logic_vector(15 downto 0); + signal offset4 : std_logic_vector(3 downto 0); + signal outAdd : std_logic_vector(15 downto 0); + signal eBuffAdd : std_logic; + + -- signals that are required to increase the program + -- counter + signal imm12 : std_logic_vector(11 downto 0); + signal DX : std_logic_vector(15 downto 0); + signal muxPC : std_logic_vector(1 downto 0); + signal ePC : std_logic; + signal eBuffPC : std_logic; + + -- signals that are required to control the external + -- bus interface + signal nWE : std_logic; + signal nOE : std_logic; + signal eMAR : std_logic; + signal eMDR : std_logic; + signal eMRR : std_logic; + signal eBuffMDR : std_logic; + signal eBuffMRR : std_logic; + + -- signals that are required by the datapath (ALU, + -- register file and C register) + signal opCoAlU : std_logic_vector(4 downto 0); + signal imm4 : std_logic_vector(3 downto 0); + signal AX : std_logic_vector(3 downto 0); + signal AY : std_logic_vector(3 downto 0); + signal eC : std_logic; + signal eAX15 : std_logic; + signal regNWE : std_logic; + signal eBuffDX : std_logic; + signal eBuffALU : std_logic; +begin + instCU : CU + port map ( + clock => clock, + nR => nR, + uData => uData, + uAddr => uAddr, + omnibus => omnibus, + carry => carry, + offset4 => offset4, + eBuffAdd => eBuffAdd, + imm12 => imm12, + muxPC => muxPC, + ePC => ePC, + eBuffPC => eBuffPC, + nWE => nWE, + nOE => nOE, + eMAR => eMAR, + eMDR => eMDR, + eMRR => eMRR, + eBuffMDR => eBuffMDR, + eBuffMRR => eBuffMRR, + opCoALU => opCoALU, + imm4 => imm4, + AX => AX, + AY => AY, + eC => eC, + eAX15 => eAX15, + regNWE => regNWE, + eBuffDX => eBuffDX, + eBuffALU => eBuffALU + ); + + instEBI : EBI + port map ( + clock => clock, + nR => nR, + nCSROM => nCSROM, + nCSRAM => nCSRAM, + outRegNOE => outRegNOE, + outRegNWE => outRegNWE, + addrBus => addrBus, + dataBus => dataBus, + omnibus => omnibus, + nOE => nOE, + nWE => nWE, + eMAR => eMAR, + eMDR => eMDR, + eMRR => eMRR, + eBuffMDR => eBuffMDR, + eBuffMRR => eBuffMRR + ); + + instPC : PC + port map ( + clock => clock, + nR => nR, + omnibus => omnibus, + imm12 => imm12, + muxPC => muxPC, + DX => DX, + ePC => ePC, + eBuffPC => eBuffPC + ); + + instDatapath : datapath + port map ( + clock => clock, + nR => nR, + omnibus => omnibus, + AX => AX, + AY => AY, + eAX15 => eAX15, + regNWE => regNWE, + opCoALU => opCoALU, + carry => carry, + imm4 => imm4, + DX => DX, + DY => DY, + eC => eC, + eBuffDX => eBuffDX, + eBuffALU => eBuffALU + ); + + adder : process (offset4, DY) is + begin + outAdd <= std_logic_vector(unsigned(DY) + + resize(shift_left(unsigned(offset4), 1), outAdd'length)); + end process adder; + + buffAdd : process (outAdd, eBuffAdd) is + begin + if eBuffAdd = '1' then + omnibus <= outAdd; + else + omniBus <= (others => 'Z'); + end if; + end process buffAdd; +end arcProcessor;