X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=cpu%2Fsrc%2Fdecoder_b.vhd;h=525d408170a0b6b5bca6b12cfe42ec07f85df0e1;hb=b7b8e941c868a7ebdfcc3fbf15564dac19251ed6;hp=41d02938f0b0529569ab0d2dbd63deeea6256ba8;hpb=2f1bd33623f23cd0cafd3cd2e5d4d1f620d9a2be;p=calu.git diff --git a/cpu/src/decoder_b.vhd b/cpu/src/decoder_b.vhd index 41d0293..525d408 100644 --- a/cpu/src/decoder_b.vhd +++ b/cpu/src/decoder_b.vhd @@ -32,6 +32,7 @@ begin instr_s.bp := '0'; instr_s.op_detail := (others => '0'); instr_s.displacement := (others => '0'); + instr_s.int := '0'; instr_s.op_group := ADDSUB_OP; @@ -227,15 +228,16 @@ begin end if; if (instr_s.opcode = "11010") then --ldi + instr_s.reg_src1_addr := instr_s.reg_dest_addr; + instr_s.op_detail(LOW_HIGH_OPT) := instr_s.high_low; + instr_s.op_detail(LDI_REPLACE_OPT) := instr_s.signext; + if (instr_s.high_low = '1') then instr_s.immediate(31 downto 16) := instruction(18 downto 3); instr_s.immediate(15 downto 0) := (others => '0'); else instr_s.immediate(15 downto 0) := instruction(18 downto 3); instr_s.immediate(31 downto 16) := (others => '0'); - - --instr_s.immediate(11 downto 0) := instruction(14 downto 3); - --instr_s.immediate(WORD_WIDTH-1 downto 12) := (others => '0'); end if; if (instr_s.signext = '1' and instr_s.immediate(11) = '1') then @@ -352,7 +354,8 @@ begin instr_s.jmptype := instruction(3 downto 2); instr_s.signext := instruction(0); instr_s.op_detail(NO_PSW_OPT) := '1'; - + instr_s.op_detail(DIRECT_JUMP_OPT) := instruction(4); + instr_s.int := instruction(4); if (instr_s.opcode = "10110") then instr_s.op_detail(IMM_OPT) := '1'; @@ -366,20 +369,47 @@ begin instr_s.immediate(31 downto 16) := (others => '1'); end if; - if (instr_s.jmptype = "00") then --- instr_s.op_detail(SUB_OPT) := not instr_s.opcode(0); - instr_s.op_group := JMP_OP; - end if; + case instr_s.jmptype is + when "00" => + instr_s.op_group := JMP_OP; + + when "01" => + instr_s.op_group := JMP_ST_OP; + + when "10" => + instr_s.op_group := JMP_ST_OP; + instr_s.op_detail(RET_OPT) := '1'; + + when "11" => + instr_s.op_group := JMP_OP; + instr_s.op_detail(JMP_REG_OPT) := '1'; + instr_s.op_detail(IMM_OPT) := '1'; + instr_s.immediate := (others => '0'); + + when others => null; + end case; - if (instr_s.jmptype = "01") then - instr_s.op_group := JMP_ST_OP; - -- instr_s.op_detail(RET_OPT) := '0'; - end if; - - if (instr_s.jmptype = "10") then - instr_s.op_group := JMP_ST_OP; - instr_s.op_detail(RET_OPT) := '1'; - end if; +-- if (instr_s.jmptype = "00") then +---- instr_s.op_detail(SUB_OPT) := not instr_s.opcode(0); +-- instr_s.op_group := JMP_OP; +-- end if; +-- +-- if (instr_s.jmptype = "01") then +-- instr_s.op_group := JMP_ST_OP; +-- -- instr_s.op_detail(RET_OPT) := '0'; +-- end if; +-- +-- if (instr_s.jmptype = "10") then +-- instr_s.op_group := JMP_ST_OP; +-- instr_s.op_detail(RET_OPT) := '1'; +-- end if; +-- +-- if (instr_s.jmptype = "11") then +-- instr_s.op_group := JMP_OP; +-- instr_s.op_detail(JMP_REG_OPT) := '1'; +-- instr_s.op_detail(IMM_OPT) := '1'; +-- instr_s.immediate := (others => '0'); +-- end if; if (instr_s.predicates = "1111" or instr_s.jmptype = "10") then instr_s.bp := '0';