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

 
 
> Умножители 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

Сообщений в этой теме
- 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 28 2011, 02:50) Вопр...   Jun 28 2011, 08:56
|- - antsu88   Цитата(des00 @ Jun 28 2011, 11:56) нет, л...   Jun 28 2011, 10:02
|- - des00   Цитата(antsu88 @ Jun 28 2011, 04:02) Скаж...   Jun 28 2011, 10:54
|- - antsu88   Цитата(des00 @ Jun 28 2011, 13:54) для ал...   Jun 30 2011, 06:54
|- - 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 Текстовая версия Сейчас: 18th June 2025 - 03:33
Рейтинг@Mail.ru


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