Частина тексту файла (без зображень, графіків і формул):
МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
Національний університет “Львівська політехніка”
Інститут екології, природоохоронної діяльності та туризму
ім. В’ячеслава Чорновола
КАФЕДРА ЗАГАЛЬНОЇ ЕКОЛОГІЇ
ТА ЕКОІНФОРМАЦІЙНИХ СИСТЕМ
Розрахункова робота
з дисципліни
Автоматизація проектування
комп’ютерних систем
Мета розрахункової роботи: здобути навики аналізу HDL-описів обчислювальних вузлів для подальшого їх використанням при проектуванні комп’ютерних систем.
HDL реалізація АЛП має наступний вигляд:
-- File: ALU.vhd
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.std_logic_arith.ALL;
USE IEEE.std_logic_unsigned.ALL;
ENTITY ALU IS
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 ALU;
ARCHITECTURE behavioral OF ALU IS
-- Constants responding ALU operations
CONSTANT NOP_OP: std_logic_vector (2 DOWNTO 0):= "000";
CONSTANT LOAD_OP: std_logic_vector (2 DOWNTO 0):= "001";
CONSTANT ADD_OP: std_logic_vector (2 DOWNTO 0):= "010";
CONSTANT XOR_OP: std_logic_vector (2 DOWNTO 0):= "011";
CONSTANT AND_OP: std_logic_vector (2 DOWNTO 0):= "100";
CONSTANT SET_C_OP: std_logic_vector (2 DOWNTO 0):= "101";
CONSTANT CLR_C_OP: std_logic_vector (2 DOWNTO 0):= "110";
BEGIN
PROCESS (curr_acc, curr_b, curr_carry, curr_zero, alu_op)
VARIABLE sum : std_logic_vector (4 DOWNTO 0);
BEGIN
CASE alu_op IS
WHEN NOP_OP =>
next_acc <= curr_acc;
next_carry <= curr_carry;
next_zero <= curr_zero;
WHEN XOR_OP=>
next_acc <= curr_acc XOR curr_b;
next_carry <= curr_carry;
next_zero <= curr_zero;
WHEN ADD_OP =>
sum := ('0'& curr_acc)+('0' & curr_b)+("0000" & curr_carry);
next_acc <= sum (3 DOWNTO 0);
next_carry <= sum (4);
next_zero <= curr_zero;
WHEN LOAD_OP =>
next_acc <= curr_b;
next_carry <= curr_carry;
next_zero <= curr_zero;
WHEN AND_OP =>
next_acc <= curr_acc;
next_carry <= curr_carry;
next_zero <= NOT((curr_acc(3) AND curr_b(3))
OR (curr_acc(2) AND curr_b(2))
OR (curr_acc(1) AND curr_b(1))
OR (curr_acc(0) AND curr_b(0)));
WHEN SET_C_OP =>
next_acc <= curr_acc;
next_carry <= '1';
next_zero <= curr_zero;
WHEN CLR_C_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 behavioral;
Завдання на розрахункову роботу:
Доповнити наведений код коментарями що пояснюють його роботу
Пояснити роботу АЛП при наступних вхідних сигналах
alu_op – порядковий номер студента в групі (1 до 6, далі по колу, 7=1)
curr_acc – рівне кількості літер в імені студента (1 до 15, далі по колу, 16=1)
curr_b – рівне кількості літер в прізвищі студента (1 до 15, далі по колу, 16=1)
curr_carry – «1», якщо кількість літер в імені студента парна, інакше «0»
curr_ zero – «1», якщо кількість літер в прізвищі студента парна, інакше «0»
Пояснити роботу АЛП при тих же вхідних сигналах, що і в п.2, але значення alu_op збільшити на 3.
Виконання завданння
Студент Миколів Василь, № в журналі 14.
alu_op =001 (2)
curr_acc = 0110 (6 літери)
curr_b = 0111 (7 літер)
curr_carry – 1 (парна кількість)
curr_ zero – 1 (парна кількість)
Основу АЛП складає процес PROCESS зі списком чутливості (curr_acc, curr_b, curr_carry, curr_zero, alu_op)
Процес виконується при зміні будь-якого з сигналів із списку чутливості.
Оголошена Змінна
VARIABLE sum : std_logic_vector (4 DOWNTO 0);
Типу масив з 4 однорозрядних елементів (4 біти).
Оператор вибору CASE аналізує значення вхідного сигналу alu_op. В нашому випадку
alu_op = "001"; або
alu_op = LOAD_OP (задана константою для покращення читабельності).
Тому буде вибрано блок операторів
WHEN LOAD_OP =>
next_acc <=’0111’;
-- присвоїти сигналу next_acc значення вхідного сигналу curr_b;
-- в результаті виконання операції вмістиме акумулятора зміниться і буде рівне «0111»
next_carry <= curr_carry ;
-- присвоїти сигналу next_carry значення вхідного сигналу curr_carry;
-- в результаті виконання операції ознака переносу не зміниться і буде рівною «1»
next_zero <= curr_ zero;
-- присвоїти сигналу next_ zero значення вхідного сигналу curr_ zero;
-- в результаті виконання операції ознака нульового результату не зміниться і буде рівна «1»
Висновок: Команда АЛП LOAD_OP в акумулятор поміщає значення з входу curr_b, ознаки переносу при цьому не змінюються.