Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Кафедра ЕОМ
Курсова робота
"Проектування спеціалізованого обчислювача"
з дисципліни: "Комп’ютерна схемотехніка"
Прийняв:
Старший
викладач
Кузьо М.М
Львів – 2018
2
Зміст
1. Завдання ............................................................................................................... 3
2. Реалізація обчислювача ...................................................................................... 4
2.1 Блок схема алгоритму обчислення.................................................................. 4
2.2 Функціональна схема обчислювача ................................................................ 5
2.3 Принципова схема та її опис ........................................................................... 5
2.3.1 Лічильник ................................................................................................... 5
2.3.2 Оперативно запам’ятовуючий пристрій .................................................. 6
2.3.3 Двійковий суматор ..................................................................................... 9
2.3.4 Регістр зсуву ............................................................................................. 10
2.3.5 Постійний запам’ятовуючий пристрій ................................................. 11
2.3.6 Шинний формувач ................................................................................... 13
2.3.7 Інвертор ..................................................................................................... 14
2.4 Автомат керування ......................................................................................... 16
2.4.1 Структура регістра команд ..................................................................... 17
2.4.2 Формування прошивки ПЗП керуючого автомату ............................... 19
2.5 Обчислення загального часу роботи обчислювача ..................................... 23
3. VHDL реалізація проекту ..................................................................................... 24
3.1 Архітектура обчислювальної машини .......................................................... 24
3.2 Результати моделювання у вигляді часових діаграм .................................. 24
3.3 VHDL опис використаних пристроїв ............................................................ 25
Список використаної літератури ............................................................................. 38
Додатки ...................................................................................................................... 39
3
1. Завдання
Розробити спеціалізований обчислювач, що має відповідати наступним
вимогам :
1. структурна схема обчислювача : мікропрограмний автомат Мілі;
2. робоча формула : див. таблицю (варіант задається керівником
проекту);
3. формат даних : 8 бітний доповняльний код
4. інформаційний обмін здійснюється через паралельну 8-ти розрядну
двонаправлену шину даних за допомогою додаткових сигналів
синхронізації ( рівні сигналів сумісні з ТТЛ );
5. керуючий автомат реалізувати на основі ПЗП та регістра;
напруга живлення та тактові імпульси надходять від зовнішньог о джерела а
сигнал початкового скидання також формується ззовні.
№ N Формула
10 11 Yi = 5∙Xi/8– Xi+1/4
4
2. Реалізація обчислювача
2.1 Блок схема алгоритму обчислення
Початок
Встановлення
лічильника в
початковий
стан і=5
Запис данних
в пам ять
І++
Р_15=0
НІ
Встановлення
лічильника в
початковий
стан і=5
Так
Запис
першого
операнда в
регістр 1
І++
Запис 2-го
операдна в
регістр 2
І--
Запис
результату
обчислень в
ОЗП
І++
Р_15=0
НІ
Встановлення
лічильника в
початковий
стан і=5
Так
Читання
даних з ОЗП
та вивід
І++
Р_15=0
НІ
Так
Кінець
5
2.2 Функціональна схема обчислювача
Функціональна схема обчислювача знаходиться в додатку 1.
2.3 Принципова схема та її опис
Принципова схема знаходиться в додатку 2.
2.3.1 Лічильник
Лічильником називають послідовнісний цифровий пристрій, призначений
для підрахунку та запам’ятовування числа імпульсів, поданих на його лічильний
вхід.
До синхронних лічильників відносяться лічильники, в яких переключення
розрядів відбувається одночасно, незалежно від віддаленості розряду від
лічильного входу. Це досягається подаванням на всі тригери синхронізуючих
імпульсів, які додатнім або від’ємним перепадом викликають переключення
тригерів у відповідності із логікою роботи лічильника. Завдяки такій
синхронізації досягається мінімальний час встановлення лічильника, який не
перевищує час встановлення одного тригера, чим забезпеч ується максимальна
частота зміни станів лічильника.
На рис. 1 подана мікросхема серії ТТЛ К155ИЕ7, яка являє собою лічильник.
D1
D2
D4
D8
L
R
+1
-1
CT2 1
2
4
8
15
1
4
5
14
9
10
11
2
6
7
3
≥0
≥15 12
13
8 – Gnd; 16 - +5V
Рис.1. Лічильник
Лічильник представляє із себе двійковий синхронний лічильник. И Е7 має
асинхронне скидання і асинхронне початкове завантаження.
6
Таблиця істинності лічильника подана на рис. 6.
Рис.2. Таблиця істинності лічильника
2.3.2 Оперативно запам’ятовуючий пристрій
Запам’ятовуючі пристрої (ЗП) складають самостійний, широко
розвинений клас мікросхем середнього, великого і надвеликого ступеня
інтеграції.
Напівпровідникові ЗП за режимом занесення інформації поділяються на
оперативні і постійні, за принципом вибірки інформації – на пристрої з
довільною та з послідовною вибіркою, за технологією виготовлення – на
біполярні та уніполярні.
Оперативні запам’ятовуючі пристрої (ОЗП) поділяються на дві великі групи:
статичні і динамічні. В накопичувачах статичних ОЗП застосовуються тригерні
елементи пам’яті. В ОЗП динамічного типу запам’ ятовуючим елементом
служить конденсатор, в якому інформація зберігається в формі наявності або
відсутності заряду.
Перевагою статичних ОЗП перед динамічними є відсутність схеми
регенерації інформації, що значно спрощує керування. Крім того, швидкодія
статичних ОЗП суттєво перевищує швидкодію динамічних ОЗП. З іншого боку,
ємність мікросхем динамічних ОЗП набагато вища, ніж статичних.
7
На рис. 4 наведено типову структурну схему напівпровідникового ОЗП,
яка складається з наступних типових вузлів: матриці запам’ятовуючих елементів
(ЗЕ), дешифраторів рядків і стовбців (DCX, DCY) пристрою запису (ПЗ),
пристрою читання (ПЧ) і пристрою керування (ПК).
При об’єднанні ЗП в систему пам’яті використовуються типові елементи,
пов’язані з вхідними та вихідними схемами. Вхідні схеми являють собою логічні
елементи, через які інформаційні, керуючі і адресні сигнали надходять в ЗП.
Вхідні інформаційні сигнали DI надходять в пристрій запису ПЗ, який служить
для записування інформації в елементи пам’яті, об’єднані в матриці ЗЕ. Вихідні
інформаційні сигнали DO зчитуються із ЗП через пристрій читання ПЧ.
Керуючі сигнали
CS і
WR надходять в пристрій керування ПК і пристрій
запису ПЗ і визначають режим роботи ЗП (запис, збереження, зчитува ння
інформації).
Рис.4 Структурна схему напівпровідникового ОЗП
В даній роботі у якості запам’ятовуючих елементів використовується
мікросхема моделі CY7C128A(RAM). Для запису шістнадцяти розрядних слів
використовується дві мікросхеми. В яких використовуються такі входи:
А10…А0 – адресні входи,
WE – Вхід дозволу запису та зчитування
OE – вхід управління станом вхідного буфера
DCX
ПЗ
ПК DCY ПЧ
Матриця ЗЕ
DC
A0..AN
DI
CS
WR
8
СE - Вхід вибору кристала
Таблиця даного ОЗП приведена в таблиці 1.
Таблиця 1
Режим CE OE WE DQ
Збереження 0 1 1 Z
Запис 0 0 0 DATAin
Читання 0 0 1 DATAout
Неробочий
режим
1 X X Z
Рис. 5 Умовне графічне позначення ОЗП CY7C128A
Рис. 6 Цикл читання 1
Рис. 7 Цикл читання 2
9
Рис. 8 Цикл запису WE
Рис. 9 Цикл запису CE
2.3.3 Двійковий суматор
Суматори – це комбінаці йні пристрої, що здійснюють основну
арифметичну операцію – додавання чисел в двійковому коді. Найбільш
поширені двійкові повні суматори.
Кожний розряд двійкового повного суматора має три входи (A і B – для
доданків, P0 – сигнал переносу від попереднього розряду) і два виходи (S – суми
і P – сигналу переносу в наступний розряд). Входи A, B і P0 в загальному
рівноправні. Сигнал суми S приймає значення лог.1 при непарній кількості
одиниць на входах A, B і P0, і лог.0 при парній. Сигнал переносу P рівень лог.1
при кількості одиниць на входах, рівній 2 або 3. Логічні функції виходів повного
одно-розрядного суматора:
P0AP0BBAP
P0BAS
•••=
=
Мікросхема SN74S283 – це швидкодіючий повний 4-розрядний двійковий
суматор. В якому використовуються такі входи та виходи :
А0…А4 - входи даних
10
В0…В4 –входи даних
Р0 – вхід переносу
Р4 – вихід сигналу переносу
S1…S4 – виходи на яких появляються суми вхідних слів
Рис. 10 Умовне графічне позначення суматора SN74S283
2.3.4 Регістр зсуву
Регістри – це послідовні пристрої, призначені для прийому, збереження,
простих перетворень та передачі двійкових кодів. Під простими перетвореннями
розуміють зсув кодів на задану кількість розрядів, а також перетворення
послідовного двійкового коду в паралельний і паралельного в послідовний.
Базовими елементами регістрів є тригери, які доповнюються комбінаційними
логічними елементами для реалізації певних зв’язків між розрядами регістра і
для керування прийомом та передачею операндів. Одне з функціональних
призначень регістрів – оперативна пам ’ять для багато розрядних двійкових
кодів.
Мікросхема К555ИР22 (рис. 11) - восьмирозрядний регістр зберігання
інформації, з можливістю перекладу виходів у високоімпедансний стан. Запис
інформації в тригери регістра відбувається при подачі лог. 1 на вхід ER, в цьому
випадку сигнали на виходах регістра повторюють вхідні, регістр << прозорий>
для сигналів на входах D1 - D8. При подачі лог. 0 на вхід З регістр переходить в
режим зберігання інформації.
11
Рис. 11 Умовне графічне позначення регістра зсуву К555ИР22
Рис. 12 Таблиця істинності регістра зсуву К555ИР22
2.3.5 Постійний запам’ятовуючий пристрій
Постійні запам'ятовуючі пристрої призначені для зберігання одноразово
записаної інформації, яка має зберігатися навіть за умов знеструмлення
комп'ютеру. Т акою інформацією є, наприклад, дані і програми, потрібні для
завантаження операційної системи та керування роботою зовнішніх пристроїв
комп'ютеру ( BIOS). Таким чином, постійний запам'ятовуючий пристрій – це
комбінаційна багато входова схема з одним або кіл ькома виходами
Q0,...,Qk- ПЗП призначені для зберігання інформації, яка залишається
незмінною протягом всього часу роботи пристрою. Ця інформація не зникає при
12
відключенні напруги живлення. Тому в ПЗП можливий лише режим зчитування
інформації, причому зчитування інформації не супроводжується її порушенням.
Рис.13 Умовне графічне позначення постійного запам’ятовуючого пристрою К155РЕ4
13
2.3.6 Шинний формувач
Шинний формувач представляє 8 - розрядний паралельний передатчик з
три стабільними виходами і використовується як буферний пристрій шини даних
в мікропроцесорних системах.
Пристрій передає данні з шини А в шину В або з B шини у А шину , в
залежності від логіки рівня в напрямку контролю (DIR - вхід керування
напрямком передачі ). OUT -Enable (OE) вхід може бути використаний для
відключення пристрою, щоб шина була надійно ізольована.
Рис.15 Умовне графічне позначення шинного формувача SN74LV245
Таблиця істинності показана в табл. 4.
Таблиця 4
Dir OE
0 0 A<=B
0 1 ZZZZZ
1 0 B<=A
1 1 ZZZZZ
14
Рис.16 Часові діаграми тривалості імпульсу формувача SN74LV245
Рис.17 Графік часової затримки сигналів SN74LV245
2.3.7 Інвертор
Інвертор представляє собою пристрій для інверсії двійкових розрядів.
Для нашого спеціалізованого обчислювача ми вибрали мікросхему 7404,
яка містить в собі 6 незалежних інверторів і працює за логічною формулою
Y=/A.
15
Таблиця істинності інвертора
Входи
A
Виходи
Y
H L
HL
16
2.4 Автомат керування
Мікропрограма у відповідності із заданим варіантом
В даному випадку:
А0-A20– стани мікро програмного автомата;
Мікропрограма обчислювального автомата
А0: Скидання лічильника йти до А1
А1: Початок вводу чисел йти до А2
А2: Відкрити буфер йти до А3
А3: Запис числа до ОЗП йти до А4
А4: Відключити ОЗП йти до А5
А5: Лічильник +1, Якщо P_15 йти до А6, інакше А2
А6: Скидання лічильника йти до А7
А7: Зчитування даних з ОЗП йти до А8
А8: Запис даних до першого регістру йти до А9
А9: Лічильник +1 йти до А10
А10: Зчитування даних з ОЗП йти до А11
А11: Запис даних до другого регістру йти до А12
А12: Лічильник -1 йти до А13
А13: Відкрити буфер йти до А14
А14: Запис даних до ОЗП йти до А15
А15: Лічильник +1, Якщо P_15 йти до А16. Інакше А7
А16: Скидання лічильника йти до А17
А17: Читання даних з ОЗП йти до А18
A18: Відкрити буфер Йти до А19
А19: Відключити ОЗП і буфер Йти до А20
А20: Лічильник +1, Якщо P_15 Йти до А0, інакше А17
17
2.4.1 Структура регістра команд
Таблиця відповідності виводів регістру D15 та керуючих сигналів:
Q1 S5
Q2 S4
Q3 S3
Q4 S2
Q5 S1
Q6 DIR2
Q7 OE2
Q8 OE1
Таблиця відповідності виводів регістру D17 та керуючих сигналів:
Q1 ER2
Q2 CL2
Q3 CL1
Q4 ER1
Q5 WE
Q6 OE
Q7 INC
Q8 DEC
18
Таблиця відповідності виводів регістру D19 та керуючих сигналів:
Q1 V
Q2
Q3
Q4
Q5
Q6
Q7
Q8
19
2.4.2 Формування прошивки ПЗП керуючого автомату
Для занесення інформації в ПЗП необхідно скласти таблицю прошиття, яка
встановлює відповідність між адресами і даними. Занесення інформації в ПЗП
здійснюється користувачем за допо могою програматора. В моєму випадку
таблиця прошиття має такий вигляд
Для занесення інформації в ПЗП необхідно скласти таблицю прошиття, яка
встановлює відповідність між адресами і даними. Занесення інформації в ПЗП
здійснюється користувачем за допо могою програматора. В моєму випадку
таблиця прошиття має такий вигляд
P_15 S5 S4 S3 S2 S1 S5 S4 S3 S2 S1 DIR2 OE2 OE1 ER2 CL2 CL1 ER1 WE OE INC DEC V
1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 1 1 1 0 1 0
2 0 0 0 0 0 1 0 0 0 1 0 0 1 1 1 0 0 1 1 1 0 1 1
3 0 0 0 0 1 0 0 0 0 1 1 0 0 1 1 0 0 1 1 1 0 1 1
4 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 1 1
5 0 0 0 1 0 0 0 0 1 0 1 0 0 1 1 0 0 1 1 1 0 1 1
6 0 0 0 1 0 1 0 0 0 1 0 0 1 1 1 0 0 1 1 1 1 1 1
P_15 S5 S4 S3 S2 S1 S5 S4 S3 S2 S1 DIR2 OE2 OE1 ER2 CL2 CL1 ER1 WE OE INC DEC V
7 0 0 0 1 1 0 0 0 1 1 1 1 1 1 1 0 0 1 1 1 0 1 0
8 0 0 0 1 1 1 0 1 0 0 0 1 1 1 1 0 0 0 1 0 0 1 1
9 0 0 1 0 0 0 0 1 0 0 1 1 1 1 1 0 1 0 1 0 0 1 1
10 0 0 1 0 0 1 0 1 0 1 0 1 1 1 1 0 0 0 1 1 1 1 1
11 0 0 1 0 1 0 0 1 0 1 1 1 1 1 1 0 0 0 1 0 1 0 1
12 0 0 1 0 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 0 1 0 1
13 0 0 1 1 0 0 0 1 1 0 1 1 1 1 0 0 0 0 1 1 1 1 1
14 0 0 1 1 0 1 0 1 1 1 0 1 1 0 0 0 0 0 1 1 0 1 1
15 0 0 1 1 1 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1
16 0 0 1 1 1 1 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1
P_15 S5 S4 S3 S2 S1 S5 S4 S3 S2 S1 DIR2 OE2 OE1 ER2 CL2 CL1 ER1 WE OE INC DEC V
17 0 1 0 0 0 0 1 0 0 0 1 1 1 1 1 0 0 1 1 1 0 1 0
18 0 1 0 0 0 1 1 0 0 1 0 1 1 1 1 0 0 1 1 0 0 1 1
19 0 1 0 0 1 0 1 0 0 1 1 1 0 1 1 0 0 1 1 0 0 1 1
20 0 1 0 0 1 1 1 0 0 0 0 1 1 1 1 0 0 1 1 1 0 1 1
21 0 1 0 0 0 0 1 0 0 0 1 1 1 1 1 0 0 1 1 1 1 1 1
22 1 0 0 0 1 0 0 0 1 1 0 1 1 1 1 0 0 1 1 1 0 1 1
23 1 0 0 1 1 1 1 0 1 1 0 1 1 1 0 0 0 0 1 1 0 1 1
24 1 1 0 0 0 1 0 0 0 0 0 0 1 1 1 0 0 1 1 1 0 1 1
№ Поточний стан Наступний стан Керуючі сигнали
20
Таблиця прошиття для ПЗП D14:
№ Адреса Дані
A[10;6] А5 А4 А3 А2 А1 А0 D0 D1 D2 D3 D4 D5 D6 D7
P_15 S5 S4 S3 S2 S1 S5 S4 S3 S2 S1 DIR2 OE2 OE1
Ввід
1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1
2 0 1 0 0 0 0 1 0 0 0 1 0 0 1 1
3 0 1 0 0 0 1 0 0 0 0 1 1 0 0 1
4 0 1 0 0 0 1 1 0 0 1 0 0 0 0 1
5 0 1 0 0 1 0 0 0 0 1 0 1 0 0 1
6 0 1 0 0 1 0 1 0 0 0 1 0 0 1 1
Обчислення
7 0 1 0 0 1 1 0 0 0 1 1 1 1 1 1
8 0 1 0 0 1 1 1 0 1 0 0 0 1 1 1
9 0 1 0 1 0 0 0 0 1 0 0 1 1 1 1
10 0 1 0 1 0 0 1 0 1 0 1 0 1 1 1
11 0 1 0 1 0 1 0 0 1 0 1 1 1 1 1
12 0 1 0 1 0 1 1 0 1 1 0 0 1 1 1
13 0 1 0 1 1 0 0 0 1 1 0 1 1 1 1
14 0 1 0 1 1 0 1 0 1 1 1 0 1 1 0
15 0 1 0 1 1 1 0 0 1 1 1 1 1 1 0
16 0 1 0 1 1 1 1 0 0 1 1 1 1 1 1
Вивід
17 0 1 1 0 0 0 0 1 0 0 0 1 1 1 1
18 0 1 1 0 0 0 1 1 0 0 1 0 1 1 1
19 0 1 1 0 0 1 0 1 0 0 1 1 1 0 1
20 0 1 1 0 0 1 1 1 0 0 0 0 1 1 1
21 0 1 1 0 0 0 0 1 0 0 0 1 1 1 1
Команди переходів
22 0 0 0 0 0 1 0 0 0 1 1 0 1 1 1
23 0 0 0 0 1 1 1 1 0 1 1 0 1 1 1
24 0 0 1 0 0 0 1 0 0 0 0 0 0 1 1
21
Таблиця прошиття для ПЗП D16:
№ Адреса Дані
A[10;6] А5 А4 А3 А2 А1 А0 D0 D1 D2 D3 D4 D5 D6 D7
P_15 S5 S4 S3 S2 S1 ER2 CL2 CL1 ER1 WE OE INC DEC
Ввід
1 0 1 0 0 0 0 0 1 0 0 1 1 1 0 1
2 0 1 0 0 0 0 1 1 0 0 1 1 1 0 1
3 0 1 0 0 0 1 0 1 0 0 1 1 1 0 1
4 0 1 0 0 0 1 1 1 0 0 1 0 0 0 1
5 0 1 0 0 1 0 0 1 0 0 1 1 1 0 1
6 0 1 0 0 1 0 1 1 0 0 1 1 1 1 1
Обчислення
7 0 1 0 0 1 1 0 1 0 0 1 1 1 0 1
8 0 1 0 0 1 1 1 1 0 0 0 1 0 0 1
9 0 1 0 1 0 0 0 1 0 1 0 1 0 0 1
10 0 1 0 1 0 0 1 1 0 0 0 1 1 1 1
11 0 1 0 1 0 1 0 1 0 0 0 1 0 1 0
12 0 1 0 1 0 1 1 0 1 0 0 1 0 1 0
13 0 1 0 1 1 0 0 0 0 0 0 1 1 1 1
14 0 1 0 1 1 0 1 0 0 0 0 1 1 0 1
15 0 1 0 1 1 1 0 0 0 0 0 0 0 0 1
16 0 1 0 1 1 1 1 0 0 0 0 1 1 1 1
Вивід
17 0 1 1 0 0 0 0 1 0 0 1 1 1 0 1
18 0 1 1 0 0 0 1 1 0 0 1 1 0 0 1
19 0 1 1 0 0 1 0 1 0 0 1 1 0 0 1
20 0 1 1 0 0 1 1 1 0 0 1 1 1 0 1
21 0 1 1 0 0 0 0 1 0 0 1 1 1 1 1
Команди переходів
22 0 0 0 0 0 1 0 1 0 0 1 1 1 0 1
23 0 0 0 0 1 1 1 0 0 0 0 1 1 0 1
24 0 0 1 0 0 0 1 1 0 0 1 1 1 0 1
22
Таблиця прошиття для ПЗП D18:
№ Адреса Дані
A[10;6] А5 А4 А3 А2 А1 А0 D0 D1 D2 D3 D4 D5 D6 D7
P_15 S5 S4 S3 S2 S1 V
Ввід
1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
2 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0
3 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0
4 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0
5 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0
6 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0
Обчислення
7 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0
8 0 1 0 0 1 1 1 1 0 0 0 0 0 0 0
9 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0
10 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0
11 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0
12 0 1 0 1 0 1 1 1 0 0 0 0 0 0 0
13 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0
14 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0
15 0 1 0 1 1 1 0 1 0 0 0 0 0 0 0
16 0 1 0 1 1 1 1 1 0 0 0 0 0 0 0
Вивід
17 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
18 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0
19 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0
20 0 1 1 0 0 1 1 1 0 0 0 0 0 0 0
21 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0
Команди переходів
22 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
23 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0
24 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0
23
2.5 Обчислення загального часу роботи обчислювача
• Такт вводу:
Для того, щоб записати одне число в пам’ять необхідно 4 такти.
Ми записуємо 10 чисел, тому для запису чисел необхідно 40 тактів.
Щоб закінчити цикл вводу, ми переходимо на 1 старшу адресу, тому
необхідно ще 1 такт.
Загалом 41 такт.
• Такт виводу:
Для того, щоб вивести одне число в пам’ять необхідно 4 такти.
Ми виводимо 10 чисел, тому для запису чисел необхідно 40 тактів.
Щоб закінчити цикл виводу, ми переходимо на 1 старшу адресу, тому
необхідно ще 1 такт.
Загалом 41 такт.
• Такт обчислення:
Для обчислення одного результату необхідно 9 тактів.
Ми виконуємо 10 обчислень, тому для множення необхідно 90 тактів.
Щоб закінчити цикл обчислення, ми переходимо на 1 старшу адресу,
тому необхідно ще 1 такт.
Загалом 91 тактів.
Додаємо ще 2 такти на виставлення адреси початку роботи, та проміжні
2 такти.
Загальна к-сть тактів: 176 тактів.
24
3. VHDL реалізація проекту
3.1 Архітектура обчислювальної машини
3.2 Результати моделювання у вигляді часових діаграм
Рис.19. Часова діаграма роботи VHDL моделі
25
3.3 VHDL опис використаних пристроїв
counter.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
entity COUNTER_4B is
port(
CLR : in std_logic;
LOAD : in std_logic;
ENP : in std_logic;
ENT : in std_logic;
CLK : in std_logic;
D : in std_logic_vector(3 downto 0);
RCO : out std_logic;
Q : out std_logic_vector(3 downto 0));
end COUNTER_4B;
architecture COUNTER_4B of COUNTER_4B is
signal val : std_logic_vector (3 downto 0);-- <= (others => "0000000");
begin
process (clk,clr,load,enp,ent,d)
begin
if (clr = '0') then val <="0000";
elsif (clk'event and clk = '1') then
if(ENP = '1' and ENT ='1') then val<=val+'1';
end if;
elsif (LOAD = '0') then val <= D;
end if;
end process;
process (val)
begin
Q <= val;
if (val = "1111") then RCO <= '1';
else RCO <= '0';
end if;
end process;
end COUNTER_4B;
ram.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
entity RAM_2Kx8 is
26
port(
A : in std_logic_vector (10 downto 0);
I_O : inout std_logic_vector (7 downto 0);
CS : in std_logic;
OE : in std_logic;
WE : in std_logic
);
end RAM_2Kx8;
architecture RAM_2Kx8 of RAM_2Kx8 is
type ram2Kx8 is array (2047 downto 0) of std_logic_vector (7 downto 0);
signal RAM : ram2Kx8;-- <= (others => "0000000");
begin
process (cs, a, I_O, oe, we)
begin
if (cs ='1' or (oe = '1' and we ='1')) then
I_O <= (others => 'Z');
elsif (cs='0' and oe = '0' and we = '1') then
I_O <= RAM (conv_integer(A));
elsif (cs='0' and we = '0') then
RAM (conv_integer(A)) <= I_O;
end if;
end process;
end RAM_2Kx8;
rg.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity RG_8 is
port(
MR : in std_logic; --reset
CLK : in std_logic; --clock
SEL : in std_logic; --load
D : in std_logic_vector (7 downto 0); --Input
Q : out std_logic_vector (7 downto 0) ); --Output
end RG_8;
architecture RG_8 of RG_8 is
begin
process (CLK,D)
begin
if rising_edge(clk) then
if(MR = '1') then Q <= (others => '0');
elsif SEL='0' then Q <=D;
end if;
end if;
27
end process;
-- process (clk)
-- begin
-- Q <=val;
-- end process;
end RG_8;
full addr.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity RG_8 is
port(
MR : in std_logic; --reset
CLK : in std_logic; --clock
SEL : in std_logic; --load
D : in std_logic_vector (7 downto 0); --Input
Q : out std_logic_vector (7 downto 0) ); --Output
end RG_8;
architecture RG_8 of RG_8 is
begin
process (CLK,D)
begin
if rising_edge(clk) then
if(MR = '1') then Q <= (others => '0');
elsif SEL='0' then Q <=D;
end if;
end if;
end process;
-- process (clk)
-- begin
-- Q <=val;
-- end process;
end RG_8;
bt.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
entity BT_8 is
port(
A : inout std_logic_vector (7 downto 0):="ZZZZZZZZ";
B : inout std_logic_vector (7 downto 0);
OE : in std_logic:='1';
DIR : in std_logic );
28
end BT_8;
architecture BT_8 of BT_8 is
begin
process (OE, DIR,A,B)
begin
if (OE = '1') then A <= (others =>'Z'); B <= "ZZZZZZZZ";
elsif (oe='0' and DIR = '1') then A <=B;
elsif (oe='0' and dir='0') then B <= A;
end if;
end process;
end BT_8;
eprom.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
entity EPROM_64Kx16b is
port(
A : in std_logic_vector (15 downto 0);
O : out std_logic_vector (0 to 15);
CS : in std_logic;
OE : in std_logic );
end EPROM_64Kx16b;
architecture EPROM_64Kx16b of EPROM_64Kx16b is
--type ram2Kx8 is array (2047 downto 0) of std_logic_vector (7 downto 0);
--signal RAM: ram2Kx8;-- <= (others => "0000000");
-- constant EROM array of std_logic
begin
O <=
"0011011111110000" when A(3 downto 0) = "0000" and A(4)='1' else
"0010011111110001" when A(3 downto 0) = "0000" and A(4)='0' else
"0011011111110001" when A(3 downto 0) = "0001" and A(4)='1' else
"0001011011110010" when A(3 downto 0) = "0001" and A(4)='0' else
"0001001011110011" when A(3 downto 0) = "0010" else
"0001011011110100" when A(3 downto 0) = "0011" else
"0011111111110101" when A(3 downto 0) = "0100" else
"0011011111110001" when A(3 downto 0) = "0101" and A(6)='0'else
"0010011111110110" when A(3 downto 0) = "0101" and A(6)='1'else
"0011010111010111" when A(3 downto 0) = "0110" else
"0011010110011000" when A(3 downto 0) = "0111" else
29
"0011010111011001" when A(3 downto 0) = "1000" else
"0011110111011010" when A(3 downto 0) = "1001" else
"0011011111111011" when A(3 downto 0) = "1010" else
"0011011101111011" when A(3 downto 0) = "1011" and A(5)='1'else
"0011011101101100" when A(3 downto 0) = "1011" and A(5)='0'else
"0011011110111101" when A(3 downto 0) = "1100" and A(5)='1'else
"0011011101101100" when A(3 downto 0) = "1100" and A(5)='0'else
"0011011111111110" when A(3 downto 0) = "1101" else
"0011111111111111" when A(3 downto 0) = "1110" else
"0011010111011010" when A(3 downto 0) = "1111" and A(6)='0'else
"0011011111110000" when A(3 downto 0) = "1111" and A(6)='1'else
"0011011111110000";
end EPROM_64Kx16b;
invertor.vhdl
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity Inv_9 is
port(
X : in std_logic_vector (7 downto 3); --Input
Y : out std_logic_vector (7 downto 3) ); --Output
end Inv_9;
architecture Inv_9 of Inv_9 is
begin
process (X)
begin
Y<=not(X);
end process;
end Inv_9;
top_scheme.vhdl
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity top_design is
port(
CLK : in STD_LOGIC;
RA : in STD_LOGIC;
WR : in STD_LOGIC;
RR : out STD_LOGIC;
WA : out STD_LOGIC;
DATA_BUS : inout STD_LOGIC_VECTOR (7 downto 0) );
end entity top_design;
30
architecture top_design of top_design is
signal cntrl_signals : std_logic_vector (15 downto 0);
signal i_o_b : std_logic_vector (7 downto 0);
signal sram_b : std_logic_vector (7 downto 0):="ZZZZZZZZ";
signal xi1_b : std_logic_vector (7 downto 0);
signal xi_rg_b : std_logic_vector (7 downto 0);
signal xi_s_b : std_logic_vector (16 downto 0);
signal result_b : std_logic_vector (7 downto 0);
signal sram_adr_b : std_logic_vector (10 downto 0):="00000000000";
signal cur_state_b : std_logic_vector (15 downto 0):="0000000000000000";
signal xi1_5_b : std_logic_vector (8 downto 0);
signal xi_crr : std_logic;
signal res_crr : std_logic;
signal RCO : std_logic;
signal inv_clk : std_logic;
constant vcc : std_logic :='1';
constant gnd : std_logic :='0';
signal ggnd : std_logic;
signal start_reset : std_logic :='0';
------------------------------------
signal rg_input : std_logic_vector (7 downto 0);
signal Xi1_AddH_A : std_logic_vector (3 downto 0);
signal Xi1_AddH_B : std_logic_vector (3 downto 0);
signal Res_addH : std_logic_vector (3 downto 0);
------------------------------------
component EPROM_64Kx16b is
port(
A : in std_logic_vector (15 downto 0);
O : out std_logic_vector (0 to 15);
CS : in std_logic;
OE : in std_logic
);
end component;
------------------------------------
component BT_8
port (
DIR : in STD_LOGIC;
OE : in STD_LOGIC;
A : inout STD_LOGIC_VECTOR(7 downto 0);
B : inout STD_LOGIC_VECTOR(7 downto 0)
);
end component;
------------------------------------
component COUNTER_4B
port (
31
CLK : in STD_LOGIC;
CLR : in STD_LOGIC;
D : in STD_LOGIC_VECTOR(3 downto 0);
ENP : in STD_LOGIC;
ENT : in STD_LOGIC;
LOAD : in STD_LOGIC;
Q : out STD_LOGIC_VECTOR(3 downto 0);
RCO : out STD_LOGIC
);
end component;
------------------------------------
component FULL_ADDR_4
port (
A : in STD_LOGIC_VECTOR(3 downto 0);
B : in STD_LOGIC_VECTOR(3 downto 0);
Cin : in STD_LOGIC;
Cout : out STD_LOGIC;
S : out STD_LOGIC_VECTOR(3 downto 0)
);
end component;
------------------------------------
component Inv_9
port (
X : in STD_LOGIC_VECTOR(7 downto 3);
Y : out STD_LOGIC_VECTOR(7 downto 3)
);
end component;
------------------------------------
component RAM_2Kx8
port (
A : in STD_LOGIC_VECTOR(10 downto 0);
CS : in STD_LOGIC;
OE : in STD_LOGIC;
WE : in STD_LOGIC;
I_O : inout STD_LOGIC_VECTOR(7 downto 0)
);
end component;
------------------------------------
component RG_8
port (
CLK : in STD_LOGIC;
D : in STD_LOGIC_VECTOR(7 downto 0);
MR : in STD_LOGIC;
SEL : in STD_LOGIC;
Q : out STD_LOGIC_VECTOR(7 downto 0)
);
32
end component;
--***********************************************************************--
begin
--------------------------------------------------
-- process(clk)
-- begin
-- if not(start_reset = '1') then
-- cur_state_b<=(others =>'0');
-- start_reset <='1';
-- end if;
-- end process;
--------------------------------------------------
process (clk)
begin
inv_clk <=not clk;
end process;
--------------------------------------------------
process (cntrl_signals)
begin
WA<=cntrl_signals(8);
RR<=cntrl_signals(7);
end process;
--------------------------------------------------
process (RCO , RA , WR , cntrl_signals (3 downto 0))
begin
rg_input <= ('0' & RCO & RA & WR & cntrl_signals (3 downto 0));
end process;
DD1_st_reg : rg_8
port map(
CLK => CLK,
D => rg_input,
MR => GND,
SEL => GND,
Q => cur_state_b (7 downto 0));
--------------------------------------------------
DD2_eprom : EPROM_64Kx16b
port map(
A => cur_state_b,
O => cntrl_signals,
cs => gnd,
oe => gnd);
--------------------------------------------------
DD3_adr_counter : COUNTER_4B
33
port map(
CLK => cntrl_signals(11),
CLR => VCC,
D => "0100",
ENP => VCC,
ENT => VCC,
LOAD => cntrl_signals(12),
Q => sram_adr_b(3 downto 0),
RCO => RCO);
--------------------------------------------------
DD4_sram : RAM_2Kx8
port map(
A => sram_adr_b,
CS => GND,
OE => cntrl_signals(9),
WE => cntrl_signals(10),
I_O => sram_b);
--------------------------------------------------
DD5_bt_inp : BT_8
port map(
DIR => GND,
OE => cntrl_signals(13),
A => data_bus,
B => sram_b);
--------------------------------------------------
DD6_Xi1_reg : RG_8
port map(
CLK => inv_clk,
D => sram_b,
MR => GND,
SEL => cntrl_signals(5),
Q => xi1_b);
--------------------------------------------------
DD9_Xi_reg : RG_8
port map(
CLK => inv_clk,
D => xi1_b,
MR => GND,
SEL => cntrl_signals(6),
Q => xi_rg_b);
--------------------------------------------------
DD7_Xi_addL : FULL_ADDR_4
port map(
A => xi_rg_b(6 downto 3),
B => xi_rg_b(4 downto 1),
Cin => GND,
34
Cout => xi_crr,
S => xi_s_b(3 downto 0));
--------------------------------------------------
DD8_Xi_addH : FULL_ADDR_4
port map(
A(3) => '0',
A(2) => '0',
A(1) => '0',
A(0) => xi_rg_b(7),
B(3) => '0',
B(2) => xi_rg_b(7),
B(1) => xi_rg_b(6),
B(0) => xi_rg_b(5),
Cin => xi_crr,
Cout => ggnd,
S => xi_s_b(7 downto 4));
--------------------------------------------------
DD10_inv : Inv_9
port map(
X(7 downto 3) => xi1_b(7 downto 3),
Y(7 downto 3) => xi_s_b (12 downto 8));
--------------------------------------------------
DD11_Res_addL : FULL_ADDR_4
port map(
A => xi_s_b(11 downto 8),
B => xi_s_b(3 downto 0),
Cin => VCC,
Cout => res_crr,
S => result_b(3 downto 0));
--------------------------------------------------
process (xi_rg_b)
begin
Res_addH<="000" & xi_rg_b(7);
end process;
--------------------------------------------------
DD12_Res_addH : FULL_ADDR_4
port map(
A(3) => '1',
A(2) => '1',
A(1) => '1',
A(0) => xi_s_b(12),
B => xi_s_b(7 downto 4),
Cin => res_crr,
Cout => ggnd,
S => result_b(7 downto 4));
--------------------------------------------------
35
DD13_bt_out : BT_8
port map(
DIR => GND,
OE => cntrl_signals(4),
A => result_b,
B => data_bus);
--------------------------------------------------
end architecture top_design;
test.vhdl
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
use IEEE.NUMERIC_STD.all;
entity testbench is
end entity testbench;
architecture testbench of testbench is
----------------------------
component top_design is
port(
CLK : in STD_LOGIC;
RA : in STD_LOGIC;
WR : in STD_LOGIC;
RR : out STD_LOGIC;
WA : out STD_LOGIC;
DATA_BUS : inout STD_LOGIC_VECTOR (7 downto 0) );
end component;
signal count1,count2 : integer :=0;
signal WR,WA,RR,RA, CLK : std_logic:='1';
signal io : std_logic_vector (7 downto 0):=(others =>'Z');
signal data : std_logic_vector (7 downto 0):="11110000";
type ram32x8 is array (32 downto 0) of std_logic_vector (7 downto 0);
type ram16x8 is array (9 downto 0) of std_logic_vector (7 downto 0);
signal calc_val : ram16x8:=(others =>"00000000");
signal inpt_val : ram16x8:=(others =>"00000000");
type ramx8 is array (26 downto 0) of integer ;
signal tmp : ramx8:=(others =>0);
begin
36
process
begin
wait for 10 ns;
clk<=not clk;
end process;
comp_syst : top_design
port map(
CLK=> CLK,
RR=>RR,
RA=>RA,
WR=>WR,
WA=>WA,
DATA_BUS=>IO);
process
begin
if count1 = 0 then
wait for 100ns;
end if;
wait for 100ns;
if(count1<11) then
WR <= '0';
wait on wa;
if wa = '0' then
io <= data - count1*3;
tmp(count1) <= to_integer(unsigned(data - count1*3));
count1<=count1 +1;
wait on wa;
if wa='1' then
io <=(others=>'Z');
wr <='1';
end if;
end if;
end if;
if(count1 = 11 and count2 <10) then
calc_val(count2) <= std_logic_vector(to_signed(((tmp(count2))/2 +
tmp(count2)/8 - tmp(count2+1)/8),8));
wait on rr;
if rr='0' then
ra <='0';
wait on io;
inpt_val(count2) <= io;
wait on clk;
wait on clk;
wait on clk;
wait on clk;
37
ra<='1';
count2<=count2+1;
end if;
end if;
end process;
end testbench;
38
Список використаної літератури
1. Павлов В.Н., Ногин В.Н. Схемотехника аналоговых электронных устройств:
Учебник для вузов.- М.: Горячая Линия, Телеком, 2001;
2. Хоровиц П., Хилл У. Искусство схемотехники.- М.: Мир,2001;
3. Бойко В.И. Схемотехника электронных систем. Цифровые устройства.- СПб.:
БХВ-Петербург, 2004;
4. Угрюмов Е.П. Цифровая схемотехника. — СПб.: БХВ — Санкт – Петербург,
2000;
5. Титце У., Шенк К. Полупроводниковая схемотехника. 12-е изд. Том II: Пер.
с нем.- М.: ДМК Пресс, 2007.
39
Додатки