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

Subversion Repositories plasma

[/] [plasma/] [tags/] [V2_1/] [vhdl/] [mult.vhd] - Diff between revs 45 and 47

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

Rev 45 Rev 47
Line 15... Line 15...
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 mult is
entity mult is
 
   generic(adder_type : string := "GENERIC");
   port(clk       : in std_logic;
   port(clk       : in std_logic;
        a, b      : in std_logic_vector(31 downto 0);
        a, b      : in std_logic_vector(31 downto 0);
        mult_func : in mult_function_type;
        mult_func : in mult_function_type;
        c_mult    : out std_logic_vector(31 downto 0);
        c_mult    : out std_logic_vector(31 downto 0);
        pause_out : out std_logic);
        pause_out : out std_logic);
Line 26... Line 27...
 
 
architecture logic of mult is
architecture logic of mult is
--   type mult_function_type is (
--   type mult_function_type is (
--      mult_nothing, mult_read_lo, mult_read_hi, mult_write_lo, 
--      mult_nothing, mult_read_lo, mult_read_hi, mult_write_lo, 
--      mult_write_hi, mult_mult, mult_divide, mult_signed_divide);
--      mult_write_hi, mult_mult, mult_divide, mult_signed_divide);
   signal do_div_reg    : std_logic;
   signal do_mult_reg   : std_logic;
   signal do_signed_reg : std_logic;
   signal do_signed_reg : std_logic;
   signal count_reg     : std_logic_vector(5 downto 0);
   signal count_reg     : std_logic_vector(5 downto 0);
   signal reg_a         : std_logic_vector(31 downto 0);
   signal reg_a         : std_logic_vector(31 downto 0);
   signal reg_b         : std_logic_vector(63 downto 0);
   signal reg_b         : std_logic_vector(63 downto 0);
   signal answer_reg    : std_logic_vector(31 downto 0);
   signal answer_reg    : std_logic_vector(31 downto 0);
 
   signal aa, bb        : std_logic_vector(32 downto 0);
 
   signal sum           : std_logic_vector(32 downto 0);
begin
begin
 
 
--multiplication/division unit
--multiplication/division unit
mult_proc: process(clk, a, b, mult_func,
mult_proc: process(clk, a, b, mult_func,
                   do_div_reg, do_signed_reg, count_reg,
                   do_mult_reg, do_signed_reg, count_reg,
                   reg_a, reg_b, answer_reg)
                   reg_a, reg_b, answer_reg, sum)
   variable do_div_temp    : std_logic;
   variable do_mult_temp   : std_logic;
   variable do_signed_temp : std_logic;
   variable do_signed_temp : std_logic;
   variable count_temp     : std_logic_vector(5 downto 0);
   variable count_temp     : std_logic_vector(5 downto 0);
   variable a_temp         : std_logic_vector(31 downto 0);
   variable a_temp         : std_logic_vector(31 downto 0);
   variable b_temp         : std_logic_vector(63 downto 0);
   variable b_temp         : std_logic_vector(63 downto 0);
   variable answer_temp    : std_logic_vector(31 downto 0);
   variable answer_temp    : std_logic_vector(31 downto 0);
 
 
   variable aa, bb         : std_logic_vector(32 downto 0);
 
   variable sum            : std_logic_vector(32 downto 0);
 
   variable start          : std_logic;
   variable start          : std_logic;
   variable do_write       : std_logic;
   variable do_write       : std_logic;
   variable do_hi          : std_logic;
   variable do_hi          : std_logic;
   variable sign_extend    : std_logic;
   variable sign_extend    : std_logic;
 
 
begin
begin
   do_div_temp    := do_div_reg;
   do_mult_temp   := do_mult_reg;
   do_signed_temp := do_signed_reg;
   do_signed_temp := do_signed_reg;
   count_temp     := count_reg;
   count_temp     := count_reg;
   a_temp         := reg_a;
   a_temp         := reg_a;
   b_temp         := reg_b;
   b_temp         := reg_b;
   answer_temp    := answer_reg;
   answer_temp    := answer_reg;
   sign_extend    := do_signed_reg and not do_div_reg;
   sign_extend    := do_signed_reg and do_mult_reg;
 
 
   aa             := '0' & ZERO;
 
   bb             := '0' & ZERO;
 
   sum            := '0' & ZERO;
 
   start          := '0';
   start          := '0';
   do_write       := '0';
   do_write       := '0';
   do_hi          := '0';
   do_hi          := '0';
 
 
   case mult_func is
   case mult_func is
Line 79... Line 75...
   when mult_write_hi =>
   when mult_write_hi =>
      do_write := '1';
      do_write := '1';
      do_hi := '1';
      do_hi := '1';
   when mult_mult =>
   when mult_mult =>
      start := '1';
      start := '1';
      do_div_temp := '0';
      do_mult_temp := '1';
      do_signed_temp := '0';
      do_signed_temp := '0';
   when mult_signed_mult =>
   when mult_signed_mult =>
      start := '1';
      start := '1';
      do_div_temp := '0';
      do_mult_temp := '1';
      do_signed_temp := a(31) xor b(31);
      do_signed_temp := a(31) xor b(31);
   when mult_divide =>
   when mult_divide =>
      start := '1';
      start := '1';
      do_div_temp := '1';
      do_mult_temp := '0';
      do_signed_temp := '0';
      do_signed_temp := '0';
   when mult_signed_divide =>
   when mult_signed_divide =>
      start := '1';
      start := '1';
      do_div_temp := '1';
      do_mult_temp := '0';
      do_signed_temp := a(31) xor b(31);
      do_signed_temp := a(31) xor b(31);
   when others =>
   when others =>
   end case;
   end case;
 
 
   if start = '1' then
   if start = '1' then
      count_temp := "000000";
      count_temp := "000000";
      answer_temp := ZERO;
      answer_temp := ZERO;
      if do_div_temp = '1' then
      if do_mult_temp = '0' then
         b_temp(63) := '0';
         b_temp(63) := '0';
         if mult_func /= mult_signed_divide or b(31) = '0' then
         if mult_func /= mult_signed_divide or b(31) = '0' then
            b_temp(62 downto 31) := b;
            b_temp(62 downto 31) := b;
         else
         else
            b_temp(62 downto 31) := bv_negate(b);
            b_temp(62 downto 31) := bv_negate(b);
Line 124... Line 120...
      else
      else
         b_temp(63 downto 32) := a;
         b_temp(63 downto 32) := a;
      end if;
      end if;
   end if;
   end if;
 
 
   if do_div_reg = '1' then
   if do_mult_reg = '0' then
      bb := reg_b(32 downto 0);
      bb <= reg_b(32 downto 0);
   else
   else
--      bb := '0' & reg_b(63 downto 32);
      bb <= (reg_b(63) and sign_extend) & reg_b(63 downto 32);
      bb := (reg_b(63) and sign_extend) & reg_b(63 downto 32);
 
   end if;
   end if;
--   aa := '0' & reg_a;
   aa <= (reg_a(31) and sign_extend) & reg_a;
   aa := (reg_a(31) and sign_extend) & reg_a;
 
   sum := bv_adder(aa, bb, do_div_reg);
   -- Choose bv_adder or lpm_add_sub
--   sum := bv_adder_lookahead(aa, bb, do_div_reg);
--   sum <= bv_adder(aa, bb, do_mult_reg);
 
 
   if count_reg(5) = '0' and start = '0' then
   if count_reg(5) = '0' and start = '0' then
      count_temp := bv_inc6(count_reg);
      count_temp := bv_inc6(count_reg);
      if do_div_reg = '1' then
      if do_mult_reg = '0' then
         answer_temp(31 downto 1) := answer_reg(30 downto 0);
         answer_temp(31 downto 1) := answer_reg(30 downto 0);
         if reg_b(63 downto 32) = ZERO and sum(32) = '0' then
         if reg_b(63 downto 32) = ZERO and sum(32) = '0' then
            a_temp := sum(31 downto 0);  --aa=aa-bb;
            a_temp := sum(31 downto 0);  --aa=aa-bb;
            answer_temp(0) := '1';
            answer_temp(0) := '1';
         else
         else
Line 179... Line 174...
         end if;
         end if;
      end if;
      end if;
   end if;
   end if;
 
 
   if rising_edge(clk) then
   if rising_edge(clk) then
      do_div_reg <= do_div_temp;
      do_mult_reg <= do_mult_temp;
      do_signed_reg <= do_signed_temp;
      do_signed_reg <= do_signed_temp;
      count_reg <= count_temp;
      count_reg <= count_temp;
      reg_a <= a_temp;
      reg_a <= a_temp;
      reg_b <= b_temp;
      reg_b <= b_temp;
      answer_reg <= answer_temp;
      answer_reg <= answer_temp;
Line 192... Line 187...
   if count_reg(5) = '0' and mult_func/= mult_nothing and start = '0' then
   if count_reg(5) = '0' and mult_func/= mult_nothing and start = '0' then
      pause_out <= '1';
      pause_out <= '1';
   else
   else
      pause_out <= '0';
      pause_out <= '0';
   end if;
   end if;
   if mult_func = mult_read_lo then
   case mult_func is
 
   when mult_read_lo =>
      c_mult <= reg_b(31 downto 0);
      c_mult <= reg_b(31 downto 0);
   elsif mult_func = mult_read_hi then
   when mult_read_hi =>
      c_mult <= reg_b(63 downto 32);
      c_mult <= reg_b(63 downto 32);
   else
   when others =>
      c_mult <= ZERO;
      c_mult <= ZERO;
   end if;
   end case;
 
 
end process;
end process;
 
 
 
 
 
   generic_adder:
 
   if adder_type /= "ALTERA" generate
 
      sum <= bv_adder(aa, bb, do_mult_reg);
 
   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_mult_reg,
 
         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.