instr_s.immediate := (others => '0');
instr_s.displacement := (others => '0');
instr_s.jmptype := (others => '0');
- instr_s.carry := '0';
- instr_s.sreg_update := '0';
instr_s.high_low := '0';
instr_s.fill := '0';
instr_s.signext := '0';
instr_s.bp := '0';
- instr_s.arith := '0';
instr_s.op_detail := (others => '0');
+ instr_s.op_group := ADDSUB_OP;
+
+-- type op_info_t is (ADDSUB_OP,AND_OP,OR_OP, XOR_OP,SHIFT_OP);
+
-- special function register operations missing
-- case opcode is
instr_s.reg_dest_addr := instruction(22 downto 19);
instr_s.reg_src1_addr := instruction(18 downto 15);
instr_s.reg_src2_addr := instruction(14 downto 11);
- instr_s.carry := instruction(1);
- instr_s.sreg_update := instruction(0);
instr_s.op_detail(NO_PSW_OPT) := instruction(0); --instr_s.sreg_update;
+ instr_s.op_group := ADDSUB_OP;
+
if (instr_s.opcode = "00000") then
instr_s.op_detail(CARRY_OPT) := instruction(1); --instr_s.carry;
end if;
instr_s.op_detail(SUB_OPT) := '1';
instr_s.op_detail(CARRY_OPT) := instruction(1); --instr_s.carry;
end if;
+
+ if (instr_s.opcode = "00100") then
+ instr_s.op_group := AND_OP;
+ end if;
+
+ if (instr_s.opcode = "00110") then
+ instr_s.op_group := OR_OP;
+ end if;
+
+ if (instr_s.opcode = "01000") then
+ instr_s.op_group := XOR_OP;
+ end if;
+
end if;
-- when "00001" => --sub
-- instr_s.reg_dest_addr := instruction(22 downto 19);
instr_s.reg_src1_addr := instruction(18 downto 15);
instr_s.immediate(11 downto 0) := instruction(14 downto 3);
instr_s.signext := instruction(2);
- instr_s.carry := instruction(1);
- instr_s.sreg_update := instruction(0);
if (instr_s.signext = '1' and instr_s.immediate(11) = '1') then
instr_s.immediate(31 downto 12) := (others => '1');
instr_s.op_detail(CARRY_OPT) := instruction(1);
instr_s.op_detail(NO_PSW_OPT) := instruction(0);
+ instr_s.op_group := ADDSUB_OP;
+
if (instr_s.opcode = "00011") then
instr_s.op_detail(SUB_OPT) := '1';
end if;
instr_s.immediate(15 downto 0) := instruction(18 downto 3);
instr_s.high_low := instruction(2);
instr_s.fill := instruction(1);
- instr_s.sreg_update := instruction(0);
if (instr_s.fill = '1') then
instr_s.immediate(31 downto 16) := (others => '1');
instr_s.op_detail(IMM_OPT) := '1';
instr_s.op_detail(NO_PSW_OPT) := instruction(0);
+
+ if (instr_s.opcode = "00111") then
+ instr_s.op_group := AND_OP;
+ end if;
+
+ if (instr_s.opcode = "00111") then
+ instr_s.op_group := OR_OP;
+ end if;
+
+ if (instr_s.opcode = "01001") then
+ instr_s.op_group := XOR_OP;
+ end if;
end if;
-- when "00111" => --orx
instr_s.reg_dest_addr := instruction(22 downto 19);
instr_s.reg_src1_addr := instruction(18 downto 15);
instr_s.immediate(4 downto 0) := instruction(14 downto 10);
- instr_s.left_right := instruction(3);
- instr_s.arith := instruction(2);
- instr_s.carry := instruction(1);
- instr_s.sreg_update := instruction(0);
instr_s.op_detail(RIGHT_OPT) := instruction(3);
instr_s.op_detail(NO_PSW_OPT) := instruction(0);
instr_s.op_detail(CARRY_OPT) := instruction(1);
instr_s.op_detail(ARITH_OPT) := instruction(2);
+ instr_s.op_detail(IMM_OPT) := '1';
+
+ instr_s.op_group := SHIFT_OP;
end if;
-- when "01011" => --stackop