- •Курсова робота
- •Індивідуальне завдання
- •1 Аналіз завдання і вибір методу синтезу
- •2 Реалізація методу виконання арифметичної операції в двійковій системі числення
- •2.1 Розробка алгоритму виконання операції ділення в двійковій системі числення
- •2.2 Приклад виконання операції ділення
- •3 Синтез операційного автомата
- •4 Синтез керуючого автомата
- •4.1 Аналіз принципу дії автомата Мілі
- •4.2 Побудова граф-схеми автомата
- •4.3 Структурна схема керуючого автомата
- •Висновки
- •Перелік посилань
1 Аналіз завдання і вибір методу синтезу
Згідно із завданням до курсової роботи, необхідно спроектувати процесор для виконання арифметичної операції ділення без відновлення остачі з фіксованою комою без округлення результату в двійковій системі числення. Необхідно побудувати операційний автомат, який реалізує даний алгоритм, а також керуючий автомат Мілі[2].
Для синтезу керуючого автомата буде використано канонічний метод, який зводить його до синтезу комбінаційної схеми шляхом побудови системи логічних функцій, які виражаються залежністю вихідних сигналів та сигналів збудження пам’яті від вхідних сигналів і станів автомата.
Алгоритм синтезу керуючого автомата наступний:
Побудова графічної схеми (блок-схеми) виконання арифметичної операції в двійковій системі числення.
Перехід від змістовної графічної схеми автомата (ГСА) до закодованої.
Розмітка закодованої ГСА станами автомата.
Побудова графа переходів автомата.
Вибір елементів пам’яті для реалізації запам’ятовуючої частини.
Побудова суміщеної таблиці переходів та виходів.
Визначення та мінімізація логічних функцій для забезпечення вхідних сигналів тригерів та вихідних сигналів.
Приведення логічної функції до певного базису (за необхідності).
Побудова функціональної схеми автомата.
Аналіз та визначення основних параметрів пристрою.
2 Реалізація методу виконання арифметичної операції в двійковій системі числення
2.1 Розробка алгоритму виконання операції ділення в двійковій системі числення
Для того, щоб поділити двійкові числа без відновлення остачі необхідно виконати такі операції:
Визначити знак результату та записати його в тригер. Для визначення знаку використовується правило:
,
(2.1)
де ⊕ - сума за модулем 2.
У суматор 1 записати прямий код числа А.
У регістр В записати прямий код числа В.
У регістр С записати доповняльний код числа В.
У суматор 2 записати 0. У ньому зберігатиметься результат.
Присвоїти лічильнику точність операції ділення (у даному випадку – 16 знаків після коми).
Зсунути значення обох суматорів на один розряд вліво.
Проаналізувати знаковий розряд суматора 1. Якщо в знаковому розряді – “0”, то до суматора 1 додати значення регістра С, якщо – “1”, то до суматора 1 додати значення регістра В.
Якщо в результаті додавання у знаковому розряді суматора 1 буде “0”, то до суматора 2 додати 1.
Зменшити значення лічильника на одиницю.
Повторювати кроки 7-10, поки значення лічильника не буде рівним 0.
Отримати результат у вигляді
,
(2.2)
де C – результат, SC – знак результату, SM2 – кінцеве значення суматора 2.
Наочно описаний вище алгоритм можна побачити на структурній блок-схемі[3] алгоритму (рис. 2.1).
Рисунок
2.1 – Блок-схема алгоритму виконання
операції ділення
2.2 Приклад виконання операції ділення
Для прикладу виконаємо ділення чисел А = 0.10010110, В = 1.11110011.
Прямим кодом від‘ємного числа називається його зображення в природній формі, при цьому в знаковому розряді проставляється одиниця. Прямий код додатного числа збігається з його звичайним зображенням у природній формі[4].
Доповняльним кодом від‘ємного двійкового числа називається його доповнення, яке отримується за таким правилом: у знаковому розряді записується одиниця, а в усіх інших розрядах цифри замінюються на взаємно обернені, після чого до молодшого розряду числа додається одиниця. Доповняльний код додатного числа збігається з його прямим кодом[4].
Визначимо прямі та доповняльні коди операндів. Оскільки для виконання операції ділення знак результату підраховується окремо, тому прямий код від’ємного числа братимемо за модулем:
Апр = |А|пр = 00.10010110; Bпр = |B|пр = 00.11110011.
Доповняльний код визначаємо за вищенаведеним правилом:
Aдоп = 00.10010110; Bдоп = 11.00001101.
Визначимо знак результату за формулою (2.1):
Отже, знак відповіді – від’ємний.
Ділення за алгоритмом, представленим в розділі 2.1, наведене в табл. 2.1.
Таблиця 2.1 – Ділення двійкових чисел з фіксованою комою
Суматор 1 (SM1) |
Суматор 2 (SM2) |
Примітки |
00. 10010110 |
0000000000000000 |
[SM1]:=[A]пр; [RgB]:=[B]пр; [RgC]:=[B] доп; [SM2]:=0 |
01.00101100 |
000000000000000_ |
[SM1]←1; [SM2]←1 |
+ 11.00001101 100.00111001 |
0000000000000001 |
[SM1]:=[SM1]+[RgC]; [SM2]:=[SM2]+1 |
00.01110010 |
000000000000001_ |
[SM1]←1; [SM2]←1 |
Продовження таблиці 2.1 |
||
Суматор 1 (SM1) |
Суматор 2 (SM2) |
Примітки |
+ 11.00001101 11.01111111 |
0000000000000010 |
[SM2]:=[SM2]+[RgC] |
10.11111110 |
000000000000010_ |
[SM1]←1; [SM2]←1 |
+ 00.11110011 11.11110001 |
0000000000000100 |
[SM2]:=[SM2]+[RgB] |
11.11100010 |
000000000000100_ |
[SM1]←1; [SM2]←1 |
+ 00.11110011 100.11010101 |
0000000000001001 |
[SM1]:=[SM1]+[RgB]; [SM2]:=[SM2]+1 |
01.10101010 |
000000000001001_ |
[SM1]←1; [SM2]←1 |
+ 11.00001101 100.10110111 |
0000000000010011 |
[SM1]:=[SM1]+[RgC]; [SM2]:=[SM2]+1 |
01.01101110 |
000000000010011_ |
[SM1]←1; [SM2]←1 |
+ 11.00001101 100.01111011 |
0000000000100111 |
[SM1]:=[SM1]+[RgC]; [SM2]:=[SM2]+1 |
00.11110110 |
000000000100111_ |
[SM1]←1; [SM2]←1 |
+ 11.00001101 100.00000011 |
0000000001001111 |
[SM1]:=[SM1]+[RgC]; [SM2]:=[SM2]+1 |
00.00000110 |
000000001001111_ |
[SM1]←1; [SM2]←1 |
+ 11.00001101 11.00010011 |
0000000010011110 |
[SM1]:=[SM1]+[RgC] |
10.00100110 |
000000010011110_ |
[SM1]←1; [SM2]←1 |
+ 00.11110011 11.00011001 |
0000000100111100 |
[SM1]:=[SM1]+[RgB] |
10.00110010 |
000000100111100_ |
[SM1]←1; [SM2]←1 |
+ 00.11110011 11.00100101 |
0000001001111000 |
[SM1]:=[SM1]+[RgB] |
10.01001010 |
000001001111000_ |
[SM1]←1; [SM2]←1 |
+ 00.11110011 11.00111101 |
0000010011110000 |
[SM1]:=[SM1]+[RgB] |
10.01111010 |
000010011110000_ |
[SM1]←1; [SM2]←1 |
+ 00.11110011 11.01101101 |
0000100111100000 |
[SM1]:=[SM1]+[RgB] |
10.11011010 |
000100111100000_ |
[SM1]←1; [SM2]←1 |
|
|
|
Продовження таблиці 2.1 |
||
Суматор 1 (SM1) |
Суматор 2 (SM2) |
Примітки |
+ 00.11110011 11.11001101 |
0001001111000000 |
[SM1]:=[SM1]+[RgB] |
11.10011010 |
001001111000000_ |
[SM1]←1; [SM2]←1 |
+ 00.11110011 100.10001101 |
0010011110000001 |
[SM1]:=[SM1]+[RgB]; [SM2]:=[SM2]+1 |
01.00011010 |
010011110000001_ |
[SM1]←1; [SM2]←1 |
+ 11.00001101 100.00100111 |
0100111100000011 |
[SM1]:=[SM1]+[RgC]; [SM2]:=[SM2]+1 |
00.01001110 |
100111100000011_ |
[SM1]←1; [SM2]←1 |
+ 11.00001101 11.01011011 |
1001111000000110 |
[SM1]:=[SM1]+[RgC] |
Кінцевий результат отримуємо за формулою (2.2):
.
Виконаємо перевірку результату, перейшовши до десяткової системи числення[5]:
А = (0.10010110)2 = (150)10;
В = (1.11110011)2 = (243)10;
C = (1.1001111000000110)2 = 0.617279052734375;
A/B = 150/243 = 0.617283950617283…
Оскільки C ≈ A/B, можемо вважати, що обчислення виконані правильно.
