nop insertion added
[calu.git] / cpu / src / decoder_b.vhd
index 9e043b2a8a80488e67fab0c20f5c31947b368117..c045d6a8ce2e46d3c7e78ab2f7c82a8f0595b48c 100644 (file)
@@ -25,17 +25,17 @@ begin
        instr_s.reg_src2_addr := (others => '0');
 
        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
@@ -45,11 +45,11 @@ begin
                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;
@@ -58,6 +58,19 @@ begin
                        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);
@@ -96,8 +109,6 @@ begin
                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');
@@ -107,6 +118,8 @@ begin
                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;
@@ -132,7 +145,6 @@ begin
                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');
@@ -140,6 +152,18 @@ begin
 
                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
@@ -165,15 +189,14 @@ begin
                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
@@ -191,7 +214,6 @@ begin
 --     when "01110" =>         --ldw
                instr_s.reg_dest_addr := instruction(22 downto 19);
                instr_s.reg_src1_addr := instruction(18 downto 15);
-               instr_s.displacement(14 downto 0) := instruction(14 downto 0);
                instr_s.immediate(15 downto 0) := instruction(18 downto 3);
                instr_s.signext := instruction(2);
                instr_s.high_low := instruction(1);
@@ -200,6 +222,8 @@ begin
                        if (instr_s.signext = '1' and instr_s.immediate(11) = '1') then
                                instr_s.immediate(31 downto 16) := (others => '1');
                        end if;
+                       instr_s.immediate(14 downto 0) := instruction(14 downto 0);
+                       instr_s.immediate(WORD_WIDTH-1 downto 15) := (others => '0');
                        instr_s.op_detail(IMM_OPT) := '1';
                end if;
        end if;
@@ -234,7 +258,7 @@ begin
        --when "01111" =>               --stw
                instr_s.reg_src1_addr := instruction(22 downto 19);     -- register value
                instr_s.reg_src2_addr := instruction(18 downto 15);     -- mem addr
-               instr_s.displacement(14 downto 0) := instruction(14 downto 0);
+               instr_s.immediate(14 downto 0) := instruction(14 downto 0);
        end if;
 
 --     when "10001" =>         --sth
@@ -287,6 +311,9 @@ begin
 
                        instr_s.op_detail(IMM_OPT) := '1';
                end if;
+               instr_s.op_detail(NO_DST_OPT) := '1';
+               instr_s.op_group := ADDSUB_OP;
+               instr_s.op_detail(SUB_OPT) := '1';
 
        end if;