МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
/
Лабораторна робота №2
з дисципліни "Основи проектування цифрових засобів на ПЛІС"
Тема: Розробка спеціалізованого перемножувача.
Мета: Проектування та перевірка роботи перемножувача двійкових чисел та спеціалізованого перемножувача на константу.
На цій схемі зображені всі модулі у такому порядку: перемножувач цілих чисел з послідовним додаванням часткових добутків, перемножувач цілих чисел з паралельним додаванням часткових добутків, перемножувач цілих чисел реалізований генератором ядер, оптимізований перемножувач на константу, неоптимізований перемножувач на константу, перемножувач на константу реалізований генератором ядер. Наступні два малюнки – це функціональна та технологічна схема початкової схеми.
/
Рис. 1. Реалізована схема.
/
Рис. 2. Функціональна схема.
/
Рис. 3. Технологічна схема.
/
Рис. 4. Вхідні сигнали.
Частина №1
Перемножувач цілих чисел з послідовним додаванням часткових добутків.
Module1.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity Module1 is
Port ( GVV_A : in STD_LOGIC_VECTOR (7 downto 0);
GVV_B : in STD_LOGIC_VECTOR (7 downto 0);
GVV_PROD : out STD_LOGIC_VECTOR (15 downto 0));
end Module1;
architecture Behavioral of Module1 is
constant WIDTH: integer:=8;
signal gvv_ua, gvv_bv0, gvv_bv1, gvv_bv2, gvv_bv3, gvv_bv4, gvv_bv5, gvv_bv6, gvv_bv7 : unsigned (WIDTH - 1 downto 0);
signal gvv_p, gvv_p0, gvv_p1, gvv_p2, gvv_p3, gvv_p4, gvv_p5, gvv_p6, gvv_p7 : unsigned (2*WIDTH - 1 downto 0);
begin
gvv_ua <= unsigned (GVV_A);
gvv_bv0 <= (others => GVV_B(0));
gvv_bv1 <= (others => GVV_B(1));
gvv_bv2 <= (others => GVV_B(2));
gvv_bv3 <= (others => GVV_B(3));
gvv_bv4 <= (others => GVV_B(4));
gvv_bv5 <= (others => GVV_B(5));
gvv_bv6 <= (others => GVV_B(6));
gvv_bv7 <= (others => GVV_B(7));
gvv_p0 <= "00000000" & (gvv_bv0 and gvv_ua);
gvv_p1 <= "0000000" & (gvv_bv1 and gvv_ua) & "0";
gvv_p2 <= "000000" & (gvv_bv2 and gvv_ua) & "00";
gvv_p3 <= "00000" & (gvv_bv3 and gvv_ua) & "000";
gvv_p4 <= "0000" & (gvv_bv4 and gvv_ua) & "0000";
gvv_p5 <= "000" & (gvv_bv5 and gvv_ua) & "00000";
gvv_p6 <= "00" & (gvv_bv6 and gvv_ua) & "000000";
gvv_p7 <= "0" & (gvv_bv7 and gvv_ua) & "0000000";
gvv_p <=((gvv_p0+gvv_p1)+(gvv_p2+gvv_p3))+((gvv_p4+gvv_p5)+(gvv_p6+gvv_p7));
GVV_PROD<= std_logic_vector (gvv_p);
end Behavioral;
/
Рис. 5. Часова діаграма, послідовний перемножувач.
Звіт для Module1
Synthesizing Unit <Module1>.
Related source file is "D:/WebPack Xilinx/lab2/Module1.vhd".
Found 16-bit adder for signal <gvv_p>.
Found 16-bit adder for signal <gvv_p$addsub0000> created at line 64.
Found 16-bit adder for signal <gvv_p$addsub0001> created at line 64.
Found 16-bit adder for signal <gvv_p$addsub0002> created at line 64.
Found 16-bit adder for signal <gvv_p$addsub0003> created at line 64.
Found 16-bit adder for signal <gvv_p$addsub0004> created at line 64.
Found 16-bit adder for signal <gvv_p$addsub0005> created at line 64.
Summary:
inferred 7 Adder/Subtractor(s).
Unit <Module1> synthesized.
=========================================================================
* Final Report *
=========================================================================
Final Results
RTL Top Level Output File Name : Module1.ngr
Top Level Output File Name : Module1
Output Format : NGC
Optimization Goal : Speed
Keep Hierarchy : No
Design Statistics
# IOs : 32
Cell Usage :
# BELS : 199
# GND : 1
# LUT1 : 5
# LUT2 : 37
# LUT3 : 1
# LUT4 : 46
# MULT_AND : 14
# MUXCY : 46
# XORCY : 49
# IO Buffers : 32
# IBUF : 16
# OBUF : 16
Device utilization summary:
---------------------------
Selected Device : 4vlx15sf363-12
Number of Slices: 49 out of 6144 0%
Number of 4 input LUTs: 89 out of 12288 0%
Number of IOs: 32
Number of bonded IOBs: 32 out of 240 13%
Timing constraint: Default path analysis
Total number of paths / destination ports: 43772 / 16
-------------------------------------------------------------------------
Delay: 8.861ns (Levels of Logic = 21)
Total 8.861ns (6.556ns logic, 2.305ns route)
(74.0% logic, 26.0% route)
Total REAL time to Xst completion: 45.00 secs
Total CPU time to Xst completion: 45.44 secs
Total memory usage is 291412 kilobytes
Перемножувач цілих чисел з паралельним додаванням часткових добутків.
Module2.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity Module2 is
Port ( GVV_A : in STD_LOGIC_VECTOR (7 downto 0);
GVV_B : in STD_LOGIC_VECTOR (7 downto 0);
GVV_mPROD : out STD_LOGIC_VECTOR (15 downto 0));
end Module2;
architecture Behavioral of Module2 is
constant WIDTH: integer:=8;
signal gvv_ua, gvv_bv0, gvv_bv1, gvv_bv2, gvv_bv3, gvv_bv4, gvv_bv5, gvv_bv6, gvv_bv7 : unsigned (WIDTH - 1 downto 0);
signal gvv_p0, gvv_p1, gvv_p2, gvv_p3, gvv_p4, gvv_p5, gvv_p6, gvv_p7: unsigned (WIDTH downto 0);
signal gvv_product: unsigned (2*WIDTH - 1 downto 0);
begin
gvv_ua <= unsigned (GVV_A);
gvv_bv0 <= (others => GVV_B(0));
gvv_bv1 <= (others => GVV_B(1));
gvv_bv2 <= (others => GVV_B(2));
gvv_bv3 <= (others => GVV_B(3));
gvv_bv4 <= (others => GVV_B(4));
gvv_bv5 <= (others => GVV_B(5));
gvv_bv6 <= (others => GVV_B(6));
gvv_bv7 <= (others => GVV_B(7));
gvv_p0 <= "0" & (gvv_bv0 and gvv_ua);
gvv_p1 <= ("0" & gvv_p0(WIDTH DOWNTO 1)) + ("0" & (gvv_bv1 and gvv_ua));
gvv_p2 <= ("0" & gvv_p1(WIDTH DOWNTO 1)) + ("0" & (gvv_bv2 and gvv_ua));
gvv_p3 <= ("0" & gvv_p2(WIDTH DOWNTO 1)) + ("0" & (gvv_bv3 and gvv_ua));
gvv_p4 <= ("0" & gvv_p3(WIDTH DOWNTO 1)) + ("0" & (gvv_bv4 and gvv_ua));
gvv_p5 <= ("0" & gvv_p4(WIDTH DOWNTO 1)) + ("0" & (gvv_bv5 and gvv_ua));
gvv_p6 <= ("0" & gvv_p5(WIDTH DOWNTO 1)) + ("0" & (gvv_bv6 and gvv_ua));
gvv_p7 <= ("0" & gvv_p6(WIDTH DOWNTO 1)) + ("0" & (gvv_bv7 and gvv_ua));
gvv_product <= gvv_p7 & gvv_p6(0) & gvv_p5(0)& gvv_p4(0)& gvv_p3(0)& gvv_p2(0)& gvv_p1(0)& gvv_p0(0);
GVV_mPROD <= std_logic_vector (gvv_product);
end Behavioral;
/
Рис. 6. Часова діаграма, паралельний перемножувач.
Звіт для Module2
Synthesizing Unit <Module2>.
Related source file is "D:/WebPack Xilinx/lab2/Module2.vhd".
Found 9-bit adder for signal <gvv_p1>.
Found 9-bit adder for signal <gvv_p2>.
Found 9-bit adder for signal <gvv_p3>.
Found 9-bit adder for signal <gvv_p4>.
Found 9-bit adder for signal <gvv_p5>.
Found 9-bit adder for signal <gvv_p6>.
Found 9-bit adder for signal <gvv_p7>.
Summary:
inferred 7 Adder/Subtractor(s).
Unit <Module2> synthesized.
=========================================================================
* Final Report *
=========================================================================
Final Results
RTL Top Level Output File Name : Module2.ngr
Top Level Output File Name : Module2
Output Format : NGC
Optimization Goal : Speed
Keep Hierarchy : No
Design Statistics
# IOs : 32
Cell Usage :
# BELS : 177
# GND : 1
# LUT2 : 2
# LUT3 : 48
# LUT4 : 7
# MULT_AND : 7
# MUXCY : 56
# XORCY : 56
# IO Buffers : 32
# IBUF : 16
# OBUF : 16
=========================================================================
Device utilization summary:
---------------------------
Selected Device : 4vlx15sf363-12
Number of Slices: 29 out of 6144 0%
Number of 4 input LUTs: 57 out of 12288 0%
Number of IOs: 32
Number of bonded IOBs: 32 out of 240 13%
Total REAL time to Xst completion: 34.00 secs
Total CPU time to Xst completion: 34.02 secs
Total memory usage is 337760 kilobytes
Total 13.073ns (9.106ns logic, 3.967ns route)
(69.7% logic, 30.3% route)
Перемножувач цілих чисел. Генератор ядер.
/
Рис. 7. Часова діаграма, результат роботи генератора ядер.
Порівняння
Після аналізу звітів можна визначити, що перемножувач цілих чисел з послідовним додаванням часткових добутків є ефективнішим, ніж перемножувач цілих чисел з паралельним додаванням часткових добутків. Ці два варіанти використувують по 7 суматорів. Здавалося би ефективніший варіант використовує 9-бітні суматори, а менш ефективніший використовує 16-бітні суматори, що є більш дорожчим варіантом. Проте перемножувач цілих чисел з послідовним додаванням часткових добутків використовує такі елементи і їх кількість: BELS – 199, GND – 1, LUT1 – 5, LUT2 – 37, LUT3 – 1, LUT4 – 46, MULT_AND –14, MUXCY – 46, XORCY – 49, IO Buffers – 32, IBUF – 16, OBUF – 16. Його затримка складає 8.861 ns та використовує 291412 кілобайтів пам’яті. Перемножувач цілих чисел з паралельним додаванням часткових добутків використовує такі елементи і їх кількість: BELS – 177, GND – 1, LUT2 – 2, LUT3 – 48, LUT4 – 7, MULT_AND –7, MUXCY – 56, XORCY – 59, IO Buffers – 32, IBUF – 16, OBUF – 16. Його затримка складає 13.073 ns та використовує 337760 кілобайтів пам’яті. Отже, не зважаючи на те, що перший варіант використовує більш розрядні суматори він є кращим, тому що використовує менше елементів, пам’яті та має меншу затримку.
Частина №2
/
/
Рис. 8. Переведення виразу у нормальне число.
/
Рис. 9. Переведення числа у двійкове представлення.
Переведемо дробову частину у 10 СЧ:
011111010110010011110000001000012 = 210376707310
Оптимізація
Початковий вираз: 01111101011001001111000000100001
1 крок: 01111101011001010001000000100001
2 крок: 10000101011001010001000000100001
Для неоптимізованого варіанту наше число запишемо таким чиному у коді:
gvv_prod <= (gvv_p0 + gvv_p5 + gvv_p12 + gvv_p13 + gvv_p14 + gvv_p15 + gvv_p18 + gvv_p21 + gvv_p22 + gvv_p24 + gvv_p26 + gvv_p27 + gvv_p28 + gvv_p29 + gvv_p30);
Для оптимізованого варіанту наше число запишемо таким чиному у коді:gvv_prod <= (gvv_p0 + gvv_p5 + gvv_p16 + gvv_p18 + gvv_p21 + gvv_p22 + gvv_p24 + gvv_p31) - gvv_p12 - gvv_p26;
/
Рис. 10. Часова діаграма неоптимізованого варіанту та оптимізованого варіанту.
Звіт для неоптимізованого варіанту
Summary:
# Adders/Subtractors : 14
40-bit adder : 14
* Final Report *
=========================================================================
Final Results
RTL Top Level Output File Name : NotOptimized.ngr
Top Level Output File Name : NotOptimized
Output Format : NGC
Optimization Goal : Speed
Keep Hierarchy : No
Design Statistics
# IOs : 48
Cell Usage :
# BELS : 240
# GND : 1
# LUT1 : 3
# LUT2 : 17
# LUT3 : 48
# LUT4 : 54
# MULT_AND : 9
# MUXCY : 51
# XORCY : 57
# IO Buffers : 48
# IBUF : 8
# OBUF : 40
Device utilization summary:
---------------------------
Selected Device : 4vlx15sf363-12
Number of Slices: 72 out of 6144 1%
Number of 4 input LUTs: 122 out of 12288 0%
Number of IOs: 48
Number of bonded IOBs: 48 out of 240 20%
Delay: 19.539ns (Levels of Logic = 41)
Total 19.539ns (10.267ns logic, 9.272ns route)
(52.5% logic, 47.5% route)
Total REAL time to Xst completion: 42.00 secs
Total CPU time to Xst completion: 41.19 secs
Total memory usage is 293332 kilobytes
Код для неоптимізованого варіанту
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity NotOptimized is
Port ( GVV_A : in STD_LOGIC_VECTOR (7 downto 0);
GVV_C_M : out STD_LOGIC_VECTOR (39 downto 0));
end NotOptimized;
architecture Behavioral of NotOptimized is
signal gvv_prod,gvv_p30,gvv_p29,gvv_p28,gvv_p27,gvv_p26,gvv_p24,gvv_p23,gvv_p22,gvv_p21,gvv_p20,gvv_p19,gvv_p18,gvv_p17,gvv_p16,gvv_p15,gvv_p14,gvv_p13,gvv_p12,gvv_p11,gvv_p9,gvv_p7,gvv_p5,gvv_p2,gvv_p1,gvv_p0:unsigned(39 downto 0);
begin
gvv_p0 <= "00000000000000000000000000000000" & unsigned(GVV_A);
gvv_p1 <= "0000000000000000000000000000000" & unsigned(GVV_A) & "0";
gvv_p2 <= "000000000000000000000000000000" & unsigned(GVV_A) & "00";
--gvv_p3 <= "00000000000000000000000000000" & unsigned(GVV_A) & "000";
--gvv_p4 <= "0000000000000000000000000000" & unsigned(GVV_A) & "0000";
gvv_p5 <= "000000000000000000000000000" & unsigned(GVV_A) & "00000";
--gvv_p6 <= "00000000000000000000000000" & unsigned(GVV_A) & "000000";
gvv_p7 <= "0000000000000000000000000" & unsigned(GVV_A) & "0000000";
--gvv_p8 <= "000000000000000000000000" & unsigned(GVV_A) & "00000000";
gvv_p9 <= "00000000000000000000000" & unsigned(GVV_A) & "000000000";
--gvv_p10 <= "0000000000000000000000" & unsigned(GVV_A) & "0000000000";
gvv_p11 <= "000000000000000000000" & unsigned(GVV_A) & "00000000000";
gvv_p12 <= "00000000000000000000" & unsigned(GVV_A) & "000000000000";
gvv_p13 <= "0000000000000000000" & unsigned(GVV_A) & "0000000000000";
gvv_p14 <= "000000000000000000" & unsigned(GVV_A) & "00000000000000";
gvv_p15 <= "00000000000000000" & unsigned(GVV_A) & "000000000000000";
gvv_p16 <= "0000000000000000" & unsigned(GVV_A) & "0000000000000000";
gvv_p17 <= "000000000000000" & unsigned(GVV_A) & "00000000000000000";
gvv_p18 <= "00000000000000" & unsigned(GVV_A) & "000000000000000000";
gvv_p19 <= "0000000000000" & unsigned(GVV_A) & "0000000000000000000";
gvv_p20 <= "000000000000" & unsigned(GVV_A) & "00000000000000000000";
gvv_p21 <= "00000000000" & unsigned(GVV_A) & "000000000000000000000";
gvv_p22 <= "0000000000" & unsigned(GVV_A) & "0000000000000000000000";
gvv_p23 <= "000000000" & unsigned(GVV_A) & "00000000000000000000000";
gvv_p24 <= "00000000" & unsigned(GVV_A) & "000000000000000000000000";
--gvv_p25 <= "0000000" & unsigned(GVV_A) & "0000000000000000000000000";
gvv_p26 <= "000000" & unsigned(GVV_A) & "00000000000000000000000000";
gvv_p27 <= "00000" & unsigned(GVV_A) & "000000000000000000000000000";
gvv_p28 <= "0000" & unsigned(GVV_A) & "0000000000000000000000000000";
gvv_p29 <= "000" & unsigned(GVV_A) & "00000000000000000000000000000";
gvv_p30 <= "00" & unsigned(GVV_A) & "000000000000000000000000000000";
--gvv_p31 <= "0" & unsigned(GVV_A) & "0000000000000000000000000000000";
gvv_prod <= (gvv_p0+gvv_p5+gvv_p12+gvv_p13+gvv_p14+gvv_p15+gvv_p18+gvv_p21+gvv_p22+gvv_p24+gvv_p26+gvv_p27+gvv_p28+gvv_p29+gvv_p30);
GVV_C_M <= std_logic_vector (gvv_prod);
end Behavioral;
Звіт для оптимізованого варіанту
# Adders/Subtractors : 9
40-bit adder : 7
40-bit subtractor : 2
=========================================================================
* Final Report *
=========================================================================
Final Results
RTL Top Level Output File Name : Optimized.ngr
Top Level Output File Name : Optimized
Output Format : NGC
Optimization Goal : Speed
Keep Hierarchy : No
Design Statistics
# IOs : 48
Cell Usage :
# BELS : 323
# GND : 1
# INV : 28
# LUT1 : 29
# LUT2 : 24
# LUT3 : 12
# LUT4 : 32
# MULT_AND : 8
# MUXCY : 85
# MUXF5 : 1
# VCC : 1
# XORCY : 102
# IO Buffers : 48
# IBUF : 8
# OBUF : 40
=========================================================================
Device utilization summary:
---------------------------
Selected Device : 4vlx15sf363-12
Number of Slices: 67 out of 6144 1%
Number of 4 input LUTs: 125 out of 12288 1%
Number of IOs: 48
Number of bonded IOBs: 48 out of 240 20%
Delay: 13.083ns (Levels of Logic = 22)
Total 13.083ns (8.252ns logic, 4.831ns route)
(63.1% logic, 36.9% route)
Total REAL time to Xst completion: 30.00 secs
Total CPU time to Xst completion: 30.27 secs
Total memory usage is 340000 kilobytes
Код для оптимізованого варіанту
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;
-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity Optimized is
Port ( GVV_A : in STD_LOGIC_VECTOR (7 downto 0);
GVV_Opt : out STD_LOGIC_VECTOR (39 downto 0));
end Optimized;
architecture Behavioral of Optimized is
signal gvv_prod, gvv_p31, gvv_p30,gvv_p29,gvv_p28,gvv_p27,gvv_p26,gvv_p24,gvv_p23,gvv_p22,gvv_p21,gvv_p20,gvv_p19,gvv_p18,gvv_p17,gvv_p16,gvv_p15,gvv_p14,gvv_p13,gvv_p12,gvv_p11,gvv_p9,gvv_p7,gvv_p5,gvv_p2,gvv_p1,gvv_p0:unsigned(39 downto 0);
begin
gvv_p0 <= "00000000000000000000000000000000" & unsigned(GVV_A);
--gvv_p1 <= "0000000000000000000000000000000" & unsigned(GVV_A) & "0";
--gvv_p2 <= "000000000000000000000000000000" & unsigned(GVV_A) & "00";
gvv_p3 <= "00000000000000000000000000000" & unsigned(GVV_A) & "000";
--gvv_p4 <= "0000000000000000000000000000" & unsigned(GVV_A) & "0000";
gvv_p5 <= "000000000000000000000000000" & unsigned(GVV_A) & "00000";
--gvv_p6 <= "00000000000000000000000000" & unsigned(GVV_A) & "000000";
gvv_p7 <= "0000000000000000000000000" & unsigned(GVV_A) & "0000000";
--gvv_p8 <= "000000000000000000000000" & unsigned(GVV_A) & "00000000";
gvv_p9 <= "00000000000000000000000" & unsigned(GVV_A) & "000000000";
--gvv_p10 <= "0000000000000000000000" & unsigned(GVV_A) & "0000000000";
gvv_p11 <= "000000000000000000000" & unsigned(GVV_A) & "00000000000";
gvv_p12 <= "00000000000000000000" & unsigned(GVV_A) & "000000000000";
--gvv_p13 <= "0000000000000000000" & unsigned(GVV_A) & "0000000000000";
gvv_p14 <= "000000000000000000" & unsigned(GVV_A) & "00000000000000";
--gvv_p15 <= "00000000000000000" & unsigned(GVV_A) & "000000000000000";
gvv_p16 <= "0000000000000000" & unsigned(GVV_A) & "0000000000000000";
--gvv_p17 <= "000000000000000" & unsigned(GVV_A) & "00000000000000000";
gvv_p18 <= "00000000000000" & unsigned(GVV_A) & "000000000000000000";
--gvv_p19 <= "0000000000000" & unsigned(GVV_A) & "0000000000000000000";
--gvv_p20 <= "000000000000" & unsigned(GVV_A) & "00000000000000000000";
gvv_p21 <= "00000000000" & unsigned(GVV_A) & "000000000000000000000";
gvv_p22 <= "0000000000" & unsigned(GVV_A) & "0000000000000000000000";
--gvv_p23 <= "000000000" & unsigned(GVV_A) & "00000000000000000000000";
gvv_p24 <= "00000000" & unsigned(GVV_A) & "000000000000000000000000";
gvv_p25 <= "0000000" & unsigned(GVV_A) & "0000000000000000000000000";
gvv_p26 <= "000000" & unsigned(GVV_A) & "00000000000000000000000000";
--gvv_p27 <= "00000" & unsigned(GVV_A) & "000000000000000000000000000";
--gvv_p28 <= "0000" & unsigned(GVV_A) & "0000000000000000000000000000";
--gvv_p29 <= "000" & unsigned(GVV_A) & "00000000000000000000000000000";
--gvv_p30 <= "00" & unsigned(GVV_A) & "000000000000000000000000000000";
gvv_p31 <= "0" & unsigned(GVV_A) & "0000000000000000000000000000000";
gvv_prod <= (gvv_p31+gvv_p24+gvv_p22+gvv_p21+gvv_p18+gvv_p16+gvv_p5+gvv_p0)-gvv_p26-gvv_p12;
GVV_Opt <= std_logic_vector (gvv_prod);
end Behavioral;
Порівняння
Після аналізу звітів можна визначити, що перемножувач з оптимізованою константою є набагато ефективнішим, ніж перемножувач з неоптимізованою константою. Ці два варіанти використувують 40-бітні суматори і віднімачі, проте відрізняються у кількості. Неоптимізований варіант використовує 21 елементів, а оптимізований 11, що є у два рази ефективніше, а це видно по затримці – у неоптимізованого варіанту 19.5 нс, а у оптимізованого – 13 нс.
Висновок
На цій лабораторній роботі я займався розробкою спеціалізованого перемножувача. Проаналізував роботу перемножувачів цілих чисел з послідовним та паралельним додаванням часткових добутків, визначив кращий варіант. Реалізував множення на константу, провів мінімізацію константи та досягнув оптимізації перемноженні у 2 рази.