Цитата(tegumay @ Jun 27 2011, 22:33)

код в студию чтоли... маловато это для спартана
асинхронный умножитель чтоли? конвеер включите
много дсп для 32*36 вроде меньше должно быть
Код не мой, вот:
CODE
-----------------
--! Standard libraries
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
--! Entity
entity a_mult is
generic(
ARITH_DATA_A_MSB : integer; --! Data input A bus MSB
ARITH_DATA_B_MSB : integer; --! Data input B bus MSB
RESULT_DATA_MSB : integer --! Result data bus MSB
);
port(
-- Main
rst : in std_logic; --! Asynchronous reset
clk : in std_logic; --! Clock
-- Memory
a : in std_logic_vector(ARITH_DATA_A_MSB downto 0); --! Arithmetic port a write data
b : in std_logic_vector(ARITH_DATA_B_MSB downto 0); --! Arithmetic port b write data
p : out std_logic_vector(RESULT_DATA_MSB downto 0) --! Arithmetic result read data
);
end a_mult;
--! Architecture
architecture rtl of a_mult is
-- Width of the intermediate result value
constant RESULT_WIDTH : natural := get_min((RESULT_DATA_MSB+1),(ARITH_DATA_A_MSB+1+ARITH_DATA_B_MSB+1));
signal a_p2 : signed(ARITH_DATA_A_MSB downto 0);
signal b_p2 : signed(ARITH_DATA_B_MSB downto 0);
signal p1 : signed(ARITH_DATA_A_MSB+1+ARITH_DATA_B_MSB downto 0);
begin
-- Connect result data to output ports
-- * Drop rightmost bits if RESULT_DATA_MSB is smaller than ARITH_DATA_A_MSB+1+ARITH_DATA_B_MSB
-- * Fill left side with sign bit if RESULT_DATA_MSB is bigger than ARITH_DATA_A_MSB+1+ARITH_DATA_B_MSB
p <= std_logic_vector(resize(p1(ARITH_DATA_A_MSB+1+ARITH_DATA_B_MSB downto (ARITH_DATA_A_MSB+1+ARITH_DATA_B_MSB)-(RESULT_WIDTH-1)), RESULT_DATA_MSB+1));
p_seq : process(rst, clk)
begin
if ( rst = '1') then
a_p2 <= (others => '0');
b_p2 <= (others => '0');
p1 <= (others => '0');
elsif (rising_edge(clk)) then
-- Capture input data to pipeline registers
a_p2 <= signed(a);
b_p2 <= signed(

;
-- Multiply registered values
p1 <= a_p2 * b_p2;
end if;
end process p_seq;
end rtl;
---------------
этот примитив использован во многих местах проекта, сответственно в зависимости от генериков умножитель может принять форму и 18х18
и 36х32 и тд.
Цитата(Koluchiy @ Jun 27 2011, 21:53)

А сейчас как у Вас умножители описаны?
Думаю переписать на будущее на манер
0. Регистрируем А и Б
1. Вход А разбиваем на младшие беззнаковые части (по 18бит ) и старшую знаковую (от 1 до 18бит, взависимости от)
2. Вход Б разбиваем на младшие беззнаковые части (по 18бит ) и старшую знаковую (от 1 до 18бит, взависимости от)
3. Перемножаем соответствующие части с друг с другом, таким же способом p <=a*b. При этом даем свободу синтезатору самому решить когда использовать DSP48 или LUTы
При 18х2 будут LUTы а 18х15 DSP48,
4. Регистрируем результаты
5. Сдвигаем соответствующие результаты влево и суммируем
6. Регистрируем конечный результат
Вопрос есть ли смысл ?