Перейти к содержанию
    

Умножитель в дополнительном коде.

Есть идея реализовать синтезируемый умножитель . Требуется перемножить два целых 16 битных числа в дополнительном коде и получить 16 - битное произведение (корками принципиально не пользуюсь).

С самим умножением проблем нету , но как определить знак произведения и выделить из него нужные 16 бит?

 

Буду благодарен за примеры реализации в столбик , на языках hdl(VHDL, Verilog) , советы, литературу.

 

 

p/s доп вопрос. В Си переменная типа int представлена в памяти в обратном или дополнительном коде ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

для верилог достаточно использования квалификатора signed в объявлении переменной.

 

у результата отбрасываете второй знаковый разряд и берёте 16старших бит

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

для верилог достаточно использования квалификатора signed в объявлении переменной.

 

у результата отбрасываете второй знаковый разряд и берёте 16старших бит

А любой ли синтезатор поймет такую конструкцию ??

 

 

Чуть усложню вопрос. Использую аппаратные умножители xilinx mult18x18. Как с помощью их (включая их как примитив) перемножить такие числа?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть идея реализовать синтезируемый умножитель . Требуется перемножить два целых 16 битных числа в дополнительном коде и получить 16 - битное произведение (корками принципиально не пользуюсь).

С самим умножением проблем нету , но как определить знак произведения и выделить из него нужные 16 бит?

Всё уже украдено до нас. Что вы знаете про стандартную библиотеку VHDL?

 

p/s доп вопрос. В Си переменная типа int представлена в памяти в обратном или дополнительном коде ?
В C переменные никак не представлены. Представление чисел зависит от платформы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

если вам надо часть на расспухе, а часть - аппаратными - курите мануал по конкретноум ситезатору - это задаётся атрибутами непосредственно в HDL-коде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всё уже украдено до нас. Что вы знаете про стандартную библиотеку VHDL?

Не нужны мне библиотечные функции. охота все ручками написать, для понимания физики процесса.

 

В C переменные никак не представлены. Представление чисел зависит от платформы.

Пасиб, ответ понятен.

 

если вам надо часть на расспухе, а часть - аппаратными - курите мануал по конкретноум ситезатору - это задаётся атрибутами непосредственно в HDL-коде.

Ок. мне это известно.

 

Вообще поспешил с вопросом. В доках четко прописано , что Mult18х18 от хилых выполняет знаковое умножение (думал что безнаковое).

 

Хотя все же интересно, как собрать на лог элементах знаковый умножитель, используя безнаковые. Например есть уже написанный на рассыпухе безнаковый умножитель вида 18*18 , как сделать на нем знаковое умножение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

для верилог достаточно использования квалификатора signed в объявлении переменной.

 

у результата отбрасываете второй знаковый разряд и берёте 16старших бит

 

(Откуда умножитель о числах со знаком или без знака знает?)

А пример. Вроде бы просто все. В общем случае.

module mul_signed
(
input  [15:0] data_a,      // signed
input  [15:0] data_b,      // signed
output [31:0] mult_result // signed
);

assign mult_result = {{16{data_a[15]}}, data_a} * {{16{data_b[15]}}, data_b};

endmodule

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

sazh

 

об этом знает синтезатор (если ему сказать)

 

может быть всёже вы имели в виду это:

assign sum_result = {{16{data_a[15]}}, data_a} + {{16{data_b[15]}}, data_b};

?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

так рекомендует писать Synopsys в своём "Coding Guidelines for Datapath Synthesis" :

Bad QoR

 input   [7:0] a, b;
output [15:0] z;

// a, b sign-extended to width of z
assign z = {{8{a[7]}}, a[7:0]} *  {{8{b[7]}}, b[7:0]};
// -> unsigned 16x16=16 bit multiply

 

Good QoR

input  signed  [7:0] a, b;
output signed [15:0] z;

assign z = a * b;
// -> signed 8x8=16 bit multiply

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не нужны мне библиотечные функции. охота все ручками написать, для понимания физики процесса.

Эх погорячился. Вот что у меня вышло. ИМХО кратко и красиво.

----------------------------------------------------------------------------------
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_SIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
-- library UNISIM;
-- use UNISIM.VComponents.all;

entity kuku is
    Port ( clk     : in  STD_LOGIC;
           d1 : in  STD_LOGIC_VECTOR (11 downto 0);
           d2 : in  STD_LOGIC_VECTOR (11 downto 0);
           a    : in  STD_LOGIC_VECTOR (15 downto 0);
           b    : in  STD_LOGIC_VECTOR (15 downto 0);           
           d1 : out STD_LOGIC_VECTOR (15 downto 0);
           d2 : out STD_LOGIC_VECTOR (15 downto 0)           
        );

attribute mult_style: string;
attribute mult_style of aiqb: entity is "auto";        
        
end kuku;

architecture Behavioral of kuku is

signal mult          : std_logic_vector (15 downto 0);

begin
  

process (clk) 
variable temp: integer;
begin 
   if clk='1' and clk'event then
        temp := CONV_INTEGER(d2) * CONV_INTEGER(a) - CONV_INTEGER(d1) * CONV_INTEGER(b);
        mult <= CONV_STD_LOGIC_VECTOR(temp, 16);
   end if;
end process;  


  
  d2 <= mult (15 downto 0);
  d1 <= d1 & X"0";

end Behavioral;

После раскладки в кристале это все влезло в два дсп слайса , что и хотелось.

 

Поправляйте и дополняйте что не так. Со стандартными библиотеками опыт работы небольшой.

 

 

 

 

По верилогу. Пасиб за примеры, сейчас разберусь

 

об этом знает синтезатор (если ему сказать)

А можно пример ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

оттуда же:

o    Rule: Use type 'signed' (VHDL, Verilog 2001) for signed/2's complement arithmetic (that is, do not emulate signed arithmetic using unsigned operands/operations). Also, do not use the 'integer' type except for constant values. 
o    Rule: Do not manually sign-/zero-extend operands if possible. 
o    Rule: Do not mix unsigned and signed types in one expression.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

>> об этом знает синтезатор (если ему сказать)

 

А можно пример ?

ок. повторюсь:

для верилог достаточно использования квалификатора signed в объявлении переменной.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

так рекомендует писать Synopsys в своём "Coding Guidelines for Datapath Synthesis" :

Bad QoR

 input   [7:0] a, b;
// a, b sign-extended to width of z
assign z = {{8{a[7]}}, a[7:0]} *  {{8{b[7]}}, b[7:0]};
// -> unsigned 16x16=16 bit multiply

// -> signed 8x8=16 bit multiply [/code]

 

И где логика. Размножить знак и потом сказать что при умножении unsigned не получился?

Хотелось бы по сути что нибудь услышать. Ну типа синтезатор напрочь отказывается в мегафункцию или в блок умножителя встроить и моделирование с ошибками идет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

sazh

 

а в качестве аргумантов там предлагается сравнить использование ресурсов при Bad и при Good.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...