--32 bit signed multiplier --Rachel Hadaway --Feb 28 2003 Library LPM; use lpm.lpm_components.all; entity mult is port (mcand, mplier : in bit_vector (31 downto 0); clock, reset : in bit; product : out bit_vector (63 downto 0); done : out bit ); end entity mult; architecture mult_arch is component mult_fsm port (mplier : in bit_vector; clock, reset : in bit; done : inout bit; start_out, add_out, shift_out, mplier_bit : out bit); end component; signal mplier_bit, start_out, zerosig, add_out, shift_out : bit; signal product_reg : bit_vector (63 downto 0); signal mcand_reg : bit_vector (31 downto 0); begin zerosig <= '0'; myadd : lpm_add_sub generic map(lpm_width => 32) port map (cin => 0, dataa <= mcand_reg, datab <= product_reg, result <= product_reg, cout <= add_out); registers: process (clock, reset) begin if reset = '0' then product_reg = "0000000000000000000000000000000000000000000000000000000000000000"; --64 bits of 0 mcand_reg = mcand; end if; end process; while (done /= '1') mplier_bit = mplier(0); fsm1 : mult_fsm port map(mplier, clock, reset, mplier_bit, start_out, add_out, shift_out); if (add_out = '1' and mplier_bit) then add1: lpm_add_sub port map (zerosig, mcand_reg, product_reg(63 downto 32), product_reg(63 downto 32), add_out); elsif shift_out = '1' then