Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
Національний університет “Львівська політехніка”
Кафедра ЕОМ
Курсова робота
з дисципліни
Проектування комп'ютерних систем та мереж
на тему: “Розробка VHDL моделі компютера
(архітектура MIPS).”
Виконав:
Ст. гр. КСМсі-11з
Мархоцький В.С.
Перевірив:
Бачинський Р.В.
Львів-2013
АНОТАЦІЯ
В основі даної курсової роботи лежить проектування VHDL-моделі одноциклового RISC компютера з архітектурою SPIM тобто створення власне цієї програмної моделі даного пристрою, а також програмно реалізувати всі складові частини (модулі) з яких складається RISC компютер архітектури SPIM. На кінець потрібно зробити моделювання роботи спроектованого компютера, тестування програми, результати тестування зобразити на часовій діаграмі.
Спроектувати VHDL модель одноциклового RISC компютера з архітектурою SPIM (MIPS, DLX) з використанням пакета САПР Xilinx WebPack версії 14_1.
Подати приклад тестової програми і з її допомогою синтезувати і імплементувати VHDL модель RISC компютера. Провести часове симулювання імплементованої моделі компютера і дослідити її поведінку на рівні вентилів. Підтвердити отримані під час синтезу та імплементування досягнуте значення тактової частоти.
Вступ 5
1. Опис RISC архітектури компютерів 6
1.1. Розробка тестової програми 7
1.2. Синтез структури одноциклового SPIM RISC компютера 9
1.3. Верифікація VHDL моделі компютера 11
2. VHDL модель прототипу RISC компютера 12
2.1. Топ-файл VHDL моделі компютера 12
2.2. Модуль керування (CTL) 15
2.3. Модуль виконання операцій (ЕХЕ) 17
2.4. Mодуль декодування інструкцій (ID) 18
2.5. Mодуль IF 22
2.6. Модуль памяті (МЕМ) 24
2.7. Автоматично згенерований файл (Test Bench) 25
Висновки 27
Список використаної літератури 28
Одним з перспективних напрямків проектування цифрових пристроїв є їх синтез на основі поведінкового опису виконаний розробниками на мові програмування класу HDL.
Основними складовими частинами процесу проектування є:
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-процесори швидші і економічніші CISC. У принципі, є можливість проектувати процесори на чистій RISC-архітектурі. Але відмовитися від архітектури x86 вже неможливо, оскільки під неї написано більшість поширених у світі програм, включаючи комп'ютерні ігри.
В таблиці 1 подаємо варіант тестової програми. Дана тестова програма потрібна для верифікації результатів імплементації VHDL моделі до певної ПЛІС.
Приклад тестової програми: lab1:
lw $a0,0($zero)
lw $a1,1($zero)
add $a0, $a0, $a1
sw $a0, 0($zero)
beq $a0, $zero, lab1
lab2:
beq $a0, $a0, lab2
or $a0, $a0, $a0
or $a0, $a0, $a0
Таблиця 1
Адреса |
Директива |
Мітка |
Інструкція |
Код |
.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 |
beq $a0, $zero, lab1 |
0x1080fffb |
||
label: |
||||
14 |
beq $a0, $a0, lab2 |
0x1084ffff |
Інструкція beq $a0, $a0, lab2 виключає подальші зміни програмного лічильника (pc). Тобто остання інструкція зупиняє програму.
Коли комірка памяті з абсолютною адресою 0 містить код числа +2, а комірка 1 код числа (-2), тоді можна прорахувати наступну послідовність змін вмістимого програмного лічильника при виконанні тестової програми:
00, 04, 08, 0c, 10, 00, 04, 08, 0c, 10, 14, 14, 14, 14... |
Таку послідовність змін вмістимого лічильника інструкцій ми повинні отримати часовою симуляцією імплементованої до ПЛІС VHDL моделі компютера.
Для отримання машинних кодів тестової програми необхідна завантажити її до програмного симулятора машинних інструкцій Pcspim. Ці машинні коди мусить містити VHDL модель компютера, яку ми розробляємо.
Рис.1.Вікно програмного симулятора з завантаженою тестовою програмою.
Симулювання тестової програми не можна виконати через те, що реалізована в прототипі компютера архітектура в деякій мірі відрізняється від оригінальної архітектури SPIM. Отже, повноцінно скористатися стандартним симулятором RISC MIPS архітектури для налагодження тестової програми можливо лише за умови, коли в проекті використані інструкції і структурні одиниці даних, які відповідають оригіналам.
Для того щоб симулятор подав правильно машинні коди, ще до завантаження в нього тестової програми необхідно його сконфігурувати в режимі bare (чиста апаратура, без програмної підтримки; вікно Settings меню Simulator) повинно набути наступного вигляду:
Рис.2. Конфігурування програмного симулятора Pcspim.
Загалом, синтезована структура прототипу наближена до відомої структури SPIM машини. Але в оригінальну архітектуру SPIM машини навмисно внесені зміни для того щоб спростити імплементування в ПЛІС Spartan взірця 1998 року, а саме:
Сучасні ПЛІС фірми Xilinx дозволяють створювати моделі для синтезу в ПЛІС з оригінальною розрядністю даних, з оригінальним числом 32 регістрів загального призначення та з місткістю памяті прорами і пам'яті даних на декілька кілобайтів кожна. Отже, спрощення (викривлення) MIPS архітектури, допущені в прототипі, що розглядається у реальному проектуванні нескладно виправити. Дані спрощення допустились для того щоб досягнути варіативності вихідних даних на розробку проекта.
Рис.3. Спрощене подання синтезованої структури одноциклової SPIM машини.
Далі представимо детальну структуру одно циклової RISC машини Паттерсона і Хеннессі.
Рис.4. Детальна структура одноциклової RISC машини Паттерсона і Хеннессі.
Пригортаємо увагу до того, що метою проектування є одноцикловий варіант, тобто такий, у якому нема конвеєра (знову таки заради спрощення), а усі RISC інструкції виконуються за один машинний цикл, який в нас точно дорівнюється одному тактовому інтервалу.
Отже наша VHDL проімплементована. Далі її необхідно перевірити сасовим симулюванням на рівні вентилів. Тепер можна перевірити по часовим діаграмам правильність виконання нашої тестової програми.
Рис.5. Часове симулювання моделі на рівні вентилів
Необхідно зауважити те, вміст програмного лічильника змінюється так як ми і передбачали.
Далі подамо всі модулі з яких складається VHDL модель SPIM RISC компютера.
Це − структурна архітектура усього компютера, складеного з окремих модулів IF, ID, EXE, MEM та CTL (керування).
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- SPIM top module
-- One cycle MIPS TM (J. Hennessy & D. Patterson,1998).
-- Xilinx WebPack 9.1i
-- Submodules: IF_chip, ID_chip, EX_chip,MEM_chip, CTL_chip
entity A_SPIM is
port ( clock : in std_logic;
reset : in std_logic;
PC : out std_logic_vector(7 downto 0));
end A_SPIM;
architecture spim_structure of A_SPIM is
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 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 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 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;
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;
signal NPC_bus : std_logic_vector(7 downto 0);
signal Rs_bus : std_logic_vector(7 downto 0);
signal Rt_bus : std_logic_vector(7 downto 0);
signal OpCode_bus : std_logic_vector(5 downto 0);
signal Imm_bus : std_logic_vector(7 downto 0);
signal BrAddress_bus : std_logic_vector(7 downto 0);
signal ALUresult_bus : std_logic_vector(7 downto 0);
signal write_back_bus : std_logic_vector(7 downto 0);
signal Instruction_bus : std_logic_vector(31 downto 0);
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;
begin
U_IF : IF_chip port map(
clock => clock,
reset => reset,
Branch_Address => BrAddress_bus,
PCsrc => PCsrc_wire,
Instruction => Instruction_bus,
NPC => NPC_bus,
PCview => PC);
U_ID : ID_chip port map(
clock => clock,
reset => reset,
instruction => Instruction_bus,
write_data => write_back_bus,
RegWrite => RegWrite_wire,
RegDst => RegDst_wire,
Rs => Rs_bus,
Rt => Rt_bus,
OpCode => OpCode_bus,
Immediate => Imm_bus);
U_EX: EX_chip port map (
Branch => Branch_wire,
ALUSrc => ALUSrc_wire,
NPC => NPC_bus,
Rs => Rs_bus,
Rt => Rt_bus,
Immediate => Imm_bus,
PCsrc => PCsrc_wire,
Branch_Address => BrAddress_bus,
ALUResult => ALUResult_bus);
U_CTL: CTL_chip port map(
Op => OpCode_bus,
RegDst => RegDst_wire,
ALUSrc => ALUSrc_wire,
MemtoReg => MemtoReg_wire,
RegWrite => RegWrite_wire,
MemWrite => MemWrite_wire,
Branch => Branch_wire);
U_MEM: MEM_chip port map (
clock => clock,
reset => reset,
MemWrite => MemWrite_wire,
MemtoReg => MemtoReg_wire,
writeback_data => write_back_bus,
address => ALUResult_bus,
write_data => Rt_bus);
end spim_structure;
Для одноциклової машини достатньо мати комбінаційний пристрій керування. Адже кожна машинна інструкція одноразово вибирається з програмної пам'яті, а її код протягом цього циклу не змінюється.
--ctrl_chip
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
entity ctrl_chip is
port(
Op : in STD_LOGIC_VECTOR(5 downto 0);
RegDst : out STD_LOGIC;
ALUSrc : out STD_LOGIC;
MemWrite : out STD_LOGIC;
MemtoReg : out STD_LOGIC;
RegWrite : out STD_LOGIC;
Branch : out STD_LOGIC
);
end ctrl_chip;
--}} End of automatically maintained section
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;
Рис.6. Структура комбінаційного модуля керування: на вході біти інструкції, на виході біти керування;
Як R-format позначені машинні інструкції, що працюють з регістровими даними, наприклад: add r1, r2, r3;
lw машинна інструкція завантаження слова з комірки пам'яті до регістра; sw машинна інструкція збереження вмістимого регістра у комірці памяті; beq машинна інструкція умовного переходу за ознакою рівності.
Перелічимо вихідні мікронакази, що генерує вузол керування: RegDest, ALUsrc, MemToReg, RegWrite, MtmRead, MemWrite, Branch, ALUOp1 та ALUOp2.
Модуль ЕХЕ виконує операції.
-- EX-chip
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;
Модуль ID/OF (декодувати інструкцію/вибрати операнди) містить регістровий файл, інтерфейс якого до АЛП подає рис.7. Комбінаційний пристрій керування SPIM RISC розглядаємо окремо.
Рис.7. Інтерфейс регістрового файла до АЛП.
-- ID chip
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;
Призначення модуля полягає у збереженні операндів та результатів виконання операцій. Це і є пам'ять даних.
-- MEM-chip
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;
Автоматично згенерований файл Test Bench нульові стартові значення всіх вхідних сигналів.
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.all;
USE ieee.numeric_std.ALL;
ENTITY tb_vhd IS
END tb_vhd;
ARCHITECTURE behavior OF tb_vhd IS
-- Component Declaration for the Unit Under Test (UUT)
COMPONENT A_SPIM
PORT(
clock : IN std_logic;
reset : IN std_logic;
PC : OUT std_logic_vector(7 downto 0)
);
END COMPONENT;
--Inputs
SIGNAL clock : std_logic := '0';
SIGNAL reset : std_logic := '1';
--Outputs
SIGNAL PC : std_logic_vector(7 downto 0);
BEGIN
-- Instantiate the Unit Under Test (UUT)
uut: A_SPIM PORT MAP(
clock => clock,
reset => reset,
PC => PC
);
clock <= not clock after 50ns;
reset <= '0' after 180ns;
tb : PROCESS
BEGIN
-- Wait 100 ns for global reset to finish
wait for 100 ns;
-- Place stimulus here
wait; -- will wait forever
END PROCESS;
END;
В даній курсовій роботі я розробив приклад тестової програми та на її основі VHDL модель одноциклового RISC компютера з архітектурою SPIM, ознайомився з програмою САПР Xilinx WebPack, та основними її принципами роботи.
Виконавши дану курсову роботу можна зробити висновок, що HDL спроектована для всього спектру потреб, які виникають в процесі проектування. По-перше, вона дозволяє описати структуру проекту, тобто його поділ на складові частини та їх взаємозвязок. По-друге, вона дозволяє описати функцію проекту використовуючи подібні до мови програмування форми. По-третє, як результат, вона дозволяє змоделювати проект перед початком виготовлення, так що проектувальники можуть швидко порівняти альтернативи та перевірити правильність функціонування без затримки та витрат на апаратне макетування.