VHDL модель комп’ютера
Використання інструментального засобу Active-VHDL, розробка моделі універсального однокристального комп`ютера на основі гіпотетично неконвеєрного мікропроцесора. Виконання симуляції з тестуванням роботи мікропроцесорної системи на функціональному рівні.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | украинский |
Дата добавления | 28.12.2009 |
Размер файла | 16,2 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
1
Міністерство освіти та науки України
Інститут підприємництва і перспективних техологій
при Національному університеті ,,Львівська політехніка”
Курсовий проект
з дисципліни:
,,Проектування комп'ютерних систем та мереж”
на тему:
"VHDL модель комп'ютера"
Львів - 2007р.
Анотація
У даному курсовому проекті, з використанням інструментального засобу Active-VHDL фірми ALDEC, розроблено модель універсального однокристального комп`ютера на основі 4-розрядного гіпотетично неконвеєрного RISC-мікропроцесора GNOME. Також виконано симуляцію з наступним тестуванням роботи мікропроцесорної системи на функціональному рівні.
В останній час набуває поширення розробка обчислювальних систем з програмованою архітектурою (Configurable Computer). Поява програмованих логічних інтегральних схем (ПЛІС) з об'ємом до 1 млн. вентилів і більше, таких як Xilinx Virtex, дала потужний поштовх для розвитку цього напрямку. Мова VHDL була розроблена в Міністерстві оборони США на початку вісімдесятих років як мова для опису моделей апаратних засобів обчислювальної техніки (Hardware Description Language). В середині вісімдесятих років виробився особливий стиль написання програм, так званий стиль синтезу. Алгоритм, описаний стилем синтезу може бути відображений в конкретну логічну схему за допомогою компілятора-синтезатора логічних схем. Такі компілятори-синтезатори набули широкого розповсюдження в наш час як невід'ємна складова САПР для ПЛІС та НВІС. Найбільш відомими компіляторами - синтезаторами є Synopsys фірми Synopsys, Synplify фірми Synplicity, Leonardo фірми Exemplar, Metamor фірми Metalogic.
Відображення алгоритму на VHDL в логічну схему є взаємно однозначним та ін'єктивним, причому досягається найбільш високий ступінь розпаралелювання обчислень. Крім того, алгоритм на VHDL може відображати всі тонкі властивості обчислювального алгоритму, такі, як точно задана розрядність вхідних в проміжних даних, пряма логічна обробка бітів операндів, які неможливо безпосередньо відобразити засобами інших алгоритмічних мов. Це означає, що структура, одержана в результаті синтезу, відображає всі особливості початкового паралельного алгоритму.
Особливістю алгоритму, описаному на VHDL стилем для синтезу, є те, що він, як правило, може бути без змін відображений в декількох різних програмованих обчислювальних середовищах, таких як ПЛІС, що мають різну технологію і архітектуру. Таким чином, алгоритм на VHDL є мобільним між різними обчислювальними середовищами.
Зміст
1. Вхідні дані на проектування
2. Внутрішня структура байту
3. Програмна модель комп'ютера
4. Розробка архітектури рівня машинних інструкцій
5. Розробка тестової програми
6. Розробка VHDL моделі процесора
7. Розробка VHDL моделі пам'яті програм
8. Розробка VHDL моделі пам'яті даних
9. Розробка VHDL моделі обчислювального пристроя
10. Розробка VHDL моделі комп'ютера
11. Структурна схема комп'ютера
12. Синтез та імплементування VHDL моделі комп'ютера
13. Топологія проекту на робочій поверхні ПЛІС
14. Верифікація результатів проектування
15. Основні результати роботи
Література
Вхідні дані на проектування
Скласти, імплементувати та верифікувати VHDL модель чотирибітового вбудованого до ПЛІС комп'ютера, що містить процессор, пам'ять даних та пам'ть інструкцй. Цільові ПЛІС - від фірми Xilinx, родини Вір текс чи Спартан. САПР розробки - Xilinx WebPack, стимулятор ModelSim - Model Technologies. За основу процесора рівня машинних інструкцій прийнято архітектуру процесора Gnome фірми Xess.
Завдання щодо апаратури :
1.Додати до набору інструкцій інструкціюумовного переходу при умові, що акумулятор рівний нулю;
2.Розробити спеціалізований обчислювальний пристрій для обрахунку виразу:
y=x1 + x2 + x3 + x4, значення змінних прийняти наступними:
х1=11 , х2=25 , х3=60 , х4=17 .
Завдання щодо програмного забезпечення:
1.Скласти тестову програмку із наявних інструкцій.
Внутрішня структура байту
Комп'ютер, який проектується має чотирибітові дані та восьмибітові інструкції. Сусідні чотири біти формату, що утворюють поле певного призначення називають нібл. Один байт містить два нібли:
- найбільш значний нібл (MSN);
- найменш значний нібл (LSN).
Приймаємо, що нумерація бітів у байті відбувається зправа на ліво при цьому найбільш значним є сьомий лівий біт, а найменш значний перший правий.
Нумерація бітів у байті-інструкції:
9 8 7 6 5 4 3 2 1 0
MSN LSN
Нумерація бітів у байті-даних:
3 2 1 0
LSN
Програмна модель комп'ютера
Програмну модель нашого комп'ютера можна зобразити наступним рисунком:
Комп'ютер містить наступні важливі програмнокеровані вузли:
1.ALU -чотирирозрядний арифметико-логічний пристрій.
2.АСС - чотирирозрядний регістр-акумулятор.
3.Регістр прапорців C - прапорець переносу, Z - прапорець нульового результату.
4.РМ - програмна пам'ять з комірками в 10 біт та адресами 0х00-0хFF, може вміщувати 128 інструкцій.
5.DM - пам'ять даних з нібловими комірками та адресами 0х0-0хF.
Розробка архітектури рівня машинних інструкцій
Інформацію про інструкції, що виконує процесор подамо двома наступними табличками:
1.Перелік та функції машинних інструкцій процесора:
Мнемокод Символічний запис Функція
load #d ACC <= Rd Завантажити в акумулятор комірку Rd пам'яті даних за адресою d в межах [0..15]
load d ACC <= d Завантажити в акумулятор безпосередній операнд d в межах [0..15]
store #d Rd <= ACC Завантажити дані з акумулятора до комірки Rd пам'яті даних за адресою d в межах [0..15]
add d ACC <=ACC+d+C
C<=carry out Додати до акумулятора безпосередній операнд d межах [0..15] та прапорець переносу С; в результаті прапорець набуває нового значення
add #d ACC <=ACC+Rd+C
C<=carry out Додати до акумулятора вмістиме комірки Rd пам'яті даних за адресою d в межах [0..15] та прапорець переносу С; в результаті прапорець набуває нового значення
xor #d ACC <=ACC xor Rd Додати за модулем 2 до акумулятора вмістиме комірки Rd пам'яті даних за адресою d в межах [0..15]
test #d ACC<=ACC and Rd
Z<=1 when ACC=0
else Z<=0 Якщо в результаті логічного І вмістимого акумулятора та комірки Rd пам'яті даних за адресою d в межах [0..15] отримали 0, то встановити прапорець нульового результату Z в 1, інакше в 0
clear C C <= 0 Скинути прапорець переносу С
set C C <= 1 Встановити прапорець переносу в 1
skip C PC <= PC+1+C Якщо С=0 виконати наступну інструкцію інакше пропустити виконання наступної інструкції
skip Z PC <= PC+1+Z Якщо Z=0 виконати наступну інструкцію інакше пропустити виконання наступної інструкції
jump #a PC <= А Перейти до інструкції А пам'яті программ за адресою а в межах [0..127]
jaz #а PC<=А Перейти до інструкції А пам'яті программ за адресою а в межах [0..127] , якщо АСС=0
int Переривання спеціалізованого обчислювального пристрою
2.Кодування та виконання в часі машинних інструкцій:
Інстр. Кодування Fetch Decode Execute
load #d 000100 d3d2d1d0 IR<=(PC),
PC<=PC+1 [IR3..IR0] <=
([IR3..IR0]) ACC <= [IR3..IR0]
load d 000001 d3d2d1d0 IR<=(PC),
PC<=PC+1 ACC <= [IR3..IR0]
store #d 000011 d3d2d1d0 IR<=(PC),
PC<=PC+1 ([IR3..IR0]) <= ACC
add d 000010 d3d2d1d0 IR<=(PC),
PC<=PC+1 ACC <= ACC +
[IR3..IR0] + C
add #d 000101 d3d2d1d0 IR<=(PC),
PC<=PC+1 [IR3..IR0] <=
([IR3..IR0]) ACC <= ACC +
[IR3..IR0] + C
xor #d 000110 d3d2d1d0 IR<=(PC),
PC<=PC+1 [IR3..IR0] <=
([IR3..IR0]) ACC <= ACC xor
[IR3..IR0]
test #d 000111 d3d2d1d0 IR<=(PC),
PC<=PC+1 [IR3..IR0] <=
([IR3..IR0]) ACC <= ACC and
[IR3..IR0]
clear C 000000 0000 IR<=(PC),
PC<=PC+1 C<=0
set C 000000 0001 IR<=(PC),
PC<=PC+1 C<=1
skip C 000000 0010 IR<=(PC),
PC<=PC+1 PC <= PC + C
skip Z 000000 0011 IR<=(PC),
PC<=PC+1 PC <= PC + Z
jump #a 001a6a5a4 a3a2a1a0 IR<=(PC),
PC<=PC+1 PC <= [IR6..IR0]
jaz #а 011a6a5a4 a3a2a1a0 IR<=(PC),
PC<=PC+1 PC <= [IR6..IR0]
int 1111111111
1.IR - регістр інструкцій [IR7..IR0].
2.([IR3..IR0]) - комірка пам'яті, адресу якої містить молодший нібл [IR3..IR0] регістра IR.
3.d3d2d1d0 , a6a5a4a3a2a1a0 - окремі біти з формату машинної інструкції.
4.Виконання інструкції розділено на три послідовні дії:
- Fetch - вибирання інструкції з пам'яті інструкцій в регістр IR, обчислення адреси наступної інструкції за правилом: поточна адреса + 1;
- Decode - декодування поточної інструкції (читання операнда з пам'яті даних за адресою молодшого нібла IR;
- Execute - виконання поточної інструкції за її алгоритмом.
Розробка тестової програми
Адреса Машинний код Асемблер Коментар
0000 Load #1 Iніціалізувати регістри числами, що додаються, а саме:
0x11 + 0x25 + 0х60 + 0х17 = AD.
0001 Store R0
0002 Load #1
0003 Store R1
0004 Load #5
0005 Store R2
0006 Load #2
0007 Store R3
0008 Load #0
0009 Store R4
000a Load #6
000b Store R5
000c Load #7
000d Store R6
000e Load #1
000f Store R7
0010 Clear C
0011 Load R0
Add R2
Store R8
Load R1
Add R3
Store R9
Load R4
Add R6
Store R10
Load R5
Add R7
Store R11
Load R8
Add R10
Store R12
Load R9
Add R11
Store R13
Loop:
Load R12
Load R13
Jump #loop
Адреса Машинний код Асемблер Коментар
0000 18 Load #1
Iніціалізувати регістри числами, що додаються, а саме:
0x29 + 0x48 = 0x71.
Обнулити перенос.
Знайти суму молодших цифр і зберігти в R4.
Додати старші цифри + перенос. Зберігти суму старших цифр в R5.
0001 30 Store R0
0002 14 Load #1
0003 31 Store R1
0004 19 Load #5
0005 32 Store R2
0006 12 Load #2
0007 33 Store R3
0008 00 Clear C
0009 40 Load R0
000a 52 Add R2
000b 34 Store R4
000c 41 Load R1
000d 53 Add R3
000e 35 Store R5
Loop:
000f 44 Load R4 Показати мол. цифру.
Показати старшу цифру.
Показувати безперервно.
0010 45 Load R5
0011 8f Jump #loop
Адреса в ROM Мнемокод Машинний код
00 LOAD 1 000001 0001
01 STORE #A 000011 1010
02 LOAD 2 000001 0010
03 JAZ #0E 011 0001110
04 STORE #B 000011 1011
05 LOAD 6 000001 0110
06 STORE #C 000011 1100
07 LOAD 7 000001 0111
08 STORE #D 000011 1101
09 LOAD 3 000001 0011
0A STORE #E 000011 1110
0B LOAD 0 000001 0000
0C JAR #0E 011 0001110
0D CLEAR C 0000000000
0E INT 1111111111
0F LOAD #F 000100 1111
10 JUMP #0F 001 0001111
Розробка VHDL моделі процесора
--Підєднані бібліотеки
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
--Інтерфейси процесора
ENTITY CPU IS
PORT(
clk : IN STD_LOGIC; -- тактові імпульси
reset : IN STD_LOGIC; -- скид процесора
address : OUT STD_LOGIC_VECTOR (6 DOWNTO 0); -- шина адрес
data : INOUT STD_LOGIC_VECTOR (9 DOWNTO 0); -- шина даних
web : OUT STD_LOGIC; -- високий рівень - дозвіл читання RAM
-- низький рівень -дозвіл читання ROM
oeb : OUT STD_LOGIC; -- високий рівень - дозвіл видачі даних з RAM
sel_ram : OUT std_logic; -- вибір RAM
int_inq : OUT STD_LOGIC; -- запит на переривання
int_ans : IN STD_LOGIC; -- підтвердження переривання
-- допоміжні сигнали
carry_out : OUT STD_LOGIC;
-- вивід вмістимого прапорця переносу CARRY
pc_out : OUT STD_LOGIC_VECTOR (6 DOWNTO 0);
-- вивід вмістимого лічильника команд PC
ir_out : OUT STD_LOGIC_VECTOR (9 DOWNTO 0);
-- вивід вмістимого регістра інструкці IR
acc_out : OUT STD_LOGIC_VECTOR (3 DOWNTO 0)
-- вивід вмістимого акумулятора ACC
);
END CPU;
-- Архітектура процесора
ARCHITECTURE CPU OF CPU IS
SIGNAL curr_st, next_st: STD_LOGIC_VECTOR (1 DOWNTO 0);
-- поточне та наступне значення лічильника команд
SIGNAL curr_pc, next_pc: STD_LOGIC_VECTOR (6 DOWNTO 0);
-- поточне та наступне значення акумулятора
SIGNAL curr_acc, next_acc: STD_LOGIC_VECTOR (3 DOWNTO 0);
-- поточне та наступне значення прапорця переносу
SIGNAL curr_carry, next_carry: STD_LOGIC;
-- поточне та наступне значення прапорця нульового результату
SIGNAL curr_zero, next_zero: STD_LOGIC;
-- проміжне значення сигналів переривання
SIGNAL inquire,answer: STD_LOGIC;
-- поточний та наступний регістри інструкцій
SIGNAL curr_ir, next_ir: STD_LOGIC_VECTOR(9 DOWNTO 0);
-- код операції АЛП
SIGNAL alu_op: STD_LOGIC_VECTOR (2 DOWNTO 0);
-- стани процесора
CONSTANT FETCH: STD_LOGIC_VECTOR (1 DOWNTO 0) := "00";
-- вибирання інструкції з пам'яті
CONSTANT DECODE: STD_LOGIC_VECTOR (1 DOWNTO 0) := "01";
-- декодування інструкції
CONSTANT EXECUTE: STD_LOGIC_VECTOR (1 DOWNTO 0) := "11";
-- виконання інструкції
-- тимчасовий результат суматора
SIGNAL sum : STD_LOGIC_VECTOR (4 DOWNTO 0);
SIGNAL read : STD_LOGIC; -- 1 при читанні RAM
SIGNAL write : STD_LOGIC; -- 1 при запису в RAM
SIGNAL sel_data_ram: STD_LOGIC; -- 1 при вводі адреси [R0-R15]
SIGNAL jump_pc : STD_LOGIC; -- 1 при перезаписі PC
SIGNAL inc_pc : STD_LOGIC; -- 1 при інкременті PC
SIGNAL ld_ir : STD_LOGIC; -- 1 при завантаженні IR
SIGNAL ld_ir_lsn : STD_LOGIC; -- 1 при завантаженні LSN з IR
-- можливі коди операцій АЛП
CONSTANT PASS_OP : STD_LOGIC_VECTOR (2 DOWNTO 0) := "001"; -- pass input to output
CONSTANT ADD_OP : STD_LOGIC_VECTOR (2 DOWNTO 0) := "010"; -- додавання
CONSTANT XOR_OP : STD_LOGIC_VECTOR (2 DOWNTO 0) := "011"; -- виключне АБО
CONSTANT AND_OP : STD_LOGIC_VECTOR (2 DOWNTO 0) := "100"; -- логічне І
CONSTANT SET_CARRY_OP: STD_LOGIC_VECTOR (2 DOWNTO 0) := "101";
-- встановлення прапорця переносу
CONSTANT CLR_CARRY_OP: STD_LOGIC_VECTOR (2 DOWNTO 0) := "110";
-- скид прапорця прерносу
-- присвоєння константам значень коду операцій
CONSTANT CLEAR_C : STD_LOGIC_VECTOR (9 DOWNTO 0) := "0000000000";
CONSTANT SET_C : STD_LOGIC_VECTOR (9 DOWNTO 0) := "0000000001";
CONSTANT SKIP_C : STD_LOGIC_VECTOR (9 DOWNTO 0) := "0000000010";
CONSTANT SKIP_Z : STD_LOGIC_VECTOR (9 DOWNTO 0) := "0000000011";
CONSTANT LOAD_IMM : STD_LOGIC_VECTOR (5 DOWNTO 0) := "000001";
CONSTANT ADD_IMM : STD_LOGIC_VECTOR (5 DOWNTO 0) := "000010";
CONSTANT STORE_DIR: STD_LOGIC_VECTOR (5 DOWNTO 0) := "000011";
CONSTANT LOAD_DIR : STD_LOGIC_VECTOR (5 DOWNTO 0) := "000100";
CONSTANT ADD_DIR : STD_LOGIC_VECTOR (5 DOWNTO 0) := "000101";
CONSTANT XOR_DIR : STD_LOGIC_VECTOR (5 DOWNTO 0) := "000110";
CONSTANT TEST_DIR : STD_LOGIC_VECTOR (5 DOWNTO 0) := "000111";
CONSTANT INT : STD_LOGIC_VECTOR (9 DOWNTO 0) := "1111111111";
CONSTANT JUMP : STD_LOGIC_VECTOR (2 DOWNTO 0) := "001";
CONSTANT JAZ : STD_LOGIC_VECTOR (2 DOWNTO 0) := "011";
BEGIN
int_inq <= inquire;
answer <= int_ans;
carry_out <= curr_carry;
pc_out <= curr_pc;
acc_out <= curr_acc;
ir_out <= curr_ir;
-- зовнішні сигнали керуваня пам'ттю
sel_ram <=
'Z' WHEN answer = '1' ELSE
sel_data_ram;
oeb <=
'Z' WHEN answer = '1' ELSE
NOT(read);
web <=
'Z' WHEN answer = '1' ELSE
NOT(write);
-- встановлення адреси зовнішньої пам'яті даних чи програм
address <=
"ZZZZZZZ" WHEN answer = '1' ELSE
"000" & curr_ir(3 DOWNTO 0) WHEN sel_data_ram='1' ELSE
curr_pc;
data <=
"000000" & curr_acc WHEN write='1' ELSE
"ZZZZZZZZZZ";
-- завантаження регістра інструкцій новим кодом операції
next_ir <=
data WHEN ld_ir='1' ELSE
-- чи завантажити молодший нібл регістра інструкцій з пам'яті даних
curr_ir(9 DOWNTO 4) & data(3 DOWNTO 0) WHEN ld_ir_lsn='1' ELSE
-- чи регістр інструкцій не змінюється
curr_ir;
-- завантаження лічильника команд
next_pc <=
-- адресою переходу з регістра інструкцій
curr_ir(6 DOWNTO 0) WHEN jump_pc='1' ELSE
-- чи збільшення лічильника команд на 1
curr_pc+1 WHEN inc_pc='1' ELSE
-- чи лічильник команд залишається без змін
curr_pc;
-- ОПЕРАЦІЙНИЙ АВТОМАТ ПРОЦЕСОРА
PROCESS (alu_op,curr_zero,curr_carry,curr_acc,curr_ir,sum)
BEGIN
-- встановлення початкових значень
sum <= "00000";
next_acc <= "0000";
next_carry <= '0';
next_zero <= '0';
CASE alu_op IS
WHEN ADD_OP =>
-- додавання до акумулятора молодшого нібла регістра інструкцій
-- та прапорця переносу
sum <= ('0' & curr_acc) + ('0' & curr_ir(3 DOWNTO 0))
+ ("0000" & curr_carry);
next_acc <= sum(3 DOWNTO 0);
-- молодший нібл акумулятора містить суму
next_carry <= sum(4); -- прапорця переносу змінюється в залежності
-- від результату
next_zero <= curr_zero;
-- прапорець нульвого результату не змінюється
WHEN XOR_OP =>
-- додавання за модулем 2 до акумулятора молдшого нібла регістра інструкцій
next_acc <= curr_acc XOR curr_ir(3 DOWNTO 0);
next_carry <= curr_carry; -- прапорця переносу не змінюється
next_zero <= curr_zero; -- прапорець нульвого результату не
-- змінюється
WHEN PASS_OP =>
-- завантаження в акумулятор молодшого нібла регістра інструкцій
next_acc <= curr_ir(3 DOWNTO 0);
next_carry <= curr_carry; -- прапорця переносу не змінюється
next_zero <= curr_zero; -- прапорець нульвого результату не
-- змінюється
WHEN AND_OP =>
-- логічне І акумулятора та молодшго нібла регістра інструкцій
next_acc <= curr_acc; -- акумулятор незмінюється
next_carry <= curr_carry; -- прапорця переносу не змінюється
-- прапорець нульвого результату змінюється
-- в залежності від операції логічного І
next_zero <= NOT ((curr_acc(3) AND curr_ir(3))
OR (curr_acc(2) AND curr_ir(2))
OR (curr_acc(1) AND curr_ir(1))
OR (curr_acc(0) AND curr_ir(0)));
WHEN SET_CARRY_OP =>
-- встановлення прапорця переносу
next_acc <= curr_acc; -- акумулятор незмінюється
next_carry <= '1';
next_zero <= curr_zero; -- прапорець нульвого результату не
-- змінюється
WHEN CLR_CARRY_OP =>
-- скид прапорця переносу
next_acc <= curr_acc; -- акумулятор незмінюється
next_carry <= '0';
next_zero <= curr_zero; -- прапорець нульвого результату не
-- змінюється
WHEN OTHERS =>
-- невизначений код операції стану процесора не змінює
next_acc <= curr_acc;
next_carry <= curr_carry;
next_zero <= curr_zero;
END CASE;
END PROCESS;
-- ПРИСТРІЙ КЕРУВАННЯ
PROCESS (curr_st,curr_carry,curr_zero,curr_ir)
BEGIN
sel_data_ram <= '0';
read <= '0';
write <= '0';
ld_ir <= '0';
ld_ir_lsn <= '0';
inc_pc <= '0';
jump_pc <= '0';
inquire <= '0';
alu_op <= "000";
CASE curr_st IS
WHEN FETCH => -- стан вибирання інструкції з пам'яті інструкцій
sel_data_ram <= '0';-- вибір пам'ті інструкцій
read <= '1'; -- встановлення сигналу дозволу читання пам'яті
-- інструкцій
ld_ir <= '1'; -- завантаження інструкції до регістра інструкцій
inc_pc <= '1'; -- збільшення лічильника команд на одиницю
next_st <= DECODE; -- перехід до наступного стану
WHEN DECODE => -- стан декодування інструкції
-- завантаження операнда з пам'яті даних за
-- адресою в молодшому ніблі регістра інструкцій
IF curr_ir(9 DOWNTO 0)=INT THEN
inquire <='1';
END IF;
IF curr_ir(9 DOWNTO 4)=LOAD_DIR THEN
sel_data_ram <= '1';
read <= '1';
ld_ir_lsn <= '1';
END IF;
IF curr_ir(9 DOWNTO 4)=ADD_DIR THEN
sel_data_ram <= '1';
read <= '1';
ld_ir_lsn <= '1';
END IF;
IF curr_ir(9 DOWNTO 4)=XOR_DIR THEN
sel_data_ram <= '1';
read <= '1';
ld_ir_lsn <= '1';
END IF;
IF curr_ir(9 DOWNTO 4)=TEST_DIR THEN
sel_data_ram <= '1';
read <= '1';
ld_ir_lsn <= '1';
END IF;
IF (answer = '0') THEN -- перехід до наступного стану
next_st <= EXECUTE;
ELSE next_st <= DECODE;
END IF;
WHEN EXECUTE => -- стан виконаня інструкції
IF curr_ir=CLEAR_C THEN
alu_op <= CLR_CARRY_OP;-- скид прапорця переносу
END IF;
IF curr_ir=SET_C THEN
alu_op <= SET_CARRY_OP;-- встановлення прапорця переносу
END IF;
IF curr_ir=SKIP_C THEN -- перехід до наступної інструкції
-- якщо прапорець переносу встановлений
inc_pc <= curr_carry;
END IF;
IF curr_ir=SKIP_Z THEN -- перехід до наступної інструкції
-- якщо прапорець нульвого результату встановлений
inc_pc <= curr_zero;
END IF;
IF curr_ir(9 DOWNTO 4)=LOAD_IMM THEN
-- завантажити в акумулятор безпосередній
-- операнд, який знаходиться в молодшому ніблі регістра інструкцій
alu_op <= PASS_OP;
END IF;
IF curr_ir(9 DOWNTO 4)=ADD_IMM THEN
-- додати до акумулятора молодший нібл регістра інструкцій
alu_op <= ADD_OP;
END IF;
IF curr_ir(9 DOWNTO 7)=JUMP THEN
-- перейти до команди за адресою, яка знаходиться
-- в семи молодших бітах регістра інструкцій
jump_pc <= '1';
END IF;
IF curr_ir(9 DOWNTO 7)= JAZ THEN
-- перейти до команди за адресою, яка знаходиться
-- в семи молодших бітах регістра інструкцій
-- якщо акумулятор рівний нулю
IF (curr_acc = "0000")THEN
jump_pc <= '1';
END IF;
END IF;
IF curr_ir(9 DOWNTO 4)=STORE_DIR THEN
-- зберегти акумулятор в пам'яті даних
sel_data_ram <= '1';
write <= '1';
END IF;
IF curr_ir(9 DOWNTO 4)=LOAD_DIR THEN
-- завантажити прочитані дані на стані
-- декодування до акумулятора
alu_op <= PASS_OP;
END IF;
IF curr_ir(9 DOWNTO 4)=ADD_DIR THEN
-- додати прочитані дані на стані декодування до акумулятора
alu_op <= ADD_OP;
END IF;
IF curr_ir(9 DOWNTO 4)=XOR_DIR THEN
-- додати за модулем 2 прочитані дані
-- на стані декодування до акумулятора
alu_op <= XOR_OP;
END IF;
IF curr_ir(9 DOWNTO 4)=TEST_DIR THEN
-- якщо результат логічного І прочитаних даних на стані
-- декодування та акумулятора рівний 0 встановити прапорець
--нульвого результату в 1 інакше - в 0
alu_op <= AND_OP;
END IF;
next_st <= FETCH; -- стан виконання інструкції закінчився
-- перехід до нового стану процесора
WHEN OTHERS =>
END CASE;
END PROCESS;
PROCESS (clk,reset)
BEGIN
-- асинхронний скид процесора
IF reset='1' THEN
curr_st <= FETCH; -- перехід процесора в стан вибирання інструкцї
curr_pc <= "0000000"; -- скид лічилиника команд
curr_ir <= "0000000000"; -- скид регістра інструкцій
curr_acc <= "0000"; -- скид акумулятора
curr_carry <= '0'; -- скид прапорця переповнення
curr_zero <= '0'; -- скид прапорця нульвого результату
-- обновлення процесора синхронно високому рівню тактового імпульсу
ELSIF (clk'event AND clk='1') THEN
curr_st <= next_st; -- перехід на новий стан процесора
curr_pc <= next_pc; -- обновлення лічильника команд
curr_ir <= next_ir; -- обновлення регістра інструкцій
curr_acc <= next_acc; -- обновлення акумулятора
curr_carry <= next_carry; -- обновлення прапорця переповнення
curr_zero <= next_zero; -- обновлення прапорця нульвого результату
END IF;
END PROCESS;
END CPU;
Розробка VHDL моделі пам'яті даних
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity RAM is
port (
clk : in std_logic;
oe : in std_logic;
we : in std_logic;
sel_ram : in std_logic;
address : in std_logic_vector (6 downto 0);
data : inout std_logic_vector(9 downto 0));
end RAM;
architecture RAM of RAM is
type ram_type is array (15 downto 0)of std_logic_vector (3 downto 0);
signal RAM : ram_type;
begin
process (clk)
begin
if (clk'event and clk = '1') then
if ((sel_ram = '1')and (oe='1')and (we='0')) then
RAM(conv_integer(address(3 downto 0))) <= data (3 downto 0);
end if;
end if;
end process;
data <= "000000"& RAM(conv_integer(address(3 downto 0)))
when ((sel_ram='1') and (oe='0') and (we='1')) else
"ZZZZZZZZZZ";
end RAM;
Розробка VHDL моделі пам'яті програм
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity ROM is
port (
sel_ram : in std_logic;
oe : in std_logic;
address : in std_logic_vector (6 downto 0);
data : inout std_logic_vector (9 downto 0));
end ROM;
architecture ROM of ROM is
subtype ROM_WORD is std_logic_vector (9 downto 0);
type ROM_TABLE is array (0 to 19) of ROM_WORD;
constant ROM: ROM_TABLE := ROM_TABLE '(
ROM_WORD '("0000010001"),
ROM_WORD '("0000111010"),
ROM_WORD '("0000010010"),
ROM_WORD '("0110001110"),
ROM_WORD '("0000111011"),
ROM_WORD '("0000010110"),
ROM_WORD '("0000111100"),
ROM_WORD '("0000010111"),
ROM_WORD '("0000111101"),
ROM_WORD '("0000010011"),
ROM_WORD '("0000111110"),
ROM_WORD '("0000010000"),
ROM_WORD '("0110001110"),
ROM_WORD '("0000000000"),
ROM_WORD '("1111111111"),
ROM_WORD '("0001001111"),
ROM_WORD '("0010001111"),
ROM_WORD '("0000000000"),
ROM_WORD '("0000000000"),
ROM_WORD '("0000000000"));
begin
data <= ROM(conv_integer (address(5 downto 0)))
when (oe='0' and sel_ram='0') else
"ZZZZZZZZZZ";
end ROM;
Розробка VHDL моделі спеціалізованого обчислювача
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY PU IS
PORT(
clk : in std_logic;
oeb : out std_logic;
web : out std_logic;
sel_ram : out std_logic;
int_inq : in std_logic; -- запит переривання
int_ans : out std_logic; -- підтвердження переривання
address : out std_logic_vector (6 downto 0);
data : inout std_logic_vector (3 downto 0));
END PU;
ARCHITECTURE Behavioral OF PU IS
SIGNAL operandX1 : STD_LOGIC_VECTOR (3 DOWNTO 0);
SIGNAL operandX2 : STD_LOGIC_VECTOR (3 DOWNTO 0);
SIGNAL operandX3 : STD_LOGIC_VECTOR (3 DOWNTO 0);
SIGNAL operandX4 : STD_LOGIC_VECTOR (3 DOWNTO 0);
SIGNAL operandX5 : STD_LOGIC_VECTOR (3 DOWNTO 0);
SIGNAL functionY : STD_LOGIC_VECTOR (3 DOWNTO 0);
SIGNAL read : STD_LOGIC;
SIGNAL write : STD_LOGIC;
SIGNAL select_ram : STD_LOGIC;
SIGNAL answer : STD_LOGIC;
begin
web <= write;
oeb <= read;
sel_ram <= select_ram;
int_ans <= answer;
data <=
functionY(3 downto 0) when (write='1') else
"ZZZZ";
process (clk,int_inq)
begin
answer <= '0';
select_ram <= 'Z';
write <= 'Z';
read <= 'Z';
address <="ZZZZZZZ";
if (int_inq = '1') then
answer <= `1';
select_ram <= '1';
write <= '0';
read <= '1';
-- вибирання операндів з пям'яті даних
address <="0001010"; -- І операнд
if (clk'event and clk='1') then
operandX1 <= data;
end if;
address <="0001011"; -- ІІ операнд
if (clk'event and clk='1') then
operandX2 <= not(data(3))&not(data(2))&not(data(1))&not(data(0));
end if;
address <="0001100"; -- ІІІ операнд
if (clk'event and clk='1') then
operandX3 <= data;
end if;
address <="0001101"; -- ІV операнд
if (clk'event and clk='1') then
operandX4 <= not(data(3))&not(data(2))&not(data(1))&not(data(0));
end if;
address <="0001110"; -- V операнд
if (clk'event and clk='1') then
operandX5 <= not(data(3))&not(data(2))&not(data(1))&not(data(0));
end if;
-- обчислення функції
functionY <= (operandX1) +
(operandX2) +
(operandX3) +
(operandX4) +
(operandX5) +
("0011") ;
-- запис результату в пам'ять даних
address <="0001111";
write <='1';
read <='0';
end if;
end process;
END Behavioral;
Розробка VHDL моделі комп'ютера
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity TOP is
port (
clk : in std_logic;
reset : in std_logic;
we_view : out std_logic;
oe_view : out std_logic;
sel_ram_view: out std_logic;
int_inq_view: out std_logic;
int_ans_view: out std_logic;
carry_view : out std_logic;
pc_view : out std_logic_vector (6 downto 0);
acc_view : out std_logic_vector (3 downto 0);
data_view : out std_logic_vector (9 downto 0);
addr_view : out std_logic_vector (6 downto 0);
ir_view : out std_logic_vector (9 downto 0));
end TOP;
architecture Behavioral of TOP is
component cpu port( -- компонент-процесор
clk : in std_logic;
reset : in std_logic;
address : out std_logic_vector (6 downto 0);
data : inout std_logic_vector (9 downto 0);
web : out std_logic;
oeb : out std_logic;
sel_ram : out std_logic;
carry_out : out std_logic;
int_inq : out std_logic;
int_ans : in std_logic;
pc_out : out std_logic_vector (6 downto 0);
ir_out : out std_logic_vector (9 downto 0);
acc_out : out std_logic_vector (3 downto 0));
end component;
component rom port( -- компонент пам'ять інструкцій
sel_ram : in std_logic;
oe : in std_logic;
address : in std_logic_vector (6 downto 0);
data : inout std_logic_vector (9 downto 0));
end component;
component ram port( -- компонент пам'ять даних
clk : in std_logic;
sel_ram : in std_logic;
oe : in std_logic;
we : in std_logic;
address : in std_logic_vector (6 downto 0);
data : inout std_logic_vector(9 downto 0));
end component;
component pu port( -- компонент-обчислювальний пристрій
clk : in std_logic;
address : out std_logic_vector (6 downto 0);
data : inout std_logic_vector (3 downto 0);
web : out std_logic;
oeb : out std_logic;
sel_ram : out std_logic;
int_inq : in std_logic;
int_ans : out std_logic);
end component;
signal w_clk : std_logic;
signal w_reset : std_logic;
signal b_address: std_logic_vector (6 DOWNTO 0);
signal b_data : std_logic_vector (9 DOWNTO 0);
signal w_web : std_logic;
signal w_oeb : std_logic;
signal w_sel_ram: std_logic;
signal w_int_inq: std_logic;
signal w_int_ans: std_logic;
begin
oe_view <= w_oeb;
sel_ram_view <= w_sel_ram;
w_clk <= clk;
w_reset <= reset;
data_view <= b_data;
addr_view <= b_address;
we_view <= w_web;
int_inq_view <= w_int_inq;
int_ans_view <= w_int_ans;
U1: cpu port map(
clk => w_clk,
reset => w_reset,
address => b_address,
data => b_data,
web => w_web,
oeb => w_oeb,
int_inq => w_int_inq,
int_ans => w_int_ans,
sel_ram => w_sel_ram,
carry_out => carry_view,
pc_out => pc_view,
ir_out => ir_view,
acc_out => acc_view);
U2: rom port map(
sel_ram => w_sel_ram,
oe => w_oeb,
address => b_address,
data => b_data);
U3: ram port map(
clk => w_clk,
sel_ram => w_sel_ram,
oe => w_oeb,
we => w_web,
address => b_address,
data => b_data);
U4: pu port map(
clk => w_clk,
address => b_address,
data => b_data(3 downto 0),
web => w_web,
oeb => w_oeb,
sel_ram => w_sel_ram,
int_inq => w_int_inq,
int_ans => w_int_ans);
end Behavioral;
Схемне позначення комп'ютера
Синтез та імплементування VHDL моделі комп'ютера
Витяги із звітів про результати синтезу та імплементування:
1.Виявлені в проекті апаратні вузли:
HDL Synthesis Report
Macro Statistics
# RAMs : 1
16x4-bit single-port distributed RAM : 1
# ROMs : 3
20x10-bit ROM : 1
4x1-bit ROM : 2
# Adders/Subtractors : 7
4-bit adder : 5
5-bit adder : 2
# Counters : 1
7-bit up counter : 1
# Registers : 7
1-bit register : 2
10-bit register : 1
3-bit register : 1
4-bit register : 3
# Latches : 1
4-bit latch : 1
# Multiplexers : 4
1-bit 4-to-1 multiplexer : 2
7-bit 4-to-1 multiplexer : 1
7-bit 8-to-1 multiplexer : 1
# Tristates : 12
1-bit tristate buffer : 6
10-bit tristate buffer : 3
4-bit tristate buffer : 1
7-bit tristate buffer : 2
# Xors : 1
4-bit xor2 : 1
* Advanced HDL Synthesis *
Loading device for application Rf_Device from file 'v50.nph' in environment C:\Xilinx.
Advanced HDL Synthesis Report
Macro Statistics
# RAMs : 1
16x4-bit single-port distributed RAM : 1
# ROMs : 3
20x10-bit ROM : 1
4x1-bit ROM : 2
# Adders/Subtractors : 7
4-bit adder : 5
5-bit adder : 2
# Counters : 1
7-bit up counter : 1
# Registers : 27
Flip-Flops : 27
# Latches : 1
4-bit latch : 1
# Multiplexers : 4
1-bit 4-to-1 multiplexer : 2
7-bit 4-to-1 multiplexer : 1
7-bit 8-to-1 multiplexer : 1
# Xors : 1
4-bit xor2 : 1
2.Апаратні витрати:
Device utilization summary:
Number of External IOBs 46 out of 88 52%
Number of LOCed External IOBs 0 out of 46 0%
Number of SLICEs 64 out of 256 25%
Number of BUFGMUXs 1 out of 16 6%
Number of TBUFs 64 out of 128 50%
3.Показники швидкодії комп'ютера:
Timing Summary:
Speed Grade: -6
Minimum period: 8.519ns (Maximum Frequency: 117.388MHz)
Minimum input arrival time before clock: No path found
Maximum output required time after clock: 10.636ns
Maximum combinational path delay: No path found
Споживана потужність робочого проекту:
Верифікація результатів проектування
Основні результати роботи
Висновок:
В данному курсовому проекті я розроби VHDL модель комп'ютера, який складається із наступних вузлів:
CPU - основний процесор;
RAM - пам'ять даних;
ROM - пам'ять інструкцій;
PU - спеціалізований обчислювальний пристрій.
Усі основні вузли я використав із запропонованих в методичних вказівках крім спеціалізованого обчислювального пристрою, який я розробив. Також для вводу додаткової інструкції виникла необхідність розширити слова інструкцій з 8біт до 10біт, що викликало зміну розрядності пам'яті інструкцій та шини даних. Введені додаткові інструкції: умовного переходу за умови, що акумулятор рівний нулю та обробки переривання спеціалізованим пристроєм.
Використана література
1.Троценко В.В. - VHDL модель комп'ютера ;
методичні вказівки до курсового проекту 21с.
2.www.xilinx.com
3.www.xess.com
4.www.model.com
Подобные документы
Синтез на основі поведінкового опису, виконаний розробниками на мові програмування класу HDL, як перспективний напрямок проектування цифрових пристроїв. Опис RISC-архітектури комп'ютерів. VHDL-модель прототипу RISC-комп'ютера. Основні модулі моделей.
курсовая работа [1,1 M], добавлен 23.01.2014Загальні відомості про мову VHDL, яка використовуються для проектування цифрових електронних систем та створення програмного продукту, її елементи. Способи структуризації програми, принципи об’єктно-орієнтованого програмування, засоби налагоджування.
курсовая работа [34,9 K], добавлен 09.06.2010Програми, які виводять на екран характеристики комп'ютера. Розробка програми "Монітор використання ресурсів комп’ютера" на мові програмування ASM-86. Алгоритм програми та її реалізація. Системні вимоги, інструкція для користувача, лістинг програми.
курсовая работа [22,2 K], добавлен 08.08.2009"Критичні" комплектуючі комп'ютера. Процесор та оперативна пам'ять. Швидкість роботи комп'ютера. Порівняння швидкодії комплектуючих з роботою еталонних моделей. Стратегія і варіанти модернізації. Функціональні особливості побудови материнської плати.
курсовая работа [4,6 M], добавлен 24.06.2013Основні блоки персонального комп'ютера та їх значення. Варіанти організації внутрішньомашиного інтерфейсу. Функціональна схема мікропроцесору. Види запам'ятовуючих пристроїв. Послідовність роботи блоків комп'ютера. Основні зовнішні та внутрішні пристрої.
курсовая работа [346,8 K], добавлен 05.01.2014Історія появи перших обчислювальних машин. Пам'ять як один із основних елементів комп'ютера, що дозволяє йому нормально функціонувати. Значення внутрішньої пам'яті комп'ютера з позиції зберігання інформації. Аналіз зовнішньої пам’яті та її модернізація.
реферат [24,4 K], добавлен 27.12.2011Огляд та класифікація комп'ютерних ігор. Алгоритм розташування кораблів на ігровому полі. Виконання алгоритму гри комп'ютера з використанням методу випадкових чисел. Стратегія гри комп'ютера. Обґрунтування вибору середовища програмної реалізації.
курсовая работа [616,5 K], добавлен 26.01.2023Опис результату розробки архітектури пристрою та його структурної схеми на рівні міжрегістрових передач. Система для виконання тестування пристрою, результати його симуляції у формі часових діаграм. Cинтез розробленої VHDL-моделі пристрою в ПЛІС.
курсовая работа [1,2 M], добавлен 03.03.2015Основні принципи дії та архітектура прототипних варіантів CISC-комп'ютера. Інструкції асемблерної мови і принцип трансляції асемблерної програми у машинний код. Розробка тестової програми. Перевірка правильності роботи реалізованих команд у прикладах.
курсовая работа [446,1 K], добавлен 03.02.2011Загальні дані та основні поняття мікропроцесорної техніки. Архітектура центрального персонального комп’ютера, її види та властивості. Головні відомості про технології SMM, SSE. Сторінковий режим роботи DRAM. Характеристика та елементи жорстких дисків.
контрольная работа [820,7 K], добавлен 04.10.2009