OpenCores
URL https://opencores.org/ocsvn/neorv32/neorv32/trunk

Subversion Repositories neorv32

[/] [neorv32/] [trunk/] [rtl/] [core/] [neorv32_cpu_cp_muldiv.vhd] - Diff between revs 73 and 74

Show entire file | Details | Blame | View Log

Rev 73 Rev 74
Line 89... Line 89...
  signal div_opy       : std_ulogic_vector(data_width_c-1 downto 0);
  signal div_opy       : std_ulogic_vector(data_width_c-1 downto 0);
  signal rs1_is_signed : std_ulogic;
  signal rs1_is_signed : std_ulogic;
  signal rs2_is_signed : std_ulogic;
  signal rs2_is_signed : std_ulogic;
  signal div_res_corr  : std_ulogic;
  signal div_res_corr  : std_ulogic;
  signal out_en        : std_ulogic;
  signal out_en        : std_ulogic;
 
  signal rs2_zero      : std_ulogic;
 
 
  -- divider core --
  -- divider core --
  signal remainder        : std_ulogic_vector(data_width_c-1 downto 0);
  signal remainder        : std_ulogic_vector(data_width_c-1 downto 0);
  signal quotient         : std_ulogic_vector(data_width_c-1 downto 0);
  signal quotient         : std_ulogic_vector(data_width_c-1 downto 0);
  signal div_sub          : std_ulogic_vector(data_width_c   downto 0);
  signal div_sub          : std_ulogic_vector(data_width_c   downto 0);
Line 150... Line 151...
          end if;
          end if;
 
 
        when DIV_PREPROCESS =>
        when DIV_PREPROCESS =>
          -- check relevant input signs for result sign compensation --
          -- check relevant input signs for result sign compensation --
          if (cp_op = cp_op_div_c) then -- signed div operation
          if (cp_op = cp_op_div_c) then -- signed div operation
            div_res_corr <= (rs1_i(rs1_i'left) xor rs2_i(rs2_i'left)) and or_reduce_f(rs2_i); -- different signs AND rs2 not zero
            div_res_corr <= (rs1_i(rs1_i'left) xor rs2_i(rs2_i'left)) and (not rs2_zero); -- different signs AND rs2 not zero
          elsif (cp_op = cp_op_rem_c) then -- signed rem operation
          elsif (cp_op = cp_op_rem_c) then -- signed rem operation
            div_res_corr <= rs1_i(rs1_i'left);
            div_res_corr <= rs1_i(rs1_i'left);
          else
          else
            div_res_corr <= '0';
            div_res_corr <= '0';
          end if;
          end if;
Line 181... Line 182...
          state <= IDLE;
          state <= IDLE;
      end case;
      end case;
    end if;
    end if;
  end process coprocessor_ctrl;
  end process coprocessor_ctrl;
 
 
 
  -- rs2 zero? --
 
  rs2_zero <= '1' when (or_reduce_f(rs2_i) = '0') else '0';
 
 
  -- co-processor command --
  -- co-processor command --
  cp_op <= ctrl_i(ctrl_ir_funct3_2_c downto ctrl_ir_funct3_0_c);
  cp_op <= ctrl_i(ctrl_ir_funct3_2_c downto ctrl_ir_funct3_0_c);
 
 
  -- operation: 0=mul, 1=div --
  -- operation: 0=mul, 1=div --
  operation <= '1' when (cp_op(2) = '1') else '0';
  operation <= '1' when (cp_op(2) = '1') else '0';

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.