Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Умножитель signed/unsigned 64bit
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Mad-man
help.gif Может кто видел умножители 64бит целых знаковых и беззнаковых чисел.
Или какое-нибудь законченное решение откуда его можно выдрать.
язык Verilog-2001.

Был бы очень благодарен. cheers.gif

чесно говоря есть 32 разрядный можно былобы его немного расширить,
но за такой код убить мало, ничего не понятно angry.gif
не хочется изобретать велосипеды
и кроме того похоже на умножение столбиком какое-то cranky.gif
Terminator
Такой вариант устроит?
Код
wire [W_A-1:0] a;
wire [W_B-1:0] b;
wire [W_A+W_B-1:0] q;

assign q = a * b;


Если надо со знаком дописать signed.
3.14
Только вот разные синтезаторы директивы signed/unsigned по разному жуют, надо в доке уточнять.
klop
Цитата(Terminator @ Jan 3 2007, 09:30) *
Такой вариант устроит?
Код
wire [W_A-1:0] a;
wire [W_B-1:0] b;
wire [W_A+W_B-1:0] q;

assign q = a * b;


Если надо со знаком дописать signed.


А что насчет быстодейсвия?
Самурай
Цитата(Mad-man @ Dec 29 2006, 18:09)
не хочется изобретать велосипеды
и кроме того похоже на умножение столбиком какое-то


Каждый уважающий себя инженер должен хотя бы один раз в жизни изобрести свой собственный велосипедsmile.gif. Это, я Вас смею заверить, очень полезно с точки зрения познания глубинной сущности вещей.

И позвольте спросить, что это за пренебрежительное отношение к умножению в столбик? Пусть меня поправят если я ошибаюсь, но насколько мне известно, большинство существующих в мире алгоритмов умножения базируются как раз на методе умножения в столбик! Все эти алгоритмы Бута, деревья Уоллеса, матричные алгоритмы - все это ни что иное как алгоритм умножения столбиком, только вид в профильsmile.gif. Я сейчас не говорю про совершенно безумные методы, те что например базируются на алгоритме БПФ, или на теоретико-числовых преобразованиях. Это отдельная песня и тема кандидатских работsmile.gif.

Но это было лирическое отступлениеsmile.gif. А если возвращаться к нашим баранам, то как верно было замечено в предыдущем посте, что Вы скажете насчет быстродействия? Или если немного развернуть этот вопрос, то оптимизированный по какому критерию умножитель Вам нужен? По занимаемым ресурсам или быстродействию?
Terminator
Цитата(klop @ Jan 4 2007, 01:29) *
Цитата(Terminator @ Jan 3 2007, 09:30) *

Такой вариант устроит?
Код
wire [W_A-1:0] a;
wire [W_B-1:0] b;
wire [W_A+W_B-1:0] q;

assign q = a * b;


Если надо со знаком дописать signed.


А что насчет быстодейсвия?

Каков вопрос таков ответ smile.gif
Симплифи, при соблюдении некоторых условий, синтезирует вполне быстрый умножитель. В квартусе, если надо быстрый, то без lpm_mult не обойтись. Может есть и более удачные варианты, я не встречал.
EvgenyNik
А если подойти к этой задаче несколько иначе...
Если в вашем случае разрядность 64 бита характеризует диапазон чисел, а не точность, то стоит подумать об уменьшении разрядности с последующим восстановлением для результата.
Бывают задачи, где надо оперировать числами от 150 (например) до 2 000 000 000 (тоже например). Но при этом требование к точности вычислений - 1%. Если подойти к задаче в лоб, то надо обрабатывать 32 бита, хотя 8 бит вполне достаточно.
Я к тому, что можно на лету определять порядки множителей, умножать только мантиссы в пределах заданной точности и восстанавливать порядок для результата.
Таким образом, можно выйграть и в скорости, и в расходе ресурсов, не проигрывая в заданных параметрах точности.
Gate
У меня сложилось впечатление, что любой нормальный синтезатор превратит конструкцию А*Б в lpm_mult (или что-то аналогичное из поддерживаемых вендором библиотек), которую квартус имплементирует наиболее эфф.образом - это для альтеры, для ксайлинкса не знаю. Делать умножитель ручками имхо не имеет смысла. Можно лишь побороться за конвейер для повышения тактовой.
Terminator
...
Цитата(Terminator @ Jan 4 2007, 09:13) *
Симплифи, при соблюдении некоторых условий, синтезирует вполне быстрый умножитель. В квартусе, если надо быстрый, то без lpm_mult не обойтись. Может есть и более удачные варианты, я не встречал.


Забыл написать. Говоря про быстрый умножитель, я имел ввиду умножитель с конвейером.

P. S. почему-то нет кнопочки "изменить" ...
cupertino
Цитата(Terminator @ Jan 5 2007, 05:46) *
...
Цитата(Terminator @ Jan 4 2007, 09:13) *

Симплифи, при соблюдении некоторых условий, синтезирует вполне быстрый умножитель. В квартусе, если надо быстрый, то без lpm_mult не обойтись. Может есть и более удачные варианты, я не встречал.


Забыл написать. Говоря про быстрый умножитель, я имел ввиду умножитель с конвейером.

P. S. почему-то нет кнопочки "изменить" ...


Чтобы Synplify синтезировал умножитель с конвеером, надо в придеденный код добавить регистров на выходе, только тогда Synplify сможет растащить их в промежуточные точки не нарушая логику работы схемы
-=Vitaly=-
Цитата(cupertino @ Jan 5 2007, 09:41) *
Цитата(Terminator @ Jan 5 2007, 05:46) *

...
Цитата(Terminator @ Jan 4 2007, 09:13) *

Симплифи, при соблюдении некоторых условий, синтезирует вполне быстрый умножитель. В квартусе, если надо быстрый, то без lpm_mult не обойтись. Может есть и более удачные варианты, я не встречал.


Забыл написать. Говоря про быстрый умножитель, я имел ввиду умножитель с конвейером.

P. S. почему-то нет кнопочки "изменить" ...


Чтобы Synplify синтезировал умножитель с конвеером, надо в придеденный код добавить регистров на выходе, только тогда Synplify сможет растащить их в промежуточные точки не нарушая логику работы схемы

a14.gif

Если можна с этого места поподробнее. Как добавить регистров Синплифай мог разбросать?? help.gif
Код в студию!!! wink.gif
cupertino
Цитата(-=Vitaly=- @ Jan 5 2007, 10:09) *
Цитата(cupertino @ Jan 5 2007, 09:41) *

Цитата(Terminator @ Jan 5 2007, 05:46) *

...
Цитата(Terminator @ Jan 4 2007, 09:13) *

Симплифи, при соблюдении некоторых условий, синтезирует вполне быстрый умножитель. В квартусе, если надо быстрый, то без lpm_mult не обойтись. Может есть и более удачные варианты, я не встречал.


Забыл написать. Говоря про быстрый умножитель, я имел ввиду умножитель с конвейером.

P. S. почему-то нет кнопочки "изменить" ...


Чтобы Synplify синтезировал умножитель с конвеером, надо в придеденный код добавить регистров на выходе, только тогда Synplify сможет растащить их в промежуточные точки не нарушая логику работы схемы

a14.gif

Если можна с этого места поподробнее. Как добавить регистров Синплифай мог разбросать?? help.gif
Код в студию!!! ;)


Например, для 3-ступенчатого конвеера:

Код
wire [W_A-1:0] a;
wire [W_B-1:0] b;
reg [W_A+W_B-1:0] q0, g1, q;

always @(posedge clock) begin
     q0 <= a * b;
     q1 <= q0;
     q <= q1;
end


и в "Imp Options" -> "Options" разрешить "Pipelining"
-=Vitaly=-
Например, для 3-ступенчатого конвеера:

Код
wire [W_A-1:0] a;
wire [W_B-1:0] b;
reg [W_A+W_B-1:0] q0, g1, q;

always @(posedge clock) begin
     q0 <= a * b;
     q1 <= q0;
     q <= q1;
end



Это точно так делается?? Где про это можно почитать??? Я сделал вашу схему и у меня просто умножитель и триггеры на его выходе. Синплифай в РТЛ схематике должен показывать что он разбросал схему или нет???
ALeksey_ZX
В ise есть файлик xst.pdf с примерами и описанием этих примеров,
а с сайта можно скачать только примеры
ftp://ftp.xilinx.com/pub/documentation/misc/examples_v7.zip

multipliers_3.v -- примир умножителя с конвейром
Gate
Цитата(-=Vitaly=- @ Jan 5 2007, 16:30) *
Это точно так делается?? Где про это можно почитать??? Я сделал вашу схему и у меня просто умножитель и триггеры на его выходе. Синплифай в РТЛ схематике должен показывать что он разбросал схему или нет???

Нежелание или неумение читать документацию становится хронической болезнью начинающих(?) разработчиков. Специально для Вас за 1 минуту поиском слова "multiplier" в "Synplicity FPGA Synthesis User Guide" нашел Chapter 6: Design Optimization. Pipelining. И там все написано angry.gif
А ведь есть еще и Reference guide maniac.gif
-=Vitaly=-
Цитата(Gate @ Jan 6 2007, 02:25) *
Цитата(-=Vitaly=- @ Jan 5 2007, 16:30) *

Это точно так делается?? Где про это можно почитать??? Я сделал вашу схему и у меня просто умножитель и триггеры на его выходе. Синплифай в РТЛ схематике должен показывать что он разбросал схему или нет???

Нежелание или неумение читать документацию становится хронической болезнью начинающих(?) разработчиков. Специально для Вас за 1 минуту поиском слова "multiplier" в "Synplicity FPGA Synthesis User Guide" нашел Chapter 6: Design Optimization. Pipelining. И там все написано angry.gif
А ведь есть еще и Reference guide maniac.gif


Да вы правы.. Стыдно blush.gif
cupertino
Цитата(-=Vitaly=- @ Jan 5 2007, 16:30) *
Например, для 3-ступенчатого конвеера:

Код
wire [W_A-1:0] a;
wire [W_B-1:0] b;
reg [W_A+W_B-1:0] q0, g1, q;

always @(posedge clock) begin
     q0 <= a * b;
     q1 <= q0;
     q <= q1;
end



Это точно так делается?? Где про это можно почитать??? Я сделал вашу схему и у меня просто умножитель и триггеры на его выходе. Синплифай в РТЛ схематике должен показывать что он разбросал схему или нет???


Чтобы заставить Synplify (Synplify Pro или Premier только) прооптимизировать схему его надо прижать - нарисовать желаемую частоту и поставить регистры на входе тоже (т.е. об'явить a и b reg и положить их внутрь always) чтобы он был вынужден уменьшать время между регистрами.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.