Костян 0 2 октября, 2008 Опубликовано 2 октября, 2008 · Жалоба Есть идея реализовать синтезируемый умножитель . Требуется перемножить два целых 16 битных числа в дополнительном коде и получить 16 - битное произведение (корками принципиально не пользуюсь). С самим умножением проблем нету , но как определить знак произведения и выделить из него нужные 16 бит? Буду благодарен за примеры реализации в столбик , на языках hdl(VHDL, Verilog) , советы, литературу. p/s доп вопрос. В Си переменная типа int представлена в памяти в обратном или дополнительном коде ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ClockworkOrange 0 2 октября, 2008 Опубликовано 2 октября, 2008 · Жалоба для верилог достаточно использования квалификатора signed в объявлении переменной. у результата отбрасываете второй знаковый разряд и берёте 16старших бит Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Костян 0 2 октября, 2008 Опубликовано 2 октября, 2008 · Жалоба для верилог достаточно использования квалификатора signed в объявлении переменной. у результата отбрасываете второй знаковый разряд и берёте 16старших бит А любой ли синтезатор поймет такую конструкцию ?? Чуть усложню вопрос. Использую аппаратные умножители xilinx mult18x18. Как с помощью их (включая их как примитив) перемножить такие числа? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 2 октября, 2008 Опубликовано 2 октября, 2008 · Жалоба Есть идея реализовать синтезируемый умножитель . Требуется перемножить два целых 16 битных числа в дополнительном коде и получить 16 - битное произведение (корками принципиально не пользуюсь). С самим умножением проблем нету , но как определить знак произведения и выделить из него нужные 16 бит? Всё уже украдено до нас. Что вы знаете про стандартную библиотеку VHDL? p/s доп вопрос. В Си переменная типа int представлена в памяти в обратном или дополнительном коде ? В C переменные никак не представлены. Представление чисел зависит от платформы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ClockworkOrange 0 2 октября, 2008 Опубликовано 2 октября, 2008 · Жалоба а синтезатор (и маппер?) сам подставит что нужно на место синтезабельной конструкции - либо аппаратные, либо построенные на логике - это в настройках синтезатора задаётся глобально. если вам надо часть на расспухе, а часть - аппаратными - курите мануал по конкретноум ситезатору - это задаётся атрибутами непосредственно в HDL-коде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Костян 0 2 октября, 2008 Опубликовано 2 октября, 2008 · Жалоба Всё уже украдено до нас. Что вы знаете про стандартную библиотеку VHDL? Не нужны мне библиотечные функции. охота все ручками написать, для понимания физики процесса. В C переменные никак не представлены. Представление чисел зависит от платформы. Пасиб, ответ понятен. если вам надо часть на расспухе, а часть - аппаратными - курите мануал по конкретноум ситезатору - это задаётся атрибутами непосредственно в HDL-коде. Ок. мне это известно. Вообще поспешил с вопросом. В доках четко прописано , что Mult18х18 от хилых выполняет знаковое умножение (думал что безнаковое). Хотя все же интересно, как собрать на лог элементах знаковый умножитель, используя безнаковые. Например есть уже написанный на рассыпухе безнаковый умножитель вида 18*18 , как сделать на нем знаковое умножение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 2 октября, 2008 Опубликовано 2 октября, 2008 · Жалоба для верилог достаточно использования квалификатора 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ClockworkOrange 0 2 октября, 2008 Опубликовано 2 октября, 2008 · Жалоба sazh об этом знает синтезатор (если ему сказать) может быть всёже вы имели в виду это: assign sum_result = {{16{data_a[15]}}, data_a} + {{16{data_b[15]}}, data_b}; ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 2 октября, 2008 Опубликовано 2 октября, 2008 · Жалоба ? Что написано пером, не вырубить топором. Пусть * остается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Doka 4 2 октября, 2008 Опубликовано 2 октября, 2008 · Жалоба так рекомендует писать 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Костян 0 2 октября, 2008 Опубликовано 2 октября, 2008 · Жалоба Не нужны мне библиотечные функции. охота все ручками написать, для понимания физики процесса. Эх погорячился. Вот что у меня вышло. ИМХО кратко и красиво. ---------------------------------------------------------------------------------- ---------------------------------------------------------------------------------- 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; После раскладки в кристале это все влезло в два дсп слайса , что и хотелось. Поправляйте и дополняйте что не так. Со стандартными библиотеками опыт работы небольшой. По верилогу. Пасиб за примеры, сейчас разберусь об этом знает синтезатор (если ему сказать) А можно пример ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Doka 4 2 октября, 2008 Опубликовано 2 октября, 2008 · Жалоба оттуда же: 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ClockworkOrange 0 2 октября, 2008 Опубликовано 2 октября, 2008 · Жалоба >> об этом знает синтезатор (если ему сказать) А можно пример ? ок. повторюсь: для верилог достаточно использования квалификатора signed в объявлении переменной. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 2 октября, 2008 Опубликовано 2 октября, 2008 · Жалоба так рекомендует писать 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 не получился? Хотелось бы по сути что нибудь услышать. Ну типа синтезатор напрочь отказывается в мегафункцию или в блок умножителя встроить и моделирование с ошибками идет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Doka 4 2 октября, 2008 Опубликовано 2 октября, 2008 · Жалоба sazh а в качестве аргумантов там предлагается сравнить использование ресурсов при Bad и при Good. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться