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

75 lines
2.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_internal.all;
-- the decoder_shadow decodes instructions which are needed but not part of user-available instruction set (e.g. push).
-- it is fully combinatoric.
entity decoder_shadow is
port(
-- input signals from decoder finite state machine
input : in fsm_decshd;
-- output signals to control path (or decoder mux)
output : out dec_cp
);
end entity decoder_shadow;
architecture RTL of decoder_shadow is
begin
-- decode instruction
decode : process(input.instruction) is
begin
-- set defaults to prevent taking values from previous operations
output.s1 <= get_default_dec_cp_s1;
output.s2 <= get_default_dec_cp_s2;
output.s3 <= get_default_dec_cp_s3;
output.hardfault <= '0';
-- set instruction specific signals
case input.instruction(31 downto 28) is
when op_shd_push => -- push instruction
-- write to mem
output.s1.register_read_number_b <= reg_number(input.instruction(3 downto 0));
output.s3.dmem_write_en <= '1';
output.s3.dmem_write_size <= size_word;
output.s3.dmem_write_data_select <= sel_register_value;
-- decrement SP
output.s1.register_read_number_a <= sp_num;
output.s2.alu_mode <= alu_sub;
output.s2.alu_input_data_select <= sel_imm;
output.s2.immediate <= to_signed(4, 8);
output.s3.register_write_number <= sp_num;
output.s3.register_write_enable <= '1';
when op_shd_setsr => -- set SR instruction
output.s3.register_write_data_select <= sel_immediate;
output.s3.register_write_number <= sr_num;
output.s3.register_write_size <= size_byte;
output.s3.register_write_enable <= '1';
output.s2.immediate <= signed(input.instruction(7 downto 0));
when op_shd_reset => -- reset instruction
-- PC = zero
output.s2.pc_summand_select <= sel_immediate;
output.s2.pc_mode_select <= sel_absolute;
output.s2.pc_condition <= sel_unconditional;
output.s2.immediate <= (others => '0');
-- synthesis translate_off
when "UUUU" =>
null; -- ignore startup
-- synthesis translate_on
when others =>
-- unknown operation, throw hardfault
output.hardfault <= '1';
-- synthesis translate_off
assert false report "unknown shadow operation not implemented" severity error;
-- synthesis translate_on
end case;
end process decode;
end architecture RTL;