Files
lt16lab/soc/core/processor.vhd
Thomas Fehmel 657a54ba18 Initial Commit
2016-10-18 14:21:45 +02:00

119 lines
3.6 KiB
VHDL

-- See the file "LICENSE" for the full license governing this code. --
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.lt16x32_global.all;
-- the processor bundles all entities needed for a running system, including the core itself, the interrupt controller and the memory.
entity processor is
port(
-- clock signal
clk : in std_logic;
-- reset signal, active high, synchronous
rst : in std_logic;
-- interrupt lines
-- three interrupts are used internally
irq : in std_logic_vector(2 ** irq_num_width - 4 downto 0);
-- out_byte to communicate to extern world
out_byte : out std_logic_vector(7 downto 0)
);
end entity processor;
architecture RTL of processor is
component core
port(clk : in std_logic;
rst : in std_logic;
stall : in std_logic;
in_dmem : in dmem_core;
out_dmem : out core_dmem;
in_imem : in imem_core;
out_imem : out core_imem;
in_irq : in irq_core;
out_irq : out core_irq;
hardfault : out std_logic);
end component core;
component memory
generic(filename : string := "program.ram";
size : integer := 256;
imem_latency : in time := 5 ns;
dmem_latency : in time := 5 ns);
port(clk : in std_logic;
rst : in std_logic;
in_dmem : in core_dmem;
out_dmem : out dmem_core;
in_imem : in core_imem;
out_imem : out imem_core;
fault : out std_logic;
out_byte : out std_logic_vector(7 downto 0));
end component memory;
component irq_controller
port(clk : in std_logic;
rst : in std_logic;
in_proc : in core_irq;
out_proc : out irq_core;
irq_lines : in std_logic_vector((2 ** irq_num_width) - 1 downto 0));
end component irq_controller;
-- signals between instances
signal dmem_core_signal : dmem_core;
signal core_dmem_signal : core_dmem;
signal imem_core_signal : imem_core;
signal core_imem_signal : core_imem;
signal irq_core_signal : irq_core;
signal core_irq_signal : core_irq;
signal irq_lines : std_logic_vector((2 ** irq_num_width) - 1 downto 0);
-- fault signal from core
signal core_fault : std_logic;
-- fault signal from memory
signal mem_fault : std_logic;
begin
-- fixed interrupt lines
-- irq0 is reset
irq_lines(0) <= '0'; -- reset
-- irq1 is core fault
irq_lines(1) <= core_fault;
-- irq2 is memory fault
irq_lines(2) <= mem_fault;
-- other lines can be used from the outside
irq_lines(irq_lines'high downto 3) <= irq;
core_inst : component core
port map(clk => clk,
rst => rst,
stall => '0',
in_dmem => dmem_core_signal,
out_dmem => core_dmem_signal,
in_imem => imem_core_signal,
out_imem => core_imem_signal,
in_irq => irq_core_signal,
out_irq => core_irq_signal,
hardfault => core_fault);
memory_inst : component memory
generic map(filename => "../programs/example_led.ram",
size => 32,
imem_latency => 0 ns,
dmem_latency => 0 ns)
port map(clk => clk,
rst => rst,
in_dmem => core_dmem_signal,
out_dmem => dmem_core_signal,
in_imem => core_imem_signal,
out_imem => imem_core_signal,
fault => mem_fault,
out_byte => out_byte);
irq_controller_inst : component irq_controller
port map(clk => clk,
rst => rst,
in_proc => core_irq_signal,
out_proc => irq_core_signal,
irq_lines => irq_lines);
end architecture RTL;