Частина тексту файла (без зображень, графіків і формул):
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
/
Кафедра ЕОМ
Звіт з лабораторної роботи №3
з дисципліни «Основи проектування цифрових засобів на ПЛІС»
на тему:
«Розробка спеціалізованого перемножувача»
Тема: Розробка спеціалізованого перемножувача.
Мета роботи: Проектування та перевірка спеціалізованого перемножувача на константу.
Постановка задачі:
Розробити спеціалізований перемножувач на константу.
Покроковий опис кожного етапу оптимізації
За варіантом, наша константа рівна:
/
Обраховуєм та переводимо у двійкову систему числення(32 біти, з яких першим є «0»):
/ /
Переведемо дробову частину в десяткову систему числення:
0 110 0011 0011 0010 0100 1110 1001 10112= 166424130710
Оптимізуємо наш вираз:
0 110 0011 0011 0010 0100 1110 1001 10112
Крок1: 110112 заміняємо на 1001012 (27 на 32-5):
0 110 0011 0011 0010 0100 1110 1010 01012
Крок2: 111012 заміняємо на 1000112 (29 на 32-3):
0 110 0011 0011 0010 0101 0001 1010 01012
Отже, в оптимізованому варіанті буде на 2 одиниці менше
Підкресленні одинички ми будемо віднімати.
У неоптимізованого варіанту у VHDL коді число буде таким:
kiv_prod <= (kiv_p0 + kiv_p1 + kiv_p3 + kiv_p4 + kiv_p7 + kiv_p9 + kiv_p10 + kiv_p11 + kiv_p14 + kiv_p17 + kiv_p20 + kiv_p21 + kiv_p24 +kiv_p25 + kiv_p29 + kiv_p30);
У оптимізованого варіанту у VHDL коді число буде таким:kiv_prod <= (kiv_p5 +kiv_p12 + kiv_p14 + kiv_p17 + kiv_p20 + kiv_p21+ kiv_p24 +kiv_p25 + kiv_p29 + kiv_p30) - kiv_p0 -kiv_p2- kiv_p7 - kiv_p8;
Перевірку зробимо під час побудови діаграм, зрівнявши 1 і 2 спосіб(оптимізований та неоптимізований) з 3 способом ( IP – ядро) в якому константа вже задана.
Vhdl код реалізації оптимального множення на константу
Розглянемо тільки оптимальний варіант множення
/Результат синтезу схеми
HDL Synthesis Report
Macro Statistics
# Adders/Subtractors : 28
40-bit adder : 24
40-bit subtractor : 4
=========================================================================
* Final Report *
=========================================================================
Final Results
RTL Top Level Output File Name : kiv_sw.ngr
Top Level Output File Name : kiv_sw
Output Format : NGC
Optimization Goal : Speed
Keep Hierarchy : No
Design Statistics
# IOs : 127
Cell Usage :
# BELS : 890
# GND : 1
# INV : 107
# LUT1 : 18
# LUT2 : 64
# LUT3 : 69
# LUT4 : 96
# MULT_AND : 27
# MUXCY : 245
# MUXF5 : 2
# VCC : 1
# XORCY : 260
# IO Buffers : 127
# IBUF : 8
# OBUF : 119
=========================================================================
Device utilization summary:
Number of Slices: 244 out of 6144 3%
Number of 4 input LUTs: 354 out of 12288 2%
Number of IOs: 127
Number of bonded IOBs: 127 out of 240 52%
---------------------------
Partition Resource Summary:
Delay: 22.234ns (Levels of Logic = 53)
Total 22.234ns (11.634ns logic, 10.600ns route)
(52.3% logic, 47.7% route)
Total REAL time to Xst completion: 33.00 secs
Total CPU time to Xst completion: 33.57 secs
Результат синтезу схеми перемножувача розробленого на основі ip-core
Створюємо IP- ядро та вибираємо розподілену пам’ять
/
Формуємо звіт:
Timing Details:
----------------------------------------
Total 2.172ns (0.892ns logic, 1.280ns route)
(41.1% logic, 58.9% route)
Total REAL time to Xst completion: 14.00 secs
Total CPU time to Xst completion: 13.54 secs
-->
Total memory usage is 427100 kilobytes
Number of errors : 0 ( 0 filtered)
Number of warnings : 0 ( 0 filtered)
Number of infos : 0 ( 0 filtered)
Vhdl код тестового стенду
Код аналогічний коду з л.р. №2
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
LIBRARY UNISIM;
USE UNISIM.Vcomponents.ALL;
ENTITY kiv_sw_kiv_sw_sch_tb IS
END kiv_sw_kiv_sw_sch_tb;
ARCHITECTURE behavioral OF kiv_sw_kiv_sw_sch_tb IS
COMPONENT kiv_sw
PORT( KIV_A : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
KIV_CM : OUT STD_LOGIC_VECTOR (39 DOWNTO 0);
KIV_mCM : OUT STD_LOGIC_VECTOR (39 DOWNTO 0);
KIV_IP_CM : OUT STD_LOGIC_VECTOR (38 DOWNTO 0));
END COMPONENT;
SIGNAL KIV_A : STD_LOGIC_VECTOR (7 DOWNTO 0);
SIGNAL KIV_CM : STD_LOGIC_VECTOR (39 DOWNTO 0);
SIGNAL KIV_mCM : STD_LOGIC_VECTOR (39 DOWNTO 0);
SIGNAL KIV_IP_CM : STD_LOGIC_VECTOR (38 DOWNTO 0);
constant clk_c : time :=10 ns;
BEGIN
UUT: kiv_sw PORT MAP(
KIV_A => KIV_A,
KIV_CM => KIV_CM,
KIV_mCM => KIV_mCM,
KIV_IP_CM => KIV_IP_CM
);
tb : PROCESS
BEGIN
KIV_A <="00000001";
wait for clk_c;
KIV_A <="00001111";
wait for clk_c;
KIV_A <="11111111";
wait for clk_c;
END PROCESS;
END;
Часові діаграми для 3-ох варіантів.
/
Висновок:
Після аналізу звітів можна визначити, що перемножувач з оптимізованою константою є ефективнішим, ніж перемножувач з неоптимізованою константою.
У неоптимізованого варіанту затримка становить 22.071 ns, що еквівалентно 1*1000/T = 1*1000/22.071 = 45,3 MHZ, а у оптимізованого – 20.218 ns , що еквівалентно 1*1000/T = 1*1000/20.218 = 49,46 MHZ.
Також присутня різниця в кількості логічних елементів(суматорів, віднімачів). В оптимізованому варіанті їх 9, а в неоптимізованому – 15.
Як і в 2 лабораторній, найшвидшим виявився метод з використання IP-ядра – вбудованого інстурменту середовища XILINX. Затримка становила всього 2.172 ns що еквівалентно 1*1000/T = 1*1000/2.172 = 461 MHZ проте елементів в нього найбільше.