Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Кафедра ЕОМ
Курсовий проект
З дисципліни
“Теорія і проектування комп’ютерних систем та мереж”
НА ТЕМУ :
”РОЗРОБЛЕННЯ VHDL-МОДЕЛІ КОМП'ЮТЕРА”
Львів 2005
АНОТАЦІЯ
В даній курсовій роботі розглядаються методи проектування мікропроцесора методом опису його архітектуримовою опису апаратних засобів HDL в редакторі AHDL фірми ALDEC. Тут використовується спрощена модель процесора. Але з погляду на навчання, цього цілком достатньо, тому що цю структуру легкомодифікувати (за рахунок використання лінгвістичних методів опису) і створити потрібну структуру, в залежності від метуи його застосування
До того ж, розвиток лінгвістичних методів, дає можливість проектувати системи, влегкому для сприйняття людиною вигляді- програмному. Використання обєктно-орієнтованих моделей дозволяє писати досить таки потужні проекти.
ЗМІСТ
ЗАВДАННЯ НА КУРСОВИЙ ПРОЕКТ .............................................................................. 4
ВСТУП ..................................................................................................................................................... 5
Структура мікрокомп(ютера ................................................................. 6
Проектування інформаційного тракту .................................................. 7
2.1 Проектування блока АЛП .................................................................... 8
Проектування керуючого автомата ....................................................... 9
Симуляція роботи мікрокомп(ютера ...................................................... 12
Висновки ..................................................................................................... 13
ЛІТЕРАТУРА ........................................................................................................... 14
ДОДАТОК .................................................................................................................15
ЗАВДАННЯ НА ПРОЕКТУВАННЯ
У розроблену VHDL-модель комп’ютера розробленого в методичних вказівках внести такі зміни :
Зовнішня пам(ять команд об(ємом 128x8
Регістровий файл (RF) внести у внутрішню структуру Інформаційного тракту
Додати блок FIFO 16х4
До системи команд мікропроцесора GNOME додати інструкцію :
Resd_fifo acc<=fifo
Вступ
Мета курсового проекту полягає в опануванні методів проектування вузлів комп'ютерних систем на прикладі створення моделі однокристального комп'ютера з використанням мови апаратного опису VHDL, виконанні симуляції з наступним тестуванням роботи мікропроцесорної системи на функціональному рівні. Розроблюваний універсальний однокристальний мікрокомп'ютер є різновидом універсальних комп'ютерів. Він містить усі стандартні пристрої, необхідні для реалізації цифрової системи мінімальної конфігурації, а саме — процесор, пам'ять команд, пам'ять даних, внутрішній тактовий генератор. Основою мікрокомп'ютера, що проектується, є мікропроцесор Gnome — 4-розрядний гіпотетичний неконвеєрний RISC мікропроцесор, зі спрощеною системою команд та типів адресування.
Основну увагу під час розробки мікропроцесора приділено проектуванню архітектури мікрокомп'ютера з використанням мови апаратного опису VHDL, оскільки при проектуванні НВІС (надвеликих інтегральних схем) з використанням рівнів архітектурного, логічного, топологічного проектування успіх розробки найбільшою мірою залежить від результатів попереднього, архітектурного рівня проектування. Вибраний спосіб побудови моделі пристрою за допомогою мови VHDL та інструментального засобу Active-VHDL фірми Aldec забезпечує можливість швидкої модифікації архітектури, є самоописовим, тобто він дозволяє швидко виявляти та усувати хиби проектування. Альтернативою опису моделі за допомогою мов апаратного опису є схемотехнічний синтез та синтез архітектури мікрокомп'ютера з використанням функцій алгебри логіки.
Синтез архітектури мікрокомп'ютера з використанням функцій алгебри логіки вимагає від розробника опису схеми в термінах заданої множини логічних функцій. Такий підхід є ефективний при побудові пристроїв невеликої складності. Суто теоретично функціонування мікрокомп'ютера можна описати даним способом, але через велику складність він є неприйнятним.
Метод схемотехнічного синтезу базується на синтезі з використанням як окремих логічних функцій, так і елементів, що побудовано на основі логічних функцій. Схемотехнічний дизайн є зручним і наочним для схем невеликої складності. Він дозволяє зручно втілювати евристичні схемотехнічні рішення. Проте цей метод є практично неприйнятним для схем великої складності (від 10 тисяч логічних елементів), оскільки складно формулюється, не дає змоги швидко модифікувати проект, вчасно виявляти та усувати хиби проектування.
Незручність схемотехнічного проектування складних систем дала поштовх розробці низки мов проектування. Зокрема, на початку 80-х років Міністерство оборони США підтримало розробку мови VHDL (VHSIC hardware description language) в рамках програми VHSIC (very high-speed 1C). Цю ініціативу було підтримано Інститутом інженерів електриків та електронників (IEEE) з метою розробки стандарту мови — IEEE Standard 1076-1987. Згодом Міністерством Оборони США доповнило стандарт IEEE Standard 1076-1987 власним стандартом MIL-STD-454, який регламентував сам процес проектування НВІС із використанням мови VHDL. Інститутом IEEE запроваджено стандарт Std-1164 бібліотеки мови VHDL уведенням багаторівневої логіки, яка необхідна в моделюванні роботи інтегральної схеми, запроваджено стандарт Std-1029 регламентації способів верифікації та тестування проекту. В 1993 році запроваджено новий IEEE стандарт мови VHDL 1076-1993, що доповнив існуючий. Поширення набула абревіатура VHDL-87TaVHDL-93.
Мова VHDL дозволяє охопити водночас декілька рівнів проектування — від архітектурного до логічного. Ця мова апаратного опису дає змогу описати пристрій як на поведінковому, так і на структурному рівнях та провести симуляцію. Тут синтез топології кристала виконують засобами автоматизованого синтезу на основі поведінкового та структурного описів пристрою. У складних проектах застосування мови VHDL та потужного засобу логічного синтезу дозволяє синтезувати пристрої, які за ефективністю перевищують аналогічні, з використанням схемотехнічного методу синтезу.
Структура мікрокомп'ютера
Базова структура мікрокомп'ютера містить мікропроцесор Gnome, бллок FIFO та блок зовнішньої пам'яті (рис. 1). Наведена структура мікрокомп'ютера не є функціонально завершеною, оскільки нема інформаційного зв'язку на вивід даних з комп'ютера. З погляду учбового функціонального проектування таке обмеження не є критичним. До того ж, запропоновану структуру мікропроцесора можна доповнити додатковими компонентами з метою розширення функціональних можливостей мікрокомп'ютера.
Рис.1. Структура мікрокомп'ютера
Інформаційний тракт мікропроцесора Gnome
Інформаційний тракт складається з таких компонентів:
1. Восьмирозрядний мультиплексор МІ
Мультиплексор МІ формує фізичну адресу комірки пам'яті. Для пам'яті програм виділено адресний простір з фізичними адресами від 00h до 7fh
2. Програмно-доступні регістри PC, Z, С, АСС
Семирозрядний регістр PC призначено для зберігання вмісту
лічильника команд. Регістри Z та С є однорозрядними регістрами-тригерами, які зберігають поточне значення регістра ознаки нульового значення та регістра ознаки переносу. АСС - чотирирозрядний регістр, який виконує роль акумулятора.
3. Регістр інструкцій IR
Призначено для зберігання коду прочитаної інструкції. Керуючі сигнали ld_ir та ld_ir_lsn дозволяють завантажувати в регістр IR як 8-розрядне слово інструкції (табл.2), так і 4-розрядне слово даних з Регістроого файлу.
Таблиця 1
Ld_ir
Ld_ir_lsn
Дія
0
1
0
1
Збереження вмісту IR без змін
0
1
Завантаження в молодші розряди регістра інструкцій IR 4-розрядного слова з Регістрового файлу.
1
0
Завантаження в IR 8-розрядної інструкції з шини даних
4.Мультиплексор М2
Формує дані для АЛП, якщо керуючий сигнал rfifo=0 тоді в АЛП на вхід поступають 4 розрядні дані з шини даних IR, інакше 4 розрядні дані з черги.
Арифметико-логічний пристрій
АЛП є комбінаційним пристроєм, який виконує певні операції над вхідними операндами. Для випадку розглядуваного мікропроцесора Gnome першим вхідним операндом АЛП (рис.8) є поточна інформація з акумулятора сиr_асс, другим операндом є молодші 4 біти регістра команд сиr_іr, а також поточні значення ознак переносу curr_carry та нуля curr_zero. На виході блок АЛП залежно від коду операції alu_op формує результат: наступне значення акумулятора next_acc, отримане значення ознаки переносу next_carry, отримане значення ознаки нуля next_zero. Блок АЛП виконує невелику кількість операцій над 4-розрядними операндами (табл.4), що зумовлено простою системою команд мікропроцесора.
Рис. 3. Структурна схема АЛП
Таблиця 3
Допоміжні елементи
В інформаційному тракті мікропроцесора Gnome присутні повторювачі, інвертори та інші логічні елементи, які забезпечують формування керуючих сигналів та інформації на шині даних.
Керуючий автомат
Проектування керуючого автомата є складним та багатогранним етапом проектування, оскільки вимагає від розробника розуміння особливостей функціонування пристрою, вміння вибрати та ефективно спроектувати абстрактний автомат. Керуючий автомат — один з найважливіших блоків мікропроцесора. Спільно з генератором тактових імпульсів, який формує сигнал синхронізації clock, керуючий автомат забезпечує проходження подій в мікропроцесорі в правильній послідовності, тобто декодування інструкції та генерацію відповідних керуючих сигналів для реалізації елементарних операцій інформаційним трактом в циклах IF, ID, EX, встановлення в початковий стан вузлів мікропроцесора при надходженні сигналу встановлення в початковий стан reset. Множину керуючих сигналів складають сигнали read, write, ld_ir, ld_ir_lsn, inc_pc, jump_pc, alu_op, rdf, rfifo. Розглянемо детально, які значення керуючих сигналів формуються пристроєм керування на кожному циклі виконання інструкції.
1. Цикл вибирання інструкцій (Instruction Fetch cycle -IF)Завантаження з пам'яті інструкцій, інкремент значення лічильника
команд PC на одиницю:
read=l
write=0
ld_ir=l
ld_ir_lsn=0
inc_pc=l
jump_pc=0
alu_op=000 (NOP)
W_R=0
перехід до циклу ID
2. Цикл декодування інструкції/вибирання операнда з регістровогофайлу (Instruction decode/register fetch cycle - ID)
Для інструкцій LOAD_DIR, ADD_DIR, XOR_DIR, TEST_DIR, операндом яких є значення РЗП RO-R15, виконується читання та запис в молодші 4 розряди регістра IR значення з регістрового файлу:
W_R=0
read=0
write=0
ld_ir=0
ld_ir_lsn=l
inc_pc=l
jump_pc=0
alu_op=000 (NOP)
перехід до циклу ЕХ
Для інструкції Load_Ram
READ <= '1';
LD_IR <= '1';
Решта нулі
перехід до циклу ЕХ
Для решти інструкцій, які не вимагають завантаження усі керуючі сигнали присвоюються нулю
перехід до циклу ЕХ
З. Цикл виконання (Execute cycle - EX)
У даному циклі керуючі сигнали залежать від інструкції, це зумовлено відмінністю в множині мікрооперацій, виконуваних інформаційним трактом, для конкретної інструкції. Інструкції виконуються формуванням сигналів alu_op, inc_pc, jump_pc, write, W_R, read, rdf, rfifo.
. Розглянемо типові приклади формування керуючих сигналів для інструкції групи:
• ADD_DIR (група арифметико-логічних операцій):
alu_op=010 (ADD_OP)
перехід до циклу IF
• STORE_DIR (група операцій збереження результату):
write=l
перехід до циклу IF
• JUMP (група операцій умовних та безумовних переходів):
jump_pc=l
перехід до циклу IF
STORE_DIR(група операцій збереження результату):
WRITE <= '1';
перехід до циклу IF
Read_fifo (операція завантаження результату з черги):
rdf <= '1';
rfifo <= '1';
alu_op <= pass_op;
перехід до циклу IF
Симуляція роботи мікрокомп(ютера:
Висновки
Виконання даного курсового проекту надало мені можливість вивчити методи проектування основних вузлів процесора на ПЛМ. Я вдосконалив свої знання і вміння працювати в системі VHDL самостійно проектувати вузли процесора, максимально використовуючи при цьому засоби AHDL-редактора
ЛІТЕРАТУРА
1 .Методичні вказівки до циклу лабораторних робіт з курсу "Теорія і проектування комп'ютерних систем та мереж" для підготовки спеціалістів та магістрів на базі напрямку "Комп'ютерна інженерія" / Укл. Дунець Б.Р., Мельник А.О., Троценко В.В. - Львів: Видавництво ДУ "Львівська політехніка", 1999.-25с.
Методичні вказівки до дипломного проектування для студентівспеціальності 22.01 "Обчислювальні машини, системи, комплекси тамережі". - Львів, ЛШ, 1993.
Michael John Sebastian Smith Addison-Wesley Publishing CompanyVLSI Design Series 1,040 pages ISBN: 0-201-50022-1 June 1997
J.H. Henness, D.A.Patterson: Computer Architecture A QuantitativeApproach, Morgan Kaufman Publishers, 1990
P.J. Ashenden: The VHDL Cookbook, First Edition, University ofAdelaide, Australia, 1990
Інтернет сайт фірми Aldec Inc. http://www.aldec.com/
ДОДАТОК
Gen_Defs
ibrary IEEE;
use IEEE.STD_LOGIC_1164.all;
package Gen_Defs is
-- Asynchronous level-sensetive memory type
type memory is array (0 to 127) of std_logic_vector(7 downto 0);
type REGFILE is array (0 to 15) of std_logic_vector(3 downto 0);
-- MCU Instruction Set
constant CLEAR_C : std_logic_vector(7 downto 0) := "00000000";
constant SET_C : std_logic_vector(7 downto 0) := "00000001";
constant SKIP_C : std_logic_vector(7 downto 0) := "00000010";
constant SKIP_Z : std_logic_vector(7 downto 0) := "00000011";
constant read_fifo: std_logic_vector(7 downto 0) := "00000111";
constant LOAD_IMM : std_logic_vector(3 downto 0) := "0001";
constant ADD_IMM : std_logic_vector(3 downto 0) := "0010";
constant STORE_DIR: std_logic_vector(3 downto 0) := "0011";
constant LOAD_DIR : std_logic_vector(3 downto 0) := "0100";
constant ADD_DIR : std_logic_vector(3 downto 0) := "0101";
constant XOR_DIR : std_logic_vector(3 downto 0) := "0110";
constant TEST_DIR : std_logic_vector(3 downto 0) := "0111";
constant JUMP : std_logic := '1';
-- ALU Operation Codes
constant NOP_OP : std_logic_vector(2 downto 0) := "000"; -- translate A
constant PASS_OP : std_logic_vector(2 downto 0) := "001"; -- translate B
constant ADD_OP : std_logic_vector(2 downto 0) := "010"; -- OUT = A + B + Ci; form C
constant XOR_OP : std_logic_vector(2 downto 0) := "011"; -- OUT = A ^ B
constant AND_OP : std_logic_vector(2 downto 0) := "100"; -- OUT = A & B; form Z
constant SET_CARRY_OP: std_logic_vector(2 downto 0) := "101"; -- C = 1
constant CLR_CARRY_OP: std_logic_vector(2 downto 0) := "110"; -- C = 0
end Gen_Defs;
SysMemory
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
use WORK.GEN_DEFS.all;
entity SysMemory is
port(
ADDRESS: in std_logic_vector(6 downto 0);
nCSB : in std_logic;
nOEB : in std_logic;
DATA : out std_logic_vector(7 downto 0)
);
end SysMemory;
architecture Behavior of SysMemory is
begin
Read_Write:
process (ADDRESS, nCSB, nOEB)
variable mem_array: Memory := (others => "00000000");
-- variable sel : std_logic_vector(1 downto 0);
variable index : integer range 0 to 127;
begin
-- ROM program.
--- counter status
mem_array(5) := CLEAR_C; -- clear_c
mem_array(6) := READ_FIFO ; -- READ_FIFO
mem_array(7) := STORE_DIR & "0000"; -- store_dir r0 r0- counter
mem_array(8) := read_fifo ; -- READ_FIFO
mem_array(9) := STORE_DIR & "0001"; -- store_dir r1 r1- data register
mem_array(10) := LOAD_DIR & "0000"; -- load_dir r0
-- Memory behavior description
index := CONV_INTEGER(ADDRESS);
if nCSB = '1' then
DATA <= "ZZZZZZZZ";
else
if nOEB = '0' then
DATA <= mem_array(index);
else DATA <= "ZZZZZZZZ";
end if;
end if;
end process;
end Behavior;
---------------------------------------------------------------------------------------------------
regfiles
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
use WORK.GEN_DEFS.all;
entity regfiles is
port(
ADDRESSR: in std_logic_vector(3 downto 0);
clk : in std_logic;
nWER : in std_logic;
ACCR : in std_logic_vector(3 downto 0);
DATAR : out std_logic_vector(3 downto 0)
);
end regfiles;
architecture Behavior of regfiles is
begin
Read_Write:
process (clk)
variable reg_array: REGFILE := (others => "0000");
variable index : integer range 0 to 15;
begin
if clk'Event and clk='1' then
if nWER = '1' then reg_array(CONV_INTEGER(ADDRESSR)) := ACCR; -- memory write
end if;
end if;
DATAR <= reg_array(index);
end process;
end Behavior;
ALU
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
use WORK.GEN_DEFS.all;
entity ALU is
port(
CURR_ACC : in std_logic_vector(3 downto 0);
CURR_IR : in std_logic_vector(3 downto 0);
CURR_CARRY: in std_logic;
CURR_ZERO : in std_logic;
ALU_OP : in std_logic_vector(2 downto 0);
NEXT_ACC : out std_logic_vector(3 downto 0);
NEXT_CARRY: out std_logic;
NEXT_ZERO : out std_logic
);
end ALU;
architecture Behavior of ALU is
begin
PerformOperation:
process (CURR_ACC, CURR_IR, CURR_CARRY, CURR_ZERO, ALU_OP)
variable sm: std_logic_vector(4 downto 0);
begin
case ALU_OP is
when PASS_OP => NEXT_ACC <= CURR_IR;
NEXT_CARRY <= CURR_CARRY;
NEXT_ZERO <= CURR_ZERO;
when ADD_OP => sm := ('0' & CURR_ACC) + ('0' & CURR_IR) + ("0000" & CURR_CARRY);
NEXT_ACC <= sm(3 downto 0);
NEXT_CARRY <= sm(4);
if sm(3 downto 0) = "0000" then
NEXT_ZERO <= '1';
else
NEXT_ZERO <= '0';
end if;
when XOR_OP => NEXT_ACC <= CURR_ACC xor CURR_IR;
NEXT_CARRY <= CURR_CARRY;
NEXT_ZERO <= CURR_ZERO;
when AND_OP => NEXT_ACC <= CURR_ACC and CURR_IR;
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;
end Behavior;
Datapath
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
entity Datapath is
port(
-- Control Unit Interface
CLK : in std_logic;
RESET : in std_logic;
WRITE : in std_logic;
READ : in std_logic;
JUMP_PC : in std_logic;
INC_PC : in std_logic;
LD_IR : in std_logic;
LD_IR_LSN : in std_logic;
ALU_OP : in std_logic_vector(2 downto 0);
IR_DATA : out std_logic_vector(7 downto 0);
Z_ST : out std_logic;
C_ST : out std_logic;
-- External Memory Interface
ADDRESS: out std_logic_vector(6 downto 0);
DATA : in std_logic_vector(7 downto 0);
nCSB : out std_logic;
-- nWEB : out std_logic;
nOEB : out std_logic;
-- from fifo
Qf : in std_logic_vector(3 downto 0);
full : in std_logic;
rdf : out std_logic;
rfifo : in std_logic;
rdfcu : in std_logic;
fullcu : out std_logic
);
end Datapath;
architecture Behavior of Datapath is
component ALU is
port(
CURR_ACC : in std_logic_vector(3 downto 0);
CURR_IR : in std_logic_vector(3 downto 0);
CURR_CARRY: in std_logic;
CURR_ZERO : in std_logic;
ALU_OP : in std_logic_vector(2 downto 0);
NEXT_ACC : out std_logic_vector(3 downto 0);
NEXT_CARRY: out std_logic;
NEXT_ZERO : out std_logic
);
end component ALU;
component regfiles is
port(
ADDRESSR: in std_logic_vector(3 downto 0);
clk : in std_logic;
nWER : in std_logic;
ACCR : in std_logic_vector(3 downto 0);
DATAR : out std_logic_vector(3 downto 0)
);
end component regfiles;
signal IR, NEXT_IR : std_logic_vector(7 downto 0); -- Instruction Register
signal ACC, NEXT_ACC: std_logic_vector(3 downto 0); -- ACCumulator
signal Z, NEXT_Z : std_logic; -- Z flag
signal C, NEXT_C : std_logic; -- C flag
signal PC, NEXT_PC : std_logic_vector(6 downto 0); -- Program Counter
signal ACCRNEXT, DATARNEXT, ADDRESSRNEXT : std_logic_vector(3 downto 0);
signal IRMUX : std_logic_vector(3 downto 0);
signal rdf_dp,full_dp : std_logic;
begin
-- Memory Control Signals
nCSB <= '0';
nOEB <= not READ;
-- Address Bus (Multiplexer M1)
ADDRESS <= PC;
-- Data to PC (Multiplexer M2 and SM)
NEXT_PC <= IR(6 downto 0) when JUMP_PC = '1' else PC + 1 when INC_PC = '1' else PC;
-- Data to IR
NEXT_IR <= DATA when LD_IR = '1' else (IR(7 downto 4) & DATARNEXT)
when LD_IR_LSN = '1' else IR;
--REG ADDRES
ADDRESSRNEXT <=IR(3 DOWNTO 0);
-- FROM ALU
IRMUX <= Qf when rfifo = '1' else IR(3 downto 0);
-- State signals to Control Unit
Z_ST <= Z;
C_ST <= C;
IR_DATA <= IR;
-- Datapath registers implementation
Registers:
process (CLK, RESET)
begin
if RESET = '1' then -- asynchronous reset
PC <= "0000000";
IR <= "00000000";
ACC <= "0000";
Z <= '0';
C <= '0';
elsif CLK'Event and CLK = '1' then
PC <= NEXT_PC;
IR <= NEXT_IR;
ACC <= NEXT_ACC;
Z <= NEXT_Z;
C <= NEXT_C;
end if;
end process;
rdf <= rdf_dp;
rdf_dp <= rdfcu;
fullcu <= full_dp;
full_dp <= full;
-- ALU connections
U0:
component ALU
port map(
CURR_ACC => ACC,
CURR_IR => IRMUX,
CURR_CARRY => C,
CURR_ZERO => Z,
ALU_OP => ALU_OP,
NEXT_ACC => NEXT_ACC,
NEXT_CARRY => NEXT_C,
NEXT_ZERO => NEXT_Z
);
U1:
component regfiles
port map(
ADDRESSR => ADDRESSRNEXT,
clk => CLK,
nWER => WRITE,
ACCR => NEXT_ACC,
DATAR => DATARNEXT
);
end Behavior;
-------
ControlUnit
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use WORK.GEN_DEFS.all;ControlUnit
entity ControlUnit is
port(
CLK : in std_logic;
RESET : in std_logic;
IR_DATA : in std_logic_vector(7 downto 0);
Z_ST : in std_logic;
C_ST : in std_logic;
WRITE : out std_logic;
READ : out std_logic;
JUMP_PC : out std_logic;
INC_PC : out std_logic;
LD_IR : out std_logic;
LD_IR_LSN : out std_logic;
ALU_OP : out std_logic_vector(2 downto 0);
-- fofo--
rdf : out std_logic;
rfifo : out std_logic;
full : in std_logic
);
end ControlUnit;
architecture Behavior of ControlUnit is
type MachineStates is (I_F, I_D, E_X);
signal STATE, NEXT_STATE: MachineStates;
begin
-- Control Unit is implemented as Mealy FSM
StateRegister:
process (CLK)
begin
if CLK'Event and CLK = '1' then
if RESET = '1' then
STATE <= I_F;
else
STATE <= NEXT_STATE;
end if;
end if;
end process;
Transition_and_Output_Function:
process (CLK)
begin
READ <= '0';
WRITE <= '0';
JUMP_PC <= '0';
INC_PC <= '0';
LD_IR <= '0'
LD_IR_LSN <= '0';
ALU_OP <= "000";
rfifo <= '0';
rdf <= '0';
case STATE is
when I_F => READ <= '1';
INC_PC <= '1';
LD_IR <= '1';
NEXT_STATE <= I_D;
when I_D => if IR_DATA(7 downto 4) = ADD_DIR or IR_DATA(7 downto 4) = XOR_DIR or
IR_DATA(7 downto 4) = LOAD_DIR or IR_DATA(7 downto 4) = TEST_DIR then
LD_IR_LSN <= '1';
end if;
NEXT_STATE <= E_X;
when E_X => if IR_DATA = CLEAR_C then
ALU_OP <= CLR_CARRY_OP;
end if;
if IR_DATA = SET_C then
ALU_OP <= SET_CARRY_OP;
end if;
if IR_DATA = SKIP_C then
if C_ST = '1' then
INC_PC <= '1';
end if;
end if;
if IR_DATA = SKIP_Z then
ALU_OP <= PASS_OP;
if Z_ST = '1' then
INC_PC <= '1';
end if