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

Subversion Repositories mlite

[/] [mlite/] [trunk/] [vhdl/] [alu.vhd] - Diff between revs 43 and 47

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 43 Rev 47
Line 12... Line 12...
library ieee;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_1164.all;
use work.mlite_pack.all;
use work.mlite_pack.all;
 
 
entity alu is
entity alu is
 
   generic(adder_type : string := "GENERIC");
   port(a_in         : in  std_logic_vector(31 downto 0);
   port(a_in         : in  std_logic_vector(31 downto 0);
        b_in         : in  std_logic_vector(31 downto 0);
        b_in         : in  std_logic_vector(31 downto 0);
        alu_function : in  alu_function_type;
        alu_function : in  alu_function_type;
        c_alu        : out std_logic_vector(31 downto 0));
        c_alu        : out std_logic_vector(31 downto 0));
end; --alu
end; --alu
Line 23... Line 24...
architecture logic of alu is
architecture logic of alu is
--   type alu_function_type is (alu_nothing, alu_add, alu_subtract, 
--   type alu_function_type is (alu_nothing, alu_add, alu_subtract, 
--      alu_less_than, alu_less_than_signed, alu_equal, alu_not_equal,
--      alu_less_than, alu_less_than_signed, alu_equal, alu_not_equal,
--      alu_ltz, alu_lez, alu_eqz, alu_nez, alu_gez, alu_gtz,
--      alu_ltz, alu_lez, alu_eqz, alu_nez, alu_gez, alu_gtz,
--      alu_or, alu_and, alu_xor, alu_nor);
--      alu_or, alu_and, alu_xor, alu_nor);
 
 
 
   signal aa, bb, sum : std_logic_vector(32 downto 0);
 
   signal do_add      : std_logic;
begin
begin
 
 
alu_proc: process(a_in, b_in, alu_function)
alu_proc: process(a_in, b_in, alu_function, sum)
   variable c           : std_logic_vector(31 downto 0);
   variable c           : std_logic_vector(31 downto 0);
   variable aa, bb, sum : std_logic_vector(32 downto 0);
 
   variable do_sub      : std_logic;
 
   variable a_eq_b      : std_logic;
   variable a_eq_b      : std_logic;
   variable a_zero      : std_logic;
   variable a_zero      : std_logic;
   variable sign_ext    : std_logic;
   variable sign_ext    : std_logic;
begin
begin
   c := ZERO;
   c := ZERO;
   if alu_function = alu_add then
   if alu_function = alu_add then
      do_sub := '0';
          do_add <= '1';
   else
   else
      do_sub := '1';
          do_add <= '0';
   end if;
   end if;
   if alu_function = alu_less_than then
   if alu_function = alu_less_than then
      sign_ext := '0';
      sign_ext := '0';
   else
   else
      sign_ext := '1';
      sign_ext := '1';
   end if;
   end if;
   aa := (a_in(31) and sign_ext) & a_in;
   aa <= (a_in(31) and sign_ext) & a_in;
   bb := (b_in(31) and sign_ext) & b_in;
   bb <= (b_in(31) and sign_ext) & b_in;
   sum := bv_adder(aa, bb, do_sub);
 
--   sum := bv_adder_lookahead(aa, bb, do_sub);
   -- Choose bv_adder or lpm_add_sub
 
--   sum <= bv_adder(aa, bb, do_add);
 
--   sum <= bv_adder_lookahead(aa, bb, do_add);
 
 
   if a_in = b_in then
   if a_in = b_in then
      a_eq_b := '1';
      a_eq_b := '1';
   else
   else
      a_eq_b := '0';
      a_eq_b := '0';
   end if;
   end if;
Line 96... Line 101...
   end case;
   end case;
 
 
   c_alu <= c;
   c_alu <= c;
end process;
end process;
 
 
 
 
 
   generic_adder:
 
   if adder_type /= "ALTERA" generate
 
      sum <= bv_adder(aa, bb, do_add);
 
   end generate; --generic_adder
 
 
 
   --For Altera
 
   lpm_adder:
 
   if adder_type = "ALTERA" generate
 
      lpm_add_sub_component : lpm_add_sub
 
      GENERIC MAP (
 
         lpm_width => 33,
 
         lpm_direction => "UNUSED",
 
         lpm_type => "LPM_ADD_SUB",
 
         lpm_hint => "ONE_INPUT_IS_CONSTANT=NO"
 
      )
 
      PORT MAP (
 
         dataa => aa,
 
         add_sub => do_add,
 
         datab => bb,
 
         result => sum
 
      );
 
   end generate; --lpm_adder
 
 
end; --architecture logic
end; --architecture logic
 
 
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

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