Ім'я файлу: LR1_NVIS.doc
Розширення: doc
Розмір: 284кб.
Дата: 21.12.2023
скачати

Лабораторна робота №1

Тема роботи: Розробка структури спеціалізованого перемножувача на константу без оптимізації.
Мета роботи: Згідно заданого варіанту розробити структурну схему перемножувача на константу без оптимізації, та за допомогою мови VHDL описати розроблену структуру пристрою та провести функціональну симуляція проекту.
1. ТЕОРЕТИЧНІ ВІДОМОСТІ
1.1. Алгоритм множення числа на константу.
Перед тим, як почати описувати базову структуру спеціалізованого перемножувача на константу, слід, перш за все, розглянути математичні основи множення двійкових чисел.

Нехай нам потрібно отримати добуток (Z) двох восьмирозрядних двійкових чисел Xта H:

X:

X7

X6

X5

X4

X3

X2

X1

X0

H:

H7

H6

H5

H4

H3

H2

H1

H0


Їхнім добутком буде сума чисел, які утворює один із співмножників, зсунутий вправо на таку кількість розрядів, яка дорівнює порядковому номеру відповідного біту іншого співмножника (порядкові номери бітів рахуються з права на ліво, порядковий номер крайнього правого біту дорівнює нулю).


0

0

0

0

0

0

0

X7

X6

X5

X4

X3

X2

X1

X0

*H0

0

0

0

0

0

0

X7

X6

X5

X4

X3

X2

X1

X0

0

*H1

0

0

0

0

0

X7

X6

X5

X4

X3

X2

X1

X0

0

0

*H2

0

0

0

0

X7

X6

X5

X4

X3

X2

X1

X0

0

0

0

*H3

0

0

0

X7

X6

X5

X4

X3

X2

X1

X0

0

0

0

0

*H4

0

0

X7

X6

X5

X4

X3

X2

X1

X0

0

0

0

0

0

*H5

0

X7

X6

X5

X4

X3

X2

X1

X0

0

0

0

0

0

0

*H6

X7

X6

X5

X4

X3

X2

X1

X0

0

0

0

0

0

0

0

*H7




Z:

Z15

Z14

Z13

Z12

Z10

Z9

Z8

Z7

Z6

Z5

Z4

Z3

Z2

Z1

Z0


Рис. 1. Схема множення двох восьмирозрядних чисел.

Число зсунуте на к розрядів вправо доповнюється к нулями справа і м –1 нулями зліва, де м – ширина розрядної сітки співмножників (в нашому випадку дорівнює 8). Як бачимо, розрядність результату є в два рази більша за розрядність вхідних даних, плюс один біт на можливість переповнення.

Згідно наведеного прикладу результат множення двох чисел Z=X*H можна записати:

Z = (H0*X.L0) + (H1*X.L1) + (H2*X.L2) +…+ (H7*X.L7) ( 2.1 )

де Нк – к-ий розряд числа Н, X.Lk – число Х зсунуте вліво на к розрядів.

Оскільки мова йде про множення числа Х на константу Н, то розряди числа Н наперед відомі і формула ( 2.1 ) спрощується.

Приклад:

H(2)= 10011000

Z = (0*X.L0) + (0*X.L1) + (0*X.L2) + (1*X.L3) + (1*X.L4) + (0*X.L5) + (0*X.L6) + (1*X.L7) = X.L3 + X.L4 + X.L7
1.1.2. Формат вхідних чисел.

Вхідні числа є 32-розрядними числами в діапазоні 0X<1, та мають наступний формат:




31

0

0

X31, X30

. . .

X1, X0




32

Для прикладу розглянемо константу: cos( )

Десяткове представлення константи:

Н(10)= 0.923879532511286756

Двійкове представлення константи в заданому форматі:

Н(2)= 0.11101100100000110101111001111001

Шістнадцяткове представлення константи в заданому форматі:

Н(16)= 0.EC835E79

1.1.3. Базова структура перемножувача.

Таким чином,

Z = x.L0 + x.L3+ x.L4 + x.L5 + x.L6 + x.L9 + x.L10 + x.L11 + x.L12 + x.L14 + x.L16 + x.L17 + x.L23 + x.L26 + x.L27 + x.L29 + x.L30 + x.L31.

Групуючи доданки попарно, отримаємо таку структуру:


Рис. 2. Базова структура перемножувача.
Апаратна складність пристрою визначається кількістю ’1’ в константі.

Кількість одиниць – 18.

Кількість суматорів – 17.

Нижче подано vhdl-код не оптимізованої структури перемножувача на константу:

library IEEE;

use IEEE.STD_LOGIC_1164.all;

use IEEE.STD_LOGIC_UNSIGNED.all;

entity my_mult is

port(

DIN : in STD_LOGIC_VECTOR(31 downto 0);

DOUT : out STD_LOGIC_VECTOR(31 downto 0)

);

end my_mult;
architecture my_mult of my_mult is
signalX_L0,X_L3,X_L4,X_L5,X_L6,X_L9,X_L10,X_L11,X_L12,X_L14,X_L16,X_L17,X_L23,X_L26,X_L27,X_L29,X_L30,X_L31 : STD_LOGIC_VECTOR(63 downto 0);

signal X_L0_X_L3,X_L4_X_L5,X_L6_X_L9,X_L10_X_L11,X_L12_X_L14,X_L16_X_L17,X_L23_X_L26,X_L27_X_L29,X_L30_X_L31 : STD_LOGIC_VECTOR(63 downto 0);

signal X_L0_X_L3_X_L4_X_L5, X_L6_X_L9_X_L10_X_L11,X_L12_X_L14_X_L16_X_L17,X_L23_X_L26_X_L27_X_L29 : STD_LOGIC_VECTOR(63 downto 0);

signal X_L0_X_L3_X_L4_X_L5_X_L6_X_L9_X_L10_X_L11,X_L12_X_L14_X_L16_X_L17_X_L23_X_L26_X_L27_X_L29 : STD_LOGIC_VECTOR(63 downto 0);

signal X_5,X_6 : STD_LOGIC_VECTOR(63 downto 0);
begin

-- X with shift

X_L0 <= "00000000000000000000000000000000" & DIN;

X_L3 <= "00000000000000000000000000000" & DIN & "000";

X_L4 <= "0000000000000000000000000000" & DIN & "0000";

X_L5 <= "000000000000000000000000000" & DIN & "00000";

X_L6 <= "00000000000000000000000000" & DIN & "000000";

X_L9 <= "00000000000000000000000" & DIN & "000000000";

X_L1 0<= "0000000000000000000000" & DIN & "0000000000";

X_L11 <= "000000000000000000000" & DIN & "00000000000";

X_L12 <= "00000000000000000000" & DIN & "000000000000";

X_L14 <= "000000000000000000" & DIN & "00000000000000";

X_L16 <= "0000000000000000" & DIN & "0000000000000000";

X_L17 <= "000000000000000" & DIN & "00000000000000000";

X_L23 <= "000000000" & DIN & "00000000000000000000000";

X_L26 <= "000000" & DIN & "00000000000000000000000000";

X_L27 <= "00000" & DIN & "000000000000000000000000000";

X_L29 <= "000" & DIN & "00000000000000000000000000000";

X_L30 <= "00" & DIN & "000000000000000000000000000000";

X_L31 <= "0" & DIN & "0000000000000000000000000000000";

-- the first register line
X_L0_X_L3 <= X_L0 + X_L3;

X_L4_X_L5 <= X_L4 + X_L5;

X_L6_X_L9 <= X_L6 + X_L9;

X_L10_X_L11 <= X_L10 + X_L11;

X_L12_X_L14 <= X_L12 + X_L14;

X_L16_X_L17 <= X_L16 + X_L17;

X_L23_X_L26 <= X_L23 + X_L26;

X_L27_X_L29 <= X_L27 + X_L29;

X_L30_X_L31 <= X_L30 + X_L31;

-- the second register line
X_L0_X_L3_X_L4_X_L5 <= X_L0_X_L3 + X_L4_X_L5;

X_L6_X_L9_X_L10_X_L11 <= X_L6_X_L9 + X_L10_X_L11;

X_L12_X_L14_X_L16_X_L17 <= X_L12_X_L14 + X_L16_X_L17;

X_L23_X_L26_X_L27_X_L29 <= X_L23_X_L26 + X_L27_X_L29;

-- the third register line
X_L0_X_L3_X_L4_X_L5_X_L6_X_L9_X_L10_X_L11 <= X_L0_X_L3_X_L4_X_L5 + X_L6_X_L9_X_L10_X_L11;

X_L12_X_L14_X_L16_X_L17_X_L23_X_L26_X_L27_X_L29 <= X_L12_X_L14_X_L16_X_L17 + X_L23_X_L26_X_L27_X_L29;

-- the forth register line

X_5 <= X_L0_X_L3_X_L4_X_L5_X_L6_X_L9_X_L10_X_L11 + X_L12_X_L14_X_L16_X_L17_X_L23_X_L26_X_L27_X_L29;
-- the fifth register line
X_6 <= X_5 + X_L30_X_L31;
DOUT <= X_6(63 downto 32);
end my_mult;
На рис. 3 зображена функціональна діаграма роботи перемножувача на константу без оптимізації.



Рис. 3. Функціональна діаграма роботи перемножувача на

константу без оптимізації.
На діаграмі на вхід DIN подаються вхідні значення для множення на задану константу а на виході DOUT зображено результат роботи данного множення.
ПОСЛІДОВНІСТЬ ВИКОНАННЯ РОБОТИ
1. Ознайомитись з викладеним вище теоретичним матеріалом.

2. Нарисувати структурну схему перемножувача на константу без оптимізації згідно заданого варіанту.

3. За допомогою мови VHDL описати розроблену схему пристрою.

4. Провести моделювання на функціональному рівні розробленого VHDL - проекту.

5. Скласти звіт та захистити його.
Звіт повинен містити:
1. Тему та мету роботи.

2. Задану константу (згідно варіанту).

3. Структурну схему перемножувача на задану константу без оптимізації.

4. VHDL-код схеми пристрою.

5. Результати функціональної симуляції.

6. Висновки.

ВАРІАНТИ ЗАВДАННЯ




2-ове представлення константи

16-ове представлення константи

1

0,10100111011011011001100001100110

A76D9866

2

0,00111100010110111001100100111001

3C5B9939

3

0,01001101111001100101010111100110

4DE655E6

4

0,00111100011001101100011100111010

3C66C73A

5

0,01110111011000011100010011110000

7761C4F0

6

0,00010111001110011000110001111000

17398C78

7

0,00111101000011100011111000011100

3D0E3E1C

8

0,01001101110011001100011110000111

4DCCC787

9

0,00111001111110000111000110001100

39F8718C

10

0,01010011101100111001110101110010

53B39D72

11

0,01110111000011101000000111001100

770E81CC

12

0,01011011001110110000011100001010

5B3B070A

13

0,00010011001100011110000111000101

1331E1C5

14

0,01000011101001110001110110001100

43A71D8C

скачати

© Усі права захищені
написати до нас