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

126 lines
3.5 KiB
VHDL

-- See the file "LICENSE" for the full license governing this code. --
library ieee;
use ieee.std_logic_1164.all;
use work.lt16x32_internal.all;
-- the decoder translates instructions from the memory into control signals.
-- it bundles pre-stage, finite stage machine and multiple instruction decoder (16bit, 32bit, shadow)
entity decoder is
port(
-- clock signal
clk : in std_logic;
-- reset signal, active high, synchronous
rst : in std_logic;
-- stall signal, active high, synchronous
stall : in std_logic;
-- signals from instruction memory
in_imem : in imem_dec;
-- signals to instruction memory
out_imem : out dec_imem;
-- signals from datapath
in_dp : in dp_dec;
-- signals from controlpath
in_cp : in cp_dec;
-- signals to controlpath
out_cp : out dec_cp;
-- signals to PC
out_pc : out dec_pc;
-- signals from interrupt controller
in_irq : in irq_dec;
-- signals to interrupt controller
out_irq : out dec_irq
);
end entity decoder;
architecture RTL of decoder is
component decoder_pre
port(input : in imem_dec;
output : out pre_fsm);
end component decoder_pre;
component decoder_16bit
port(input : in fsm_dec16;
output : out dec_cp);
end component decoder_16bit;
component decoder_32bit
port(input : in fsm_dec32;
output : out dec_cp);
end component decoder_32bit;
component decoder_shadow
port(input : in fsm_decshd;
output : out dec_cp);
end component decoder_shadow;
component decoder_fsm
port(clk : in std_logic;
rst : in std_logic;
stall : in std_logic;
in_pre : in pre_fsm;
in_cp : in cp_dec;
in_dp : in dp_dec;
out_16 : out fsm_dec16;
out_32 : out fsm_dec32;
out_shd : out fsm_decshd;
out_mux : out fsm_decmux;
out_pc : out dec_pc;
out_imem : out dec_imem;
in_irq : in irq_dec;
out_irq : out dec_irq);
end component decoder_fsm;
-- signals between instances
signal pre_fsm_signal : pre_fsm;
signal fsm_dec16_signal : fsm_dec16;
signal fsm_dec32_signal : fsm_dec32;
signal fsm_decshd_signal : fsm_decshd;
signal fsm_mux_signal : fsm_decmux;
signal fsm_pc_signal : dec_pc;
signal fsm_imem_signal : dec_imem;
signal dec16_mux_signal : dec_cp;
signal dec32_mux_signal : dec_cp;
signal decshd_mux_signal : dec_cp;
begin
decoder_pre_inst : component decoder_pre
port map(input => in_imem,
output => pre_fsm_signal);
decoder_fsm_inst : component decoder_fsm
port map(clk => clk,
rst => rst,
stall => stall,
in_pre => pre_fsm_signal,
in_cp => in_cp,
in_dp => in_dp,
in_irq => in_irq,
out_irq => out_irq,
out_16 => fsm_dec16_signal,
out_32 => fsm_dec32_signal,
out_shd => fsm_decshd_signal,
out_mux => fsm_mux_signal,
out_pc => fsm_pc_signal,
out_imem => fsm_imem_signal);
decoder_16_inst : component decoder_16bit
port map(input => fsm_dec16_signal,
output => dec16_mux_signal);
decoder_32_inst : component decoder_32bit
port map(input => fsm_dec32_signal,
output => dec32_mux_signal);
decoder_shd_inst : component decoder_shadow
port map(input => fsm_decshd_signal,
output => decshd_mux_signal);
-- multiplexer
mux_output : with fsm_mux_signal.mode select out_cp <=
dec16_mux_signal when sel_ir16,
dec32_mux_signal when sel_ir32,
decshd_mux_signal when sel_irshadow;
-- simple signal assignments
out_pc <= fsm_pc_signal;
out_imem <= fsm_imem_signal;
end architecture RTL;