реклама на сайте
подробности

 
 
> Умножители 36x32, Xilinx, Низкая тактовая
alxkon
сообщение Jun 27 2011, 07:00
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 16-11-10
Пользователь №: 60 920



Здарова Все!

Столкнулся с такой ситуацией - проект на Спартане 6, присутствуют несколько умножителей
36х32, тактовая макс. 46МГц - 6 DSP48 + LUTы ( ISE 13.1 ).
Кроме того есть другие умножители 34х32, 22х18, по ним пока замечаний нет.
Можно конечно CoreGen наделать и пораспихать по нужным местам все умножители.
Вопрос кто сталкивался - естъ ли смысл написатъ универсальный код с чтобы контролироватъ
поведение синтезатора, намекнув ему что составляющие базовые умножители размером 18х18 ?

Или овчинка выделки не стоит?

Спасибо!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
tegumay
сообщение Jun 27 2011, 19:33
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 264
Регистрация: 16-09-05
Из: Москва
Пользователь №: 8 640



код в студию чтоли... маловато это для спартана

асинхронный умножитель чтоли? конвеер включите

много дсп для 32*36 вроде меньше должно быть


--------------------
;X
Go to the top of the page
 
+Quote Post
alxkon
сообщение Jun 28 2011, 08:50
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 16-11-10
Пользователь №: 60 920



Цитата(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(cool.gif;

-- 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. Регистрируем конечный результат

Вопрос есть ли смысл ?
Причина редактирования: пользуйтесь тегами для оформления кода (с) Модератор
Go to the top of the page
 
+Quote Post
des00
сообщение Jun 28 2011, 08:56
Сообщение #4


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(antsu88 @ Jun 28 2011, 02:50) *
Вопрос есть ли смысл ?

нет, лучше взять непосредственный инстанс корки и вынести параметр MULT_PIPE для настройки


--------------------
Go to the top of the page
 
+Quote Post
alxkon
сообщение Jun 28 2011, 10:02
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 16-11-10
Пользователь №: 60 920



Цитата(des00 @ Jun 28 2011, 11:56) *
нет, лучше взять непосредственный инстанс корки и вынести параметр MULT_PIPE для настройки

Скажу честно, я туплю, не понимаю как это сделать?
Go to the top of the page
 
+Quote Post
des00
сообщение Jun 28 2011, 10:54
Сообщение #6


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(antsu88 @ Jun 28 2011, 04:02) *
Скажу честно, я туплю, не понимаю как это сделать?

для альтеры так
Код
`ifdef __USE_ALTERA_MACRO__
      lpm_mult
      #(
        .lpm_hint           ( "INPUT_B_IS_CONSTANT=NO,DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=5" ) ,
        .lpm_widtha         ( pIDAT_W                                                                      ) ,
        .lpm_widthb         ( pDAT2COE_W                                                                   ) ,
        .lpm_widthp         ( cMULT_W                                                                      ) ,
        .lpm_widths         ( 1                                                                            ) ,
        .lpm_type           ( "LPM_MULT"                                                                   ) ,
        .lpm_representation ( "SIGNED"                                                                     ) ,
        .lpm_pipeline       ( 2                                                                            )        // do as parameter
      )
      lpm_mult
      (
        .dataa  ( oerr        ),
        .datab  ( dat2coe [i] ),
        .clken  ( iclkena     ),
        .clock  ( iclk        ),
        .result ( mult    [i] ),
        .aclr   ( 1'b0        ),
        .sum    ( 1'b0        )
      );
`endif


Цитата(Hoodwin @ Jun 28 2011, 03:50) *
Но в целом лучше переписать так

а смысл? корегенератор сделает тоже самое, для этого достаточно указать кол-во ступеней конвейеризации.


--------------------
Go to the top of the page
 
+Quote Post
alxkon
сообщение Jun 30 2011, 06:54
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 16-11-10
Пользователь №: 60 920



Цитата(des00 @ Jun 28 2011, 13:54) *
для альтеры так
Код
`ifdef __USE_ALTERA_MACRO__
      lpm_mult
      #(
        .lpm_hint           ( "INPUT_B_IS_CONSTANT=NO,DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=5" ) ,
        .lpm_widtha         ( pIDAT_W                                                                      ) ,
        .lpm_widthb         ( pDAT2COE_W                                                                   ) ,
        .lpm_widthp         ( cMULT_W                                                                      ) ,
        .lpm_widths         ( 1                                                                            ) ,
        .lpm_type           ( "LPM_MULT"                                                                   ) ,
        .lpm_representation ( "SIGNED"                                                                     ) ,
        .lpm_pipeline       ( 2                                                                            )        // do as parameter
      )
      lpm_mult
      (
        .dataa  ( oerr        ),
        .datab  ( dat2coe [i] ),
        .clken  ( iclkena     ),
        .clock  ( iclk        ),
        .result ( mult    [i] ),
        .aclr   ( 1'b0        ),
        .sum    ( 1'b0        )
      );
`endif



а смысл? корегенератор сделает тоже самое, для этого достаточно указать кол-во ступеней конвейеризации.


Спасибо за наводку. Однако Ксилинкс сделал макрос только для 22х18 максимально. По этому придется дорабатывать напильником sm.gif

===================
Elaborating entity <MULT_MACRO> (architecture <mult>) with generics from library <unimacro>.
WARNING:HDLCompiler:321 - "N:/O.40d/rtf/devlib/vhdl/src/unimacro/MULT_MACRO.vhd" Line 63: Comparison between arrays of unequal length always returns FALSE.
WARNING:HDLCompiler:321 - "N:/O.40d/rtf/devlib/vhdl/src/unimacro/MULT_MACRO.vhd" Line 82: Comparison between arrays of unequal length always returns FALSE.
WARNING:HDLCompiler:321 - "N:/O.40d/rtf/devlib/vhdl/src/unimacro/MULT_MACRO.vhd" Line 101: Comparison between arrays of unequal length always returns FALSE.
ERROR:HDLCompiler:1242 - "N:/O.40d/rtf/devlib/vhdl/src/unimacro/MULT_MACRO.vhd" Line 144: "Illegal value of Attribute WIDTH_B : 22. Legal values of this attribute are 1 to 18 ":
===================
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- antsu88   Умножители 36x32   Jun 27 2011, 07:00
- - Koluchiy   А сейчас как у Вас умножители описаны?   Jun 27 2011, 18:53
|- - litv   Цитата(tegumay @ Jun 27 2011, 23:33) код ...   Jun 28 2011, 04:23
|- - des00   Цитата(antsu88 @ Jun 30 2011, 00:54) Одна...   Jun 30 2011, 11:38
|- - antsu88   Цитата(des00 @ Jun 30 2011, 14:38) вы нем...   Jun 30 2011, 14:07
|- - des00   Цитата(antsu88 @ Jun 30 2011, 09:07) вот ...   Jun 30 2011, 14:32
|- - antsu88   Цитата(des00 @ Jun 30 2011, 17:32) вам ну...   Jul 1 2011, 09:15
- - Hoodwin   Имхо, вся беда в том, что за один такт аппаратный ...   Jun 28 2011, 09:50
- - Hoodwin   Смысл в том, что коргенераторы разные у разных фир...   Jun 28 2011, 11:10
|- - des00   Цитата(Hoodwin @ Jun 28 2011, 05:10) Смыс...   Jun 28 2011, 11:39
- - BlackOps   перенес всетаки в новую тему. извините.   Jul 1 2011, 03:44


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 17th June 2025 - 18:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01472 секунд с 7
ELECTRONIX ©2004-2016