Інструкція beq $a0, $a0, lab2 виключає подальші
зміни програмного лічильника (pc). Тобто остання інструкція зупиняє програму.
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.
.2
Синтез структури одноциклового SPIM RISC комп’ютера
Загалом, синтезована структура прототипу
наближена до відомої структури SPIM машини. Але в оригінальну архітектуру SPIM
машини навмисно внесені зміни для того щоб спростити імплементування в ПЛІС
Spartan взірця 1998 року, а саме:
· формат даних має довжину
є 8 бітів, а не 32 біти;
· формат інструкцій не
змінено, а ось його трактування для інструкцій з безпосереднім операндом
змінено проти оригіналу; це дозволило використовувати наявні асемблери і
симулятори;
· реалізовано не всі
інструкції, а лише ті, що містить тестова програма;
· пам’ять даних містить дві
байтові комірки з адресами 0 і 1 (а не 0 та 4, як має бути); двох комірок
достатньо, аби виконувати тестову програму прототипу;
· регістри даних мають
розрядність 8 бітів, а не 32 біти; їх є лише вісім, а не 32, як в оригіналі.
Сучасні ПЛІС фірми Xilinx дозволяють створювати
моделі для синтезу в ПЛІС з оригінальною розрядністю даних, з оригінальним
числом 32 регістрів загального призначення та з місткістю пам’яті програми і
пам'яті даних на декілька кілобайтів кожна. Отже, спрощення (викривлення) MIPS
архітектури, допущені в прототипі, що розглядається у реальному проектуванні
нескладно виправити. Дані спрощення допустились для того щоб досягнути
варіативності вихідних даних на розробку проекта.
Рис.3. Спрощене подання синтезованої структури
одноциклової SPIM машини.
Далі представимо детальну структуру одно циклової
RISC машини Паттерсона і Хеннессі.
Рис. 4. Детальна структура одноциклової RISC
машини Паттерсона і Хеннессі.
Пригортаємо увагу до того, що метою проектування
є одноцикловий варіант, тобто такий, у якому нема конвеєра (знову таки заради
спрощення), а усі RISC інструкції виконуються за один машинний цикл, який в нас
точно дорівнюється одному тактовому інтервалу.
.3
Верифікація VHDL моделі комп’ютера
Отже наша VHDL проімплементована. Далі її
необхідно перевірити часовим симулюванням на рівні вентилів. Тепер можна
перевірити по часовим діаграмам правильність виконання нашої тестової програми.
Рис.5. Часове симулювання моделі на рівні
вентилів
Необхідно зауважити те, вміст програмного
лічильника змінюється так як ми і передбачали.
2.
VHDL модель прототипу RISC комп’ютера
Далі подамо всі модулі з яких складається VHDL
модель SPIM RISC комп’ютера.
.1
Топ-файл VHDL моделі комп’ютера
Це − структурна архітектура усього
комп’ютера, складеного з окремих модулів IF, ID, EXE, MEM та CTL (керування).
IEEE;IEEE. STD_LOGIC_1164. ALL;IEEE.
STD_LOGIC_ARITH. ALL;IEEE. STD_LOGIC_UNSIGNED. ALL;top modulecycle MIPS TM (J.
Hennessy & D. Patterson, 1998).WebPack 9.1i: IF_chip, ID_chip,
EX_chip,MEM_chip, CTL_chipA_SPIM is(clock: in std_logic;: in std_logic;: out
std_logic_vector (7 downto 0));A_SPIM;spim_structure of A_SPIM isID_chip(clock:
in std_logic;: in std_logic;: in std_logic_vector (31 downto 0);_data: in
std_logic_vector (7 downto 0);: in std_logic;: in std_logic;: out
std_logic_vector (7 downto 0);: out std_logic_vector (7 downto 0);: out
std_logic_vector (7 downto 0);: out std_logic_vector (5 downto
0));component;IF_chip(clock: in std_logic;: in std_logic;_Address: in
std_logic_vector (7 downto 0);: in std_logic;: out std_logic_vector (31 downto
0);: out std_logic_vector (7 downto 0);: out std_logic_vector (7 downto
0));component;EX_chip(Branch: in std_logic;: in std_logic;: in std_logic_vector
(7 downto 0);: in std_logic_vector (7 downto 0);: in std_logic_vector (7 downto
0);: in std_logic_vector (7 downto 0);: out std_logic_vector (7 downto
0);_Address: out std_logic_vector (7 downto 0);: out
std_logic);component;CTL_chip(Op: in std_logic_vector (5 downto 0);: out
std_logic;: out std_logic;: out std_logic;: out std_logic;: out std_logic;: out
std_logic);component;MEM_chip(clock: in std_logic;: in std_logic;: in
std_logic;: in std_logic;: in std_logic_vector (7 downto 0);_data: in
std_logic_vector (7 downto 0);_data: out std_logic_vector (7 downto
0));component;NPC_bus: std_logic_vector (7 downto 0);Rs_bus: std_logic_vector
(7 downto 0);Rt_bus: std_logic_vector (7 downto 0);OpCode_bus: std_logic_vector
(5 downto 0);Imm_bus: std_logic_vector (7 downto 0);BrAddress_bus:
std_logic_vector (7 downto 0);ALUresult_bus: std_logic_vector (7 downto
0);write_back_bus: std_logic_vector (7 downto 0);Instruction_bus:
std_logic_vector (31 downto 0);Branch_wire: std_logic;PCsrc_wire:
std_logic;RegWrite_wire: std_logic;MemtoReg_wire: std_logic;ALUSrc_wire:
std_logic;MemWrite_wire: std_logic;RegDst_wire: std_logic;_IF: IF_chip port map
(=> clock,=> reset,_Address => BrAddress_bus,=> PCsrc_wire,=>
Instruction_bus,=> NPC_bus,=> PC);_ID: ID_chip port map (=>
clock,=> reset,=> Instruction_bus,_data => write_back_bus,=>
RegWrite_wire,=> RegDst_wire,=> Rs_bus,=> Rt_bus,=>
OpCode_bus,=> Imm_bus);_EX: EX_chip port map (=> Branch_wire,=>
ALUSrc_wire,=> NPC_bus,=> Rs_bus,=> Rt_bus,=> Imm_bus,=>
PCsrc_wire,_Address => BrAddress_bus,=> ALUResult_bus);_CTL: CTL_chip
port map (=> OpCode_bus,=> RegDst_wire,=> ALUSrc_wire,=>
MemtoReg_wire,=> RegWrite_wire,=> MemWrite_wire,=> Branch_wire);_MEM:
MEM_chip port map (=> clock,=> reset,=> MemWrite_wire,=>
MemtoReg_wire,_data => write_back_bus,=> ALUResult_bus,_data =>
Rt_bus);spim_structure;
.2
Модуль керування (CTL)
Для одноциклової машини достатньо мати комбінаційний
пристрій керування. Адже кожна машинна інструкція одноразово вибирається з
програмної пам'яті, а її код протягом цього циклу не змінюється.
ctrl_chipIEEE;IEEE. STD_LOGIC_1164. all;IEEE.
STD_LOGIC_ARITH. all;ctrl_chip is(: in STD_LOGIC_VECTOR (5 downto 0);: out
STD_LOGIC;: out STD_LOGIC;: out STD_LOGIC;: out STD_LOGIC;: out STD_LOGIC;: out
STD_LOGIC
);ctrl_chip;
}} End of automatically maintained sectionbehav
of ctl_chip isR_format, lw, sw, beq: std_logic;_format <= ( (not Op (5)) and
(not Op (4)) and (not Op (3)) and
(not Op (2)) and (not Op (1)) and (not Op
(0)));<= (Op (5)) and (not Op (4)) and (not Op (3)) and
(not Op (2)) and (Op (1)) and (Op (0));<= (Op
(5)) and (not Op (4)) and (Op (3)) and
(not Op (2)) and (Op (1)) and (Op (0));<= (not
Op (5)) and (not Op (4)) and (not Op (3)) and
(Op (2)) and (not Op (1)) and (not Op (0));<=
R_format;<= lw or sw;<= lw;<= R_format or lw;<= sw;<= beq;behav;
Рис.6. Структура комбінаційного модуля керування:
на вході - біти інструкції, на виході - біти керування;
Як R-format позначені машинні інструкції, що
працюють з регістровими даними, наприклад: add r1, r2, r3; - машинна
інструкція завантаження слова з комірки пам'яті до регістра; sw - машинна
інструкція збереження вмістимого регістра у комірці пам’яті; beq -
машинна інструкція умовного переходу за ознакою рівності.
Перелічимо вихідні мікронакази, що генерує вузол
керування: RegDest, ALUsrc, MemToReg, RegWrite, MtmRead, MemWrite, Branch,
ALUOp1 та ALUOp2.
.3
Модуль виконання операцій (ЕХЕ)
Модуль ЕХЕ виконує операції.
chipIEEE;IEEE. STD_LOGIC_1164. ALL;IEEE.
STD_LOGIC_ARITH. ALL;IEEE. STD_LOGIC_UNSIGNED. ALL;ex_chip is(Branch: in
std_logic;: in std_logic;: in std_logic_vector (7 downto 0);: in
std_logic_vector (7 downto 0);: in std_logic_vector (7 downto 0);: in
std_logic_vector (7 downto 0);: out std_logic_vector (7 downto 0);_Address: out
std_logic_vector (7 downto 0);: out std_logic);ex_chip;behav of ex_chip
isBranch_Address_tmp: std_logic_vector (8 downto 0);Zero: std_logic;<= (Rs +
Rt) when (ALUsrc = '0') else (Rs + Immediate);_Address_tmp <= ('0' &
NPC) + (Immediate (6 downto 0) &'0'&'0');_Address <=
Branch_Address_tmp (7 downto 0);<= '1' when (Rs = Rt) else '0';<= Branch
and Zero;behav;
.4
Mодуль декодування інструкцій (ID)
Модуль ID/OF (декодувати інструкцію/вибрати
операнди) містить регістровий файл, інтерфейс якого до АЛП подає рис.7.
Комбінаційний пристрій керування SPIM RISC розглядаємо окремо.
Рис.7. Інтерфейс регістрового файла до АЛП.
ID chipIEEE;IEEE. STD_LOGIC_1164. ALL;IEEE.
STD_LOGIC_ARITH. ALL;IEEE. STD_LOGIC_UNSIGNED. ALL;ID_chip is(clock: in
std_logic;: in std_logic;: in std_logic;: in std_logic;: in std_logic_vector
(31 downto 0);_data: in std_logic_vector (7 downto 0);: out std_logic_vector (7
downto 0);: out std_logic_vector (7 downto 0);: out std_logic_vector (7 downto
0);: out std_logic_vector (5 downto 0));ID_chip;behav of ID_chip
isreg1,reg2,reg3,reg4,reg5,reg6,reg7: std_logic_vector (7 downto 0);reg1tmp,reg2tmp,reg3tmp,reg4tmp,tmp,reg6tmp,reg7tmp:
std_logic_vector (7 downto 0);reg1wr,reg2wr,reg3wr,reg4wr,wr,reg6wr,reg7wr:
std_logic;rd_addr1,rd_addr2: std_logic_vector (4 downto
0);wr_addr_ALUop,wr_addr_LWop,_addr: std_logic_vector (4 downto 0);<= Instruction
(31 downto 26);_addr1 <= Instruction (25 downto 21);_addr2 <= Instruction
(20 downto 16);_addr_ALUop <= Instruction (15 downto 11);_addr_LWop <=
Instruction (20 downto 16);<= Instruction (7 downto 0);rd_addr1 (4 downto 0)
select<= x"00" when "00000",when "00001",when
"00010",when "00011",when "00100",when
"00101",when "00110",when "00111","FF"
when others;rd_addr2 (4 downto 0) select<= x"00" when "00000",when
"00001",when "00010",when "00011",when
"00100",when "00101",when "00110",when
"00111","FF" when others;_addr <= wr_addr_ALUop when
RegDst='1' else wr_addr_LWop;wr<='1' when ( (wr_addr="00001") and
(RegWrite='1')) else '0';wr<='1' when ( (wr_addr="00010") and
(RegWrite='1')) else '0';wr<='1' when ( (wr_addr="00011") and
(RegWrite='1')) else '0';wr<='1' when ( (wr_addr="00100") and
(RegWrite='1')) else '0';wr<='1' when ( (wr_addr="00101") and
(RegWrite='1')) else '0';wr<='1' when ( (wr_addr="00110") and
(RegWrite='1')) else '0';wr<='1' when ( (wr_addr="00111") and
(RegWrite='1')) else '0';tmp <= write_data when reg1wr='1' else reg1;tmp
<= write_data when reg2wr='1' else reg2;tmp <= write_data when reg3wr='1'
else reg3;tmp <= write_data when reg4wr='1' else reg4;tmp <= write_data
when reg5wr='1' else reg5;tmp <= write_data when reg6wr='1' else reg6;tmp
<= write_data when reg7wr='1' else reg7;until clock'event and
clock='1';reset='1' then<= x"A1";<= x"A2";<=
x"A3";<= x"A4";<= x"A5";<=
x"A6";<= x"A7";<= reg1tmp;<= reg2tmp;<=
reg3tmp;<= reg4tmp;<= reg5tmp;<= reg6tmp;<=
reg7tmp;if;process;behav;
.4
Mодуль IF
IF chipIEEE;IEEE. STD_LOGIC_1164. ALL;IEEE. STD_LOGIC_ARITH.
ALL;IEEE. STD_LOGIC_UNSIGNED. ALL;IF_chip is(clock: in std_logic;: in
std_logic;: in std_logic;_Address: in std_logic_vector (7 downto 0);: out
std_logic_vector (7 downto 0);: out std_logic_vector (31 downto 0);: out
std_logic_vector (7 downto 0));IF_chip;behav of IF_chip isPC: std_logic_vector
(7 downto 0);Input_PC: std_logic_vector (7 downto 0);NPC_temp: std_logic_vector
(7 downto 0);Programrom0: std_logic_vector (31 downto 0): =x"8c040000";$4,
0 ($0)rom1: std_logic_vector (31 downto 0): = x"8c050001";$5, 1
($0)rom2: std_logic_vector (31 downto 0): = x"00852020";$4, $4,
$5rom3: std_logic_vector (31 downto 0): = x"ac040000";$4, 0 ($0)rom4:
std_logic_vector (31 downto 0): = x"1080fffb";$4, $0, - 20rom5:
std_logic_vector (31 downto 0): = x"1084ffff";$4, $4, - 4rom6:
std_logic_vector (31 downto 0): = x"00000025";$0, $0, $0rom7:
std_logic_vector (31 downto 0): =x"00000025";$0, $0, $0<= PC;_temp
(7 downto 2) <= PC (7 downto 2) + 1;_temp (1 downto 0) <= b"00";<=
NPC_temp;_PC <= Branch_Address when PCsrc = '1' else NPC_temp;until
(clock'event) and (clock='1');reset='1' then<= x"00";<=
Input_PC;if;process;(PC)PC (7 downto 2) is"000000" => instruction
<= rom0;"000001" => instruction <= rom1;"000010"
=> instruction <= rom2;"000011" => instruction <=
rom3;"000100" => instruction <= rom4;"000101" =>
instruction <= rom5;"000110" => instruction <=
rom6;"000111" => instruction <= rom7;others => instruction
<= x"00000000";case;process;behav;
.5
Модуль пам’яті (МЕМ)
Призначення модуля полягає у збереженні операндів
та результатів виконання операцій. Це і є пам'ять даних.chipIEEE;IEEE.
STD_LOGIC_1164. ALL;IEEE. STD_LOGIC_ARITH. ALL;IEEE. STD_LOGIC_UNSIGNED.
ALL;MEM_chip is(clock: in std_logic;: in std_logic;: in std_logic;: in
std_logic;: in std_logic_vector (7 downto 0);_data: in std_logic_vector (7
downto 0);_data: out std_logic_vector (7 downto 0));MEM_chip;behav of MEM_chip
isread_data: std_logic_vector (7 downto 0);cell0, cell1: std_logic_vector (7
downto 0);tmp0, tmp1: std_logic_vector (7 downto 0);wr0, wr1: std_logic;_data
<= cell0 when address=x"00" elsewhen address=x"01"
else"FF";_data <= address when MemtoReg='0' else read_data;<=
'1' when MemWrite = '1' and address (0) = '0' else '0';<= '1' when MemWrite
= '1' and address (0) = '1' else '0';<= write_data when wr0 ='1' else
cell0;<= write_data when wr1 ='1' else cell1;until clock'event and
clock='1';(reset = '1') then<= x"02";<= x"FE";<=
tmp0;<= tmp1;if;process;behav;
.6
Автоматично згенерований файл (Test Bench)
Автоматично згенерований файл Test Bench нульові
стартові значення всіх вхідних сигналів.ieee;ieee. std_logic_1164. ALL;ieee.
std_logic_unsigned. all;ieee. numeric_std. ALL;tb_vhd IStb_vhd;behavior OF
tb_vhd ISDeclaration for the Unit Under Test (UUT)A_SPIM(: IN std_logic;: IN
std_logic;: OUT std_logic_vector (7 downto 0)
);COMPONENT;
Inputsclock: std_logic: = '0';reset: std_logic: =
'1';
OutputsPC: std_logic_vector (7 downto 0);the Unit
Under Test (UUT): A_SPIM PORT MAP (=> clock,=> reset,=> PC
);<= not clock after 50ns;<= '0' after
180ns;: PROCESS100 ns for global reset to finishfor 100 ns;stimulus here; -
will wait foreverPROCESS;;
Висновки
В даній курсовій роботі я розробив приклад
тестової програми та на її основі VHDL модель одноциклового RISC комп’ютера з
архітектурою SPIM, ознайомився з програмою САПР Xilinx WebPack, та основними її
принципами роботи.
Виконавши дану курсову роботу можна зробити
висновок, що HDL спроектована для всього спектру потреб, які виникають в
процесі проектування. По-перше, вона дозволяє описати структуру проекту, тобто
його поділ на складові частини та їх взаємозв’язок. По-друге, вона дозволяє
описати функцію проекту використовуючи подібні до мови програмування форми.
По-третє, як результат, вона дозволяє змоделювати проект перед початком
виготовлення, так що проектувальники можуть швидко порівняти альтернативи та
перевірити правильність функціонування без затримки та витрат на апаратне
макетування.
Список
використаної літератури
1. Норенков
И.П. Основы автоматизированного проектирования. 2-е издание. МГТУ им. Н.Э.
Баумана. 2006. C.336
2. Сергиенко
А.М. VHDL для проектирования вычислительных устройств. ТИД "ДС".
2003. C. 208
3. Веб-сторінка
компанії Aldec®, Inc [Електронний ресурс] <http://www.aldec.com>
. Макларов
С.В. Моделирование бизнес-процессов.