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" &amp; curr_ir(3 DOWNTO 0) WHEN sel_data_ram='1' ELSE

curr_pc;

data <=

"000000" &amp; curr_acc WHEN write='1' ELSE

"ZZZZZZZZZZ";

-- завантаження регістра інструкцій новим кодом операції

next_ir <=

data WHEN ld_ir='1' ELSE

-- чи завантажити молодший нібл регістра інструкцій з пам'яті даних

curr_ir(9 DOWNTO 4) &amp; 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' &amp; curr_acc) + ('0' &amp; curr_ir(3 DOWNTO 0))

+ ("0000" &amp; 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"&amp; 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))&amp;not(data(2))&amp;not(data(1))&amp;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))&amp;not(data(2))&amp;not(data(1))&amp;not(data(0));

end if;

address <="0001110"; -- V операнд

if (clk'event and clk='1') then

operandX5 <= not(data(3))&amp;not(data(2))&amp;not(data(1))&amp;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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.