- •Загальні положення
- •Завдання на проектування
- •Вимоги до змісту пояснювальної записки
- •Вимоги до окремих розділів
- •Вимоги щодо оформлення пояснювальної записки
- •Аналіз системи інструкцій процесора Gnome
- •Інформаційний тракт процесора Gnome
- •Проектування блоку основної пам’яті
- •Цикл if (вибірка інструкції)
- •Цикл ex (обчислення результату)
- •Проектування пристрою керування виконання команд
- •Проектування Операційного пристрою
- •Інтеграція складових проекту
- •Моделювання роботи комп’ютера
- •Список рекомендованої літератури
Проектування Операційного пристрою
Створити інтерфейс операційного пристрою з наступними портами:
ENTITY Datapath IS
PORT(clock: IN std_logic;
reset: IN std_logic;
data: INOUT std_logic_vector(7 DOWNTO 0);
address:OUT std_logic_vector(7 DOWNTO 0);
csb: OUT std_logic;
oeb: OUT std_logic;
web: OUT std_logic;
write: IN std_logic;
read: IN std_logic;
inc_pc: IN std_logic;
jump_pc:IN std_logic;
ld_ir: IN std_logic;
sel_dm: IN std_logic;
alu_op: IN std_logic_vector(2 DOWNTO 0);
ld_op: IN std_logic;
data_out:IN std_logic;
Z_st: OUT std_logic;
C_st: OUT std_logic;
IR_data:OUT std_logic_vector(7 DOWNTO 0);
Rg_op: IN std_logic;
write_ixh: IN std_logic;
write_ixl: IN std_logic;
RgWrite: IN std_logic);
END Datapath;
В блоці ARCHITECTURE (до оператора BEGIN) задекларувати наступні сигнали:
SIGNAL IR, next_IR, IX, next_IX :std_logic_vector(7 DOWNTO 0);
SIGNAL ACC, next_ACC, B :std_logic_vector(3 DOWNTO 0);
SIGNAL Z, next_Z, C, next_C :std_logic;
SIGNAL PC, next_PC :std_logic_vector(7 DOWNTO 0);
SIGNAL RgNum, RgIn, RgOut: std_logic_vector(3 DOWNTO 0);
А також використання створених раніше компонентів – АЛП та Блоку регістрів:
-- Use Component ALU----------------------------------
COMPONENT ALU
PORT(curr_acc: IN std_logic_vector(3 DOWNTO 0);
curr_b: 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;
-- Use Component Register File------------------------
COMPONENT Regs16 is
port(clk: in STD_LOGIC;
reset: in STD_LOGIC;
Addr: in STD_LOGIC_VECTOR (3 downto 0);
DataIn: in STD_LOGIC_VECTOR (3 downto 0);
DataOut:out STD_LOGIC_VECTOR (3 downto 0);
write1: in STD_LOGIC);
end COMPONENT;
Після оператора BEGIN реалізуємо елементи операційного пристрою:
-- Мультиплексор M1
address <= IX WHEN sel_dm='1'
ELSE PC;
-- Завантаження інструкції в Регістр IR:
next_IR <= data WHEN ld_ir='1'
ELSE IR;
-- Шинний формувач B1 реалізує вивід даних на шину, або z-стан на виході
data <= "0000" & B WHEN data_out='1'
ELSE "ZZZZZZZZ";
-- Завантаження Регістру PC, Мультиплексор M2, Суматор Sm
next_PC <= IX WHEN jump_pc='1'
ELSE PC+1 WHEN inc_pc='1'
ELSE PC;
-- Мультиплексор M4
RgIn <= data(3 DOWNTO 0) WHEN ld_op='1'
ELSE ACC;
-- Мультиплексор M3
B <= RgOut WHEN Rg_op='1'
ELSE IR (3 DOWNTO 0);
-- Регістр IX
next_IX <= B & IX (3 DOWNTO 0) WHEN write_ixh='1'
ELSE IX (7 DOWNTO 4) & B WHEN write_ixl='1'
ELSE IX;
-- Передача Коду інструкції та прапорців АЛП до пристрою керування
C_st <= C;
Z_st <= Z;
IR_data <= IR;
-- Вибір номера регістру з тіла інструкції
RgNum <= IR (3 DOWNTO 0);
Процес, що реалізує початковий скид регістрів, та оновлення регістрів за тактовим імпульсом:
reg_impl:PROCESS (clock, reset)
BEGIN
IF reset='1' THEN
PC <= "00000000";
IR <= "00000000";
ACC <= "0000";
IX <= "00000000";
C <= '0';
Z <= '0';
ELSIF (clock='1' AND clock'EVENT) THEN
PC <= next_PC;
IR <= next_IR;
ACC <= next_ACC;
IX <= next_Ix;
C <= next_C;
Z <= next_Z;
END IF;
END PROCESS;
Для під єднання компонентів використати оператор PORT MAP:
ALU_Connection: ALU
PORT MAP(curr_acc => ACC,
curr_b => B,
curr_carry => C,
curr_zero => Z,
alu_op => alu_op,
next_acc => next_ACC,
next_carry => next_C,
next_zero => next_Z);
Regs16_Connection: Regs16
PORT MAP(clk => clock,
reset => reset,
Addr => IR(3 DOWNTO 0),
DataIn => RgIn,
write1 => RgWrite,
DataOut => RgOut);
