МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Кафедра ЕОМ
/
КУРСОВА РОБОТА
з дисципліни:
«Дослідження і проектування комп'ютерних систем та мереж»
на тему:
«Розробка VHDL моделі комп’ютера»
Львів – 2017
АНОТАЦІЯ
В курсовій роботі розроблено тестову програму та на її основі реалізовано VHDL модель одноциклового RISC комп’ютера з архітектурою SPIM.
Також досліджено середовище розробки САПР Xilinx WebPack, та ознайомлено з основними принципами його роботи.
Проведено часову верифікацію комп’ютера та експериментально підтверджено результати, які були прогнозовані на початку проектування.
ЗМІСТ
ВСТУП 4
1. ВИХІДНІ ДАНІ НА ПРОЕКТУВАННЯ 5
2. РОЗРОБКА АРХІТЕКТУРИ РІВНЯ МАШИННИХ ІНСТРУКЦІЙ 6
3. СИНТЕЗ СТРУКТУРИ SPIM RISC КОМП’ЮТЕРА 9
4. РОЗРОБКА ТЕСТОВОЇ ПРОГРАМИ 11
5. РОЗРОБКА VHDL МОДЕЛІ КОМП’ЮТЕРА 13
5.1. Розробка VHDL моделі процесора 13
5.1.1. Модуль ID 13
5.1.2. Модуль EXE 15
5.1.3. Модуль керування 17
5.2. Розробка VHDL моделі пам’яті програм 18
5.3. Розробка VHDL моделі пам’яті даних 20
5.4. Розробка VHDL моделі комп’ютера 22
6. СИНТЕЗ І ІМПЛЕМЕНТУВАННЯ VHDL МОДЕЛІ КОМП’ЮТЕРА 25
7. ВЕРИФІКАЦІЯ РЕЗУЛЬТАТІВ ПРОЕКТУВАННЯ 26
ВИСНОВКИ 28
СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ 29
ВСТУП
Одним з перспективних напрямків проектування цифрових пристроїв є їх синтез на основі поведінкового опису, виконаний розробниками на мові програмування класу HDL.
Основними складовими частинами процесу проектування є:
1. Етап передпроектних досліджень – вивчення потреб науково-технічних досягнень наявних ресурсів.
2. Технічне завдання, яке включає:
призначення системи;
умови експлуатації, які є виражені якісними або часовими характеристиками;
вимоги до вихідних параметрів, виражені у вигляді умов працездатності.
3. Технічна пропозиція – визначає основні принципи побудови системи, можливість і доцільність проектування.
4. Ескізний проект – перевірка коректності основних принципів і положень, що визначають функціональність майбутнього об’єкта.
5. Технологічний проект – передбачає всебічну розробку частин проекту, конкретних технологічних рішень.
6. Робочий проект – формування всієї необхідної документації для виготовлення системи, створення і випробування дослідного зразка або пробної партії.
7. Випробування і ввід в експлуатацію – за результатами випробування в проектну документацію вносять зміни після чого здійснюється впровадження у виробництво.
ВИХІДНІ ДАНІ НА ПРОЕКТУВАННЯ
Розробити тестову програму та на її основі VHDL модель одноциклового RISC комп’ютера з архітектурою SPIM (MIPS, DLX). VHDL модель синтезувати і імплементувати. Цільовою є ПЛІС фірми Xilinx, а інструментом проектування – САПР Xilinx WebPack.
Верифікувати імплементовану модель часовим симулюванням її поведінки на рівні вентилів. Експериментально підтвердити отримане під час синтезу та імплементування досягнуте значення тактової частоти.
Надати оцінки споживаної потужності. Отримати засобами САПР Xilinx WebPack функційні (RTL) схеми імплементації комп'ютера та оформити їх кресленнями. Проаналізувати згенеровані САПР Xilinx WebPack технологічні схеми імплементації проекту. Розглянути основні принципи побудови принципових схем платформ, що містять цільову ПЛІС проекту та вибрати готову апаратну платформу для подальшої емуляції розробленого комп'ютера.
В таблиці 1 представлено вихідні дані на проектування.
Табл.1 Вихідні дані на проектування
№
Варіант
1
1
Розрядність даних
8
2
Розрядність інструкцій
32
3
Число регістрів
16
4
Місткість пам’яті інструкцій, КБ
2
5
Місткість пам’яті даних, КБ
2
6
Число реалізованих машинних інструкцій
≥5
7
Цільова ПЛІС
Virtex2
8
Системна тактова частота, МГц
≥40
9
Довжина тестової програми, інструкцій
≥8
РОЗРОБКА АРХІТЕКТУРИ РІВНЯ МАШИННИХ ІНСТРУКЦІЙ
RISC (англ. Reduced Instruction Set Computing − комп'ютер зі скороченим набором команд) − архітектура процесорів зі скороченим набором команд. Ще відома як "Load/Store" архітектура. Найвідоміші представники: DEC Alpha, ARC, ARM, AVR, MIPS, PA-RISC, Power Architecture (включаючи PowerPC), SuperH, та SPARC.
Усі команди працюють з операндами і мають однаковий формат. Звертання до пам'яті виконується за допомогою спеціальних команд завантаження регістра й запису. Простота структури і невеликий набір команд дозволяють повністю реалізувати їхнє апаратне виконання й ефективний конвеєр при невеликому обсязі устаткування.
Основними рисами RISC архітектури є:
мала кількість інструкцій;
однакова довжина всіх інструкцій;
мала кількість різних форматів інструкцій;
відсутність інструкцій які працюють з операндами в пам'яті (за виключенням інструкцій завантаження та збереження);
мала кількість апаратно підтримуваних типів даних;
велика кількість ідентичних регістрів загального призначення.
Поштовхом для розробки RISC архітектури стало те, що тогочасні (середина 1970-х) компілятори не використовували більшість команд із CISC набору та не могли скористатися перевагами багатьох типів складної адресації.
Виконання складних CISC інструкцій вимагало багатьох процесорних тактів, а реалізація різних типів адресування та інструкцій, що реалізовують високорівневі операції, займала більшість площі процесорного кристалу та майже не використовувалась.
В принципі, є можливість проектувати процесори на чистій RISC-архітектурі. Але відмовитися від архітектури x86 вже неможливо, оскільки під неї написано більшість поширених у світі програм, включаючи комп'ютерні ігри.
Арифметику RISC-процесорів вирізняє високий ступінь дроблення конвеєра. Цей прийом дозволяє збільшити тактову частоту (отже, і продуктивність) комп'ютера. Чим елементарніші дії виконуються в кожній фазі роботи конвеєра - тим вищою є частота його роботи.
RISC-процесори із самого початку були орієнтовані на реалізацію всіх можливостей прискорення арифметичних операцій, тому їхні конвеєри мають значно вищу швидкодію, ніж CISC-процесори. Тому RISC-процесори в 2-4 рази швидші, ніж CISC- процесори зі звичайною системою команд, що мають таку ж саму тактову частоту, і більш високопродуктивні, незважаючи на більший розмір програм. RISC- архітектура побудована на 4 основних принципах:
1. Будь-яка операція повинна виконуватися за один такт, незалежно від її типу.
2. Система команд повинна містити мінімальну кількість найчастіше використовуваних найпростіших інструкцій однакової довжини.
3. Операції обробки даних реалізуються тільки у форматі «регістр-регістр» (операнди вибираються з оперативних регістрів процесора, і результат операції записується також у регістр; а обмін між оперативними регістрами й пам'яттю виконується тільки за допомогою команд завантаження/запису).
4. Склад системи команд повинен бути «зручним» для компіляції операторів мов високого рівня.
Сьогодні кількість процесорів із RISC- архітектурою істотно зросла і їх виробляють усі провідні фірми США, у тому числі фірми Intel, Motorola – виробники основних сімейств процесорів із CISC-архітектурою.
В RISC-архітектурі характерне виконання будь-якої інструкції розкладено на три кроки.
FETCH – крок вибирання нової інструкції з пам’яті інструкцій в регістр інструкцій, обчислення адреси наступної інструкції програми за правилом «поточна адреса + і»;
DECODE – крок декодування вибраної інструкції за допомогою кодового представлення;
EXECUTE – крок виконання поточної інструкції за її алгоритмом.
Під час виконання трьох стадій поточної інструкції, обробка наступної не розпочинається.
В таблиці 2 наведений перелік функцій машинних інструкцій згідно індивідуального завдання.
Табл.2 Перелік функції машинних інструкцій
№
Мнемокод
Символічний запис
Функція
1
lw $t, offset($s)
$t = MEM[$s + offset]
Завантаження числа з пам’яті з адреси [$s + offset]
2
sw $t, offset($s)
MEM[$s + offset] = $t
Збереження числа в пам’яті за адресою [$s + offset]
3
add $d, $s, $t
$d = $s + $t
Додавання чисел з адрес $s і $t і збереження їх в адресі $d
4
beq $s, $t, offset
if $s == $t
advance_pc
(offset << 2)); else advance_pc (4);
Перехід по мітці, якщо $s == $t
5
xor $d, $s, $t
$d = $s ^ $t;
Операція «виключного АБО»
над $s і $t і запис результату у $d.
СИНТЕЗ СТРУКТУРИ SPIM RISC КОМП’ЮТЕРА
Загалом, синтезована структура прототипу наближена до відомої структури SPIM машини. Але в оригінальну архітектуру SPIM машини навмисно внесені зміни для того щоб спростити імплементування в ПЛІС Spartan взірця 1998 року, а саме:
Формат даних має довжину 8 бітів, а не 32 біти;
Формат інструкцій не змінено, а ось його трактування для інструкцій з безпосереднім операндом змінено проти оригіналу; це дозволило використовувати наявні асемблери і симулятори;
Реалізовано не всі інструкції, а лише ті, що містить тестова програма;
Пам’ять даних містить дві байтові комірки з адресами 0 і 1 (а не 0 та 4, як має бути); двох комірок достатньо, аби виконувати тестову програму прототипу;
Регістри даних мають розрядність 8 бітів, а не 32 біти; їх є лише вісім, а не 32, як в оригіналі.
Сучасні ПЛІС фірми Xilinx дозволяють створювати моделі для синтезу в ПЛІС з оригінальною розрядністю даних, з оригінальним числом 32 регістрів загального призначення та з місткістю пам’яті програми і пам'яті даних на декілька кілобайтів кожна. Отже, спрощення (викривлення) MIPS архітектури, допущені в прототипі, що розглядається у реальному проектуванні нескладно виправити. Дані спрощення допустились для того щоб досягнути варіативності вихідних даних на розробку проекта.
/
Рис.1. Спрощене подання синтезованої структури одноциклової SPIM машини
Далі представлено детальну структуру одно циклової RISC машини Паттерсона і Хеннессі.
/
Рис.2. Детальна структура одноциклової RISC машини Паттерсона і Хеннессі
Метою проектування є одноцикловий варіант, тобто такий, у якому нема конвеєра (знову таки заради спрощення), а усі RISC інструкції виконуються за один машинний цикл, який в нас точно дорівнюється одному тактовому інтервалу.
РОЗРОБКА ТЕСТОВОЇ ПРОГРАМИ
Призначення тестової програми – верифікація розробленого комп’ютера.
Для отримання тестової програми необхідно:
Виконати часове моделювання функціонування комп’ютера, що керується певною тестовою програмою (віртуальна верифікація).
Завантажити отриманий за допомогою САПР, засобами якої ми розробляли проект, бінарний файл конфігурації до ПЛІС емулятора прототипної плати, тобто, до друкованого вузла, що містить цільову ПЛІС і допоміжні елементи, і (можливо, за допомогою осцилографа) переконатися , що поведінка комп’ютера повністю визначена тестовою програмою (реальна верифікація).
Обидва способи не гарантують виявлення усіх можливих помилок в результатах проектування. А все це спричинене неможливістю формального математичного доведення коректності функціонування машини з програмою, що зберігається в пам’яті, під дією всіх варіантів прорамі їхніх даних.
В таблиці 3 наведена тестова програма згідно індивідуального завдання.
Табл.3. Тестова програма
Aдреса
Директива
Мітка
Інструкція
Код
.text
start:
00
lw $a0,0($zero)
0x8c040000
04
lw $a1,1($zero)
0x8c050001
08
add $a0, $a0, $a1
0x00852020
0c
sw $a0, 0($zero)
0xac040000
10
xor $a1, $a0, $a1
0x00852826
14
sw $a1, 0($zero)
0xac050000
18
beq $a0, $zero, halt
0x10800000
halt:
1c
beq $a0, $a0, lab2
0x1084ffff
Остання інструкція програми виключає подальші зміни програмного лічильника, тобто зупиняє програму. Коли комірка пам’яті з абсолютною адресою 0 містить код числа +2, а комірка 1 – код числа (-2), тоді можна прорахувати наступну послідовність змін вмістимого програмного лічильника при виконанні тестової програми:
00, 04, 08, 0c, 10, 14, 18, 1c, 1c, 1c...
Саме таку послідовність змін вмістимого лічильника інструкцій необхідно отримати часовим симулюванням імплементованої до ПЛІС VHDL моделі комп’ютера.
Тесову програму було завантажено до програмного симулятора машинних інструкцій Pcspim з метою отримання її машинних кодів. Ці машинні коди мусить містити розроблювана VHDL модель комп’ютера.
На Рис.3 подано вікно програмного симулятора Pcspim, що стосується тестової програми.
/
Рис.3. Вікно програмного симулятора Pcspim
РОЗРОБКА VHDL МОДЕЛІ КОМП’ЮТЕРА
5.1. Розробка VHDL моделі процесора
5.1.1. Модуль ID
Модуль ID/OF (декодувати інструкцію/вибрати операнди) містить регістровий файл, інтерфейс якого до АЛП подає комбінаційний пристрій керування SPIM RISC.
/
Рис.4. Інтерфейс регістрового файла до АЛП
На рис.5 представлений модуль ID (модуль декодування інструкції).
/
Рис.5. Модуль ID
Лістинг модуля ID:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity ID_chip is
port (clock : in std_logic;
reset : in std_logic;
RegWrite : in std_logic;
RegDst : in std_logic;
instruction : in std_logic_vector(31 downto 0);
write_data : in std_logic_vector( 7 downto 0);
Immediate : out std_logic_vector(7 downto 0);
Rs : out std_logic_vector(7 downto 0);
Rt : out std_logic_vector(7 downto 0);
OpCode : out std_logic_vector(5 downto 0));
end ID_chip;
architecture behav of ID_chip is
signal reg1,reg2,reg3,reg4, reg5,reg6,reg7 : std_logic_vector(7 downto 0);
signal reg1tmp,reg2tmp,reg3tmp,reg4tmp, reg5tmp,reg6tmp,reg7tmp: std_logic_vector(7 downto 0);
signal reg1wr,reg2wr,reg3wr,reg4wr,reg5wr,reg6wr,reg7wr : std_logic;
signal rd_addr1,rd_addr2 : std_logic_vector(4 downto 0);
signal wr_addr_ALUop,wr_addr_LWop, wr_addr : std_logic_vector(4 downto 0);
begin
OpCode <= Instruction(31 downto 26);
rd_addr1 <= Instruction(25 downto 21);
rd_addr2 <= Instruction(20 downto 16);
wr_addr_ALUop <= Instruction(15 downto 11);
wr_addr_LWop <= Instruction(20 downto 16);
Immediate <= Instruction(7 downto 0);
with rd_addr1(4 downto 0) select
Rs <= x"00" when "00000",
reg1 when "00001",
reg2 when "00010",
reg3 when "00011",
reg4 when "00100",
reg5 when "00101",
reg6 when "00110",
reg7 when "00111",
x"FF" when others;
with rd_addr2(4 downto 0) select
Rt <= x"00" when "00000",
reg1 when "00001",
reg2 when "00010",
reg3 when "00011",
reg4 when "00100",
reg5 when "00101",
reg6 when "00110",
reg7 when "00111",
x"FF" when others;
wr_addr <= wr_addr_ALUop when RegDst='1' else wr_addr_LWop;
reg1wr<='1' when ((wr_addr="00001") and (RegWrite='1')) else '0';
reg2wr<='1' when ((wr_addr="00010") and (RegWrite='1')) else '0';
reg3wr<='1' when ((wr_addr="00011") and (RegWrite='1')) else '0';
reg4wr<='1' when ((wr_addr="00100") and (RegWrite='1')) else '0';
reg5wr<='1' when ((wr_addr="00101") and (RegWrite='1')) else '0';
reg6wr<='1' when ((wr_addr="00110") and (RegWrite='1')) else '0';
reg7wr<='1' when ((wr_addr="00111") and (RegWrite='1')) else '0';
reg1tmp <= write_data when reg1wr='1' else reg1;
reg2tmp <= write_data when reg2wr='1' else reg2;
reg3tmp <= write_data when reg3wr='1' else reg3;
reg4tmp <= write_data when reg4wr='1' else reg4;
reg5tmp <= write_data when reg5wr='1' else reg5;
reg6tmp <= write_data when reg6wr='1' else reg6;
reg7tmp <= write_data when reg7wr='1' else reg7;
process
begin
wait until clock'event and clock='1';
if reset='1' then
reg1 <= x"A1";
reg2 <= x"A2";
reg3 <= x"A3";
reg4 <= x"A4";
reg5 <= x"A5";
reg6 <= x"A6";
reg7 <= x"A7";
else
reg1 <= reg1tmp;
reg2 <= reg2tmp;
reg3 <= reg3tmp;
reg4 <= reg4tmp;
reg5 <= reg5tmp;
reg6 <= reg6tmp;
reg7 <= reg7tmp;
end if;
end process;
end behav;
5.1.2. Модуль EXE
Модуль EXE призначений для виконання поточної інструкції за її алгоритмом.
На рис.6 представлений модуль EXE (модуль виконання інструкцій).
/
Рис.6. Модуль EXE
Лістинг модуля EXE:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity ex_chip is
port( Branch : in std_logic;
ALUSrc : in std_logic;
NPC : in std_logic_vector(7 downto 0);
Rs : in std_logic_vector(7 downto 0);
Rt : in std_logic_vector(7 downto 0);
Immediate : in std_logic_vector(7 downto 0);
ALUResult : out std_logic_vector(7 downto 0);
Branch_Address : out std_logic_vector(7 downto 0);
PCsrc : out std_logic);
end ex_chip;
architecture behav of ex_chip is
signal Branch_Address_tmp : std_logic_vector(8 downto 0);
signal Zero : std_logic;
begin
ALUresult <= (Rs + Rt) when (ALUsrc = '0') else (Rs + Immediate);
Branch_Address_tmp <= ('0' & NPC)+(Immediate(6 downto 0) &'0'&'0');
Branch_Address <= Branch_Address_tmp(7 downto 0);
Zero <= '1' when (Rs = Rt) else '0';
PCsrc <= Branch and Zero;
end behav;
5.1.3. Модуль керування
Для одноциклової машини достатньо мати комбінаційний пристрій керування. Адже кожна машинна інструкція одноразово вибирається з програмної пам'яті, а її код протягом цього циклу не змінюється.
На рис.7 представлений модуль CTL (модуль керування).
/
Рис.7. Модуль керування
Лістинг модуля керування:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
entity ctl_chip is
port(
Op : in std_logic_vector(5 downto 0);
RegDst : out std_logic;
ALUSrc : out std_logic;
MemtoReg : out std_logic;
RegWrite : out std_logic;
MemWrite : out std_logic;
Branch : out std_logic);
end ctl_chip;
architecture behav of ctl_chip is
signal R_format, lw, sw, beq : std_logic;
begin
R_format <= ((not Op(5)) and (not Op(4)) and (not Op(3)) and(not Op(2)) and (not Op(1)) and (not Op(0)));
lw <= (Op(5)) and (not Op(4)) and (not Op(3)) and(not Op(2)) and (Op(1)) and (Op(0));
sw <= (Op(5)) and (not Op(4)) and (Op(3)) and(not Op(2)) and (Op(1)) and (Op(0));
beq <= (not Op(5)) and (not Op(4)) and (not Op(3)) and(Op(2)) and (not Op(1)) and (not Op(0));
RegDst <= R_format;
ALUSrc <= lw or sw;
MemtoReg <= lw;
RegWrite <= R_format or lw;
MemWrite <= sw;
Branch <= beq;
end behav;
/
Рис.8. Структура комбінаційного модуля керування
R-format позначає інструкції, що працюють з даними з регістрів, наприклад, add r1, r2, r3; lw – машинна інструкція завантаження 32-х бітового слова з комірки пам'яті до регістра; sw – машинна інструкція збереження вмістимого регістра в комірці пам’яті; beq –машинна інструкція умовного переходу за ознакою рівності; xor r1, r2, r3 – машинна інструкція «виключного АБО» регістрів r2 та r3 та запис результату в регістр r1.
5.2. Розробка VHDL моделі пам’яті програм
Призначення модуля полягає у збереженні всіх кодів операцій для їх подальшого виконання.
На рис.9 представлений модуль пам’яті програм.
/
Рис.9. Модуль пам’яті програм
Лістинг модуля пам’яті програм:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity IF_chip is
port( clock : in std_logic;
reset : in std_logic;
PCsrc : in std_logic;
Branch_Address : in std_logic_vector(7 downto 0);
PCview : out std_logic_vector(7 downto 0);
Instruction : out std_logic_vector(31 downto 0);
NPC : out std_logic_vector(7 downto 0));
end IF_chip;
architecture behav of IF_chip is
signal PC : std_logic_vector(7 downto 0);
signal Input_PC : std_logic_vector(7 downto 0);
signal NPC_temp : std_logic_vector(7 downto 0);
-- Test Program, Content of instruction Memory
constant rom0 : std_logic_vector(31 downto 0) :=x"8c040000";
-- lw $4, 0($0)
constant rom1 : std_logic_vector(31 downto 0) := x"8c050001";
-- lw $5, 1($0)
constant rom2 : std_logic_vector(31 downto 0) := x"00852020";
-- add $6, $4, $5
constant rom3 : std_logic_vector(31 downto 0) := x"ac040000";
-- sw $6, 0($0)
constant rom4 : std_logic_vector(31 downto 0) := x"00852826";
-- xor $7, $4, $5
constant rom5 : std_logic_vector(31 downto 0) := x"ac050000";
-- sw $7, 0($0)
constant rom6 : std_logic_vector(31 downto 0) := x"10800000";
-- beq $4, $0, -20
constant rom7 : std_logic_vector(31 downto 0) := x"1084ffff";
-- beq $4, $4, -4
begin
PCview <= PC;
-- next address calculating in three steps
NPC_temp(7 downto 2) <= PC(7 downto 2) + 1;
NPC_temp(1 downto 0) <= b"00";
NPC <= NPC_temp;
Input_PC <= Branch_Address when PCsrc = '1' else NPC_temp;
process
begin
wait until (clock'event) and (clock='1');
If reset='1' then
PC <= x"00";
else
PC <= Input_PC;
end if;
end process;
process (PC)
begin
case PC(7 downto 2) is
when "000000" => instruction <= rom0;
when "000001" => instruction <= rom1;
when "000010" => instruction <= rom2;
when "000011" => instruction <= rom3;
when "000100" => instruction <= rom4;
when "000101" => instruction <= rom5;
when "000110" => instruction <= rom6;
when "000111" => instruction <= rom7;
when others => instruction <= x"00000000";
end case;
end process;
end behav;
5.3. Розробка VHDL моделі пам’яті даних
Призначення модуля полягає у збереженні операндів та результатів виконання операцій.
На рис.10 представлений модуль пам’яті даних.
/
Рис.10. Модуль пам’яті даних
Лістинг модуля пам’яті даних:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity MEM_chip is
port (clock : in std_logic;
reset : in std_logic;
MemWrite : in std_logic;
MemToReg : in std_logic;
address : in std_logic_vector(7 downto 0);
write_data : in std_logic_vector(7 downto 0);
writeback_data : out std_logic_vector(7 downto 0));
end MEM_chip;
architecture behav of MEM_chip is
signal read_data : std_logic_vector(7 downto 0);
signal cell0, cell1 : std_logic_vector(7 downto 0);
signal tmp0, tmp1 : std_logic_vector(7 downto 0);
signal wr0, wr1 : std_logic;
begin
read_data <= cell0 when address=x"00" else
cell1 when address=x"01" else
x"FF";
writeback_data <= address when MemtoReg='0' else read_data;
wr0 <= '1' when MemWrite = '1' and address(0) = '0' else '0';
wr1 <= '1' when MemWrite = '1' and address(0) = '1' else '0';
tmp0 <= write_data when wr0 ='1' else cell0;
tmp1 <= write_data when wr1 ='1' else cell1;
process
begin
wait until clock'event and clock='1';
if (reset = '1') then
cell0 <= x"02";
cell1 <= x"FE";
else
cell0 <= tmp0;
cell1 <= tmp1;
end if;
end process;
end behav;
Розробка VHDL моделі комп’ютера
На рис.11 представлена модель SPIM комп’ютера.
/
Рис.11. Модель SPIM комп’ютера
Лістинг моделі SPIM комп’ютера:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity SPIM is
port ( clock : in std_logic;
reset : in std_logic;
PC : out std_logic_vector(7 downto 0));
end SPIM;
architecture spim_structure of SPIM is
component IF_chip
port( clock : in std_logic;
reset : in std_logic;
Branch_Address : in std_logic_vector(7 downto 0);
PCsrc : in std_logic;
Instruction : out std_logic_vector(31 downto 0);
NPC : out std_logic_vector(7 downto 0);
PCview : out std_logic_vector(7 downto 0));
end component;
component ID_chip
port( clock : in std_logic;
reset : in std_logic;
Instruction : in std_logic_vector(31 downto 0);
write_data : in std_logic_vector(7 downto 0);
RegWrite : in std_logic;
RegDst : in std_logic;
Immediate : out std_logic_vector(7 downto 0);
Rs : out std_logic_vector(7 downto 0);
Rt : out std_logic_vector(7 downto 0);
Opcode : out std_logic_vector(5 downto 0));
end component;
component EX_chip
port( Branch : in std_logic;
ALUSrc : in std_logic;
NPC : in std_logic_vector(7 downto 0);
Rs : in std_logic_vector(7 downto 0);
Rt : in std_logic_vector(7 downto 0);
Immediate : in std_logic_vector(7 downto 0);
ALUResult : out std_logic_vector(7 downto 0);
Branch_Address : out std_logic_vector(7 downto 0);
PCsrc : out std_logic);
end component;
component MEM_chip
port( clock : in std_logic;
reset : in std_logic;
Memwrite : in std_logic;
MemtoReg : in std_logic;
address : in std_logic_vector(7 downto 0);
write_data : in std_logic_vector(7 downto 0);
writeback_data : out std_logic_vector(7 downto 0));
end component;
component CTL_chip
port( Op : in std_logic_vector(5 downto 0);
RegDst : out std_logic;
ALUSrc : out std_logic;
MemtoReg : out std_logic;
RegWrite : out std_logic;
MemWrite : out std_logic;
Branch : out std_logic);
end component;
signal Branch_wire : std_logic;
signal PCsrc_wire : std_logic;
signal RegWrite_wire : std_logic;
signal MemtoReg_wire : std_logic;
signal ALUSrc_wire : std_logic;
signal MemWrite_wire : std_logic;
signal RegDst_wire : std_logic;