Міністерство освіти і науки, молоді та спорту України
Національний університет «Львівська політехніка»
КУРСОВА РОБОТА
з дисципліни
«Комп’ютерна схемотехніка»
З А В Д А Н Н Я
Розробити спеціалізований обчислювач, що має відповідати наступним вимогам :
структурна схема обчислювача : мікропрограмний автомат Мілі;
робоча формула : Yi = ( Xi * N) mod 216, де 5 ≤ i ≤ 10 ( значення N та i задаються керівником курсового проекта );
формат даних : 16 бітний беззнаковий двійковий код з фіксованою комою( тобто коди від (0).0000 0000 0000 0000 до (0).1111 1111 1111 1111 );
інформаційний обмін здійснюється через паралельну 16-ти розрядну двонаправлену шину даних за допомогою додаткових сигналів синхронізації ( рівні сигналів сумісні з ТТЛ );
керуючий автомат реалізувати на основі ПЗП та регістра;
напруга живлення та тактові імпульси надходять від зовнішнього джерела, а сигнал початкового скидання формується локально.
Варіант №64 - константа N = 9В5616 , i=5
Зміст
Структурна схема спецобчислювача. 4
Блок схема алгоритму задачі. 5
Блок схема алгоритму роботи спецобчислювача. 5
Блок схема алгоритму обчислення добутку. 6
Функціональна схема спеціалізованого обчислювача. 7
Часові діаграми. 13
Режим вводу даних. 13
Режим виводу даних. 13
Часова діаграма обчислення проміжної суми. 14
Часова діаграма зсуву проміжної суми. 15
Принципова схема .
Опис автомата керування . 16
Обчислення загального часу роботи алгоритму множення. 17
Такт вводу. 17
Такт виводу. 17
Такт обчислення. 17
Моделювання засобами VHDL схеми спецобчислювача. 18
Моделювання роботи спеціалізованого обчислювача. 29
Висновок. 20
Список використаної літератури. 31
Додатки.
СТРУКТУРНА СХЕМА СПЕЦОБЧИСЛЮВАЧА
Схема складається з операційного пристрою, і пристрою керування. Операційний пристрій виконує множення заданої константи на число яке подається ззовні через двонаправлену шину вводу/виводу даних. Структурна схема спецобчислювача подана на рис.1.
Рис.1 Структурна схема спецобчислювача
БЛОК СХЕМА АЛГОРИТМУ ЗАДАЧІ
Блок схема алгоритму роботи спецобчислювача.
Алгоритм роботи спецобчислювача включає в себе наступні кроки:
Ввід даних;
Обчислення результату множення;
Перевірка кількості обчислень;
Вивід результату обчислень;
На двонаправлену 16-ти розрядну шину подаються по черзі 5 чисел, які заносяться в пам’ять. Потім, кожне число перемножується на задану константу. Провівши множення над всіма числами, результат подається на 16-ти розрядну шину і виводиться на зовні.
Рис.2 Блок схема алгоритму роботи спецобчислювача
Блок схема алгоритму обчислення добутку.
Для обчислення добутку на шину подаємо число (Ме) яке записане в пам’яті. Наступним кроком буде аналіз молодшого розряду Мк (задана константа). Якщо молодший розряд рівний одиниці, то до проміжної суми S
(спочатку S = 0), потрібно додати Мe і отриманий результат зсунути на один розряд вправо. Якщо молодший розряд рівний нулю, то достатньо зсунути проміжну суму S на один розряд. Виконавши ці кроки, потрібно перейти до наступного розряду Mк і повторити вищесказані дії. Після опрацювання останнього 16-го розряду множника зберігаємо отриману проміжну суму S
в пам’ять.
Рис.3 Блок схема алгоритму обчислення добутку
ФУНКЦІОНАЛЬНА СХЕМА СПЕЦІАЛІЗОВАНОГО ОБЧИСЛЮВАЧА
/
Рис.4 Функціональна схема спецобчислювача
Спеціалізований обчислювач Рис.4 складається з таких елементів :
Лічильник адреси;
ОЗП;
Суматор;
Регістр зсуву;
Буфер виводу;
Буфер вводу-виводу;
Автомат керування;
Інформаційний обмін здійснюється через паралельну 16-ти розрядну двонаправлену шину даних. Отримавши потрібний сигнал від пристрою керування, дані проходять через буфер вводу/виводу і записуються в пам’ять. Така послідовність дій повторюється N разів (з кожним повтором лічильник адреси збільшується на одиницю). Далі, в залежності від прошиття автомата керування, відбувається читання даних з пам’яті, додавання їх до проміжної суми, або зсув. Зсув відбувається в універсальному регістрі зсуву, який в даному випадку зсуває лише вправо.
Автомат керування реалізований на основі постійно запам’ятовуючого пристрою (ПЗП) і регістра. Для керування спецобчислювача потрібно 14 сигналів, також 10 сигналів потрібно для зворотнього зв’язку. Отож, автомат керування складається з поєднання трьох пар восьми розрядного регістра і ПЗП.
Для реалізації на принциповому рівні використаємо наступні елементи:
ЛІЧИЛЬНИК АДРЕСИ
/
8 – Gnd
16 - +5V
Рис.5 Лічильник адреси
1 – вхід інформаційний D2;
2 – вихід другого розряду Q2;
3 – вихід першого розряду Q1;
4 – вхід «обернений рахунок»;
5 – вхід «прямий рахунок»;
6 – вихід третього розряду Q3;
7 – вихід четвертого розряду Q4;
8 – Gnd;
9 – вхід інформаційний D8;
10 – вхід інформаційний D4;
11 – вхід попереднього запису;
12 – вихід «прямий перенос»
13 – вихід «обернений перенос»
14 – вхід установки в «0» R;
15 – вхід інформаційний D1;
ОПЕРАТИВНО ЗАПАМ’ЯТОВУЮЧИЙ ПРИСТРІЙ
12 – Gnd
24 - +5V
Рис.6 ОЗП
ОЗП серії CY7C128A (рис.6) являє собою асинхронну оперативну пам’ять об’ємом 16 кбит. Організація пам’ті 2К х 8. Цикл читання зображено на рис.7.
Цикл запису в ОЗП показано на рис.8.
/
Рис.7 Цикл читання
/
Рис.8 Цикл запису
СУМАТОР
8 – Gnd
16 - +5V
Рис.9 Суматор
Суматор серії ТТЛ К564ИМ1 – повний чотирьох розрядний суматор з переносом (рис.9) . Таблиця істинності даного суматора зображена в табл.1.
Таблиця 1
Ai
Bi
Pi
Si
Pi
0
0
0
0
1
1
1
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
0
1
1
0
1
0
0
1
0
0
0
1
0
1
1
1
Pi-1 –перенос з попереднього розряду;
Pi - перенос в наступний розряд;
РЕГІСТР ЗСУВУ
12 – Gnd
24 - +5V
Рис.10 Універсальний регістр
Мікросхема серії ТТЛ К155ІР13 - універсальний, восьми розрядний, синхронний регістр зсуву (рис.10). Кожна операція триває в регістрі не більше 20 нс, тому він придатний для обслуговування швидкісних процесорів та ЗУ як буферний накопичувач байта. Синхронну роботу регістру забезпечують спеціальні входи вибору режиму S0 і S1. У таблиці вказані поєднання рівнів на цих входах, що дозволяють переводити регістр в режими: зберігання (на входах S0 і S1 напруги низького рівня), паралельної завантаження (на цих входах напруги високого рівня), зсуву вліво (S1-в, S0-н) та зсуву вправо (S1-н, SO-в).
Таблиця істинності даного регістра зображена в табл.2.
Таблиця 2
Режим роботи
Вхід
Вихід
C
/R
S0
S1
DR
DL
Q0
Q1-Q6
Q7
Скид
x
0
x
x
x
x
0
0-0
0
Зберігання
↑
1
0
0
x
x
q0
q1-q6
q7
Зсув вліво
↑
1
0
0
x
1
q1
q2-q7
0
↑
1
1
0
x
1
q1
q2-q7
1
Зсув вправо
↑
1
0
1
0
x
0
q0-q5
q6
↑
1
0
1
1
x
1
q0-q5
q6
БУФЕР
10 – Gnd
20 - +5V
Рис.11 Буфер
Мікросхема серії SN74LV245 (рис.11) - двонаправлений буфер з можливістю переходу в третій стан. Таблиця істинності показана в табл. 3.
Таблиця 3
Dir
OE
0
0
A<=B
0
1
ZZZZZ
1
0
B<=A
1
1
ZZZZZ
ЧАСОВІ ДІАГРАМИ
Режим вводу даних.
Режим вводу даних передбачає встановлення буфера вводу/виводу в передачу з B на A. Це здійснюється за рахунок подачі низького рівня сигналу на входи керування. Далі дані поступають до ОЗП. Низьким рівнем сигналу на вхід WE дані записуються в потрібну область пам’яті. Часова діаграма вводу даних зображена на рис.12.
Рис.12 Часова діаграма вводу даних
Режим виводу даних.
Режим виводу даних передбачає встановлення буфера вводу/виводу в передачу з А на В. Це здійснюється за рахунок подачі низького рівня сигналу на вхід OE і високого рівня на вхід Dir. Наступним кроком буде читання отриманих результатів з пам’яті. Для цього встановлюємо низький рівень сигналу на вході дозволу читання ОЗП. Часова діаграма виводу даних зображена на рис.13.
Рис.13 Часова діаграма виводу даних
Часова діаграма обчислення проміжної суми.
На вході A0,…,A15 суматора поступають дані з регістра. Для обчислення проміжної суми, потрібно прочитати з пам’яті Me. Часова діаграма обчислення проміжної суми зображена на рис.14.
Рис.14. Часова діаграма обчислення суми
Часова діаграма зсуву проміжної суми.
Зсув проміжної суми відбувається в регістрі. Для зсуву на вхід S0 подаємо низький рівень сигналу, а на вхід S1 подаємо високий рівень. Часова діаграма зсуву проміжної суми зображена на рис.15.
Рис.15. Часова діаграма зсуву проміжної суми
ПРИНЦИПОВА СХЕМА
Принципова схема в додатку.
ОПИС АВТОМАТА КЕРУВАННЯ
6.1 Cтруктура регістру керування автоматом
S
RG
RAM
COUNTER
Буф. в/в
Буф. Вих.
23
22
21
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
S1
S0
R
CLK
WE
OE
CE
zr
pr
R
L
OE
DIR
OE
DIR
5-6
4
3
2
1
6.2 Коди керування:
- цикл вводу даних
004
7B
0111 1011
A9
1010 1001
01
0000 0001
Ввід
005
BB
1011 1011
09
0000 1001
01
0000 0001
006
F9
1111 1001
09
0000 1001
01
0000 1001
007
3B
0011 1011
09
0000 1001
02
0000 0010
- цикл обчислення
014
4F
0100 1111
8F
1000 1111
05
0000 0101
Сума
015
8F
1000 1111
0F
0000 1111
05
0000 0101
016
FA
1111 1010
0F
0000 1111
05
0000 0101
017
3F
0011 1111
0F
0000 1111
06
0000 0110
018
7B
0111 1011
8F
1000 1111
06
0000 0110
019
AB
1010 1011
8F
1000 1111
06
0000 0110
Зсув
01A
CF
1100 1111
8F
1000 1111
06
0000 0110
- цикл запису результату
04F
3B
0011 1011
0C
0000 1100
14
0001 0100
Запис
050
79
0111 1001
0C
0000 1100
14
0001 0100
051
BB
1011 1011
0C
0000 1100
14
0001 0100
052
F9
1111 1001
C3
1100 0011
14
0001 0100
- цикл виводу
14F
3B
0011 1011
A9
1010 1001
54
0101 0100
Вивід
150
7B
0111 1011
0B
0000 1011
54
0101 0100
151
BA
1011 1010
0B
0000 1011
54
0101 0100
152
FB
1111 1011
0B
0000 1011
54
0
ОБЧИСЛЕННЯ ЗАГАЛЬНОГО ЧАСУ РОБОТИ АЛГОРИТМУ МНОЖЕННЯ
Такт вводу:
Запис одного числа в пам’ять займає 4 такти. Оскільки, в завданні сказано працювати з п’ятьма числами, то загальний такт вводу займає 20 тактів;
Такт виводу:
Вивід одного числа займає 4 тактів. Оскільки є 5 чисел, то загальний такт виводу займатиме 20 тактів;
Такт обчислення:
Для обчислення одного множення потрібно 62 такти. Загальна кількість тактів на обчислення – 310.
Загальний час роботи – 350 тактів.
МОДЕЛЮВАННЯ ЗАСОБАМИ VHDL СХЕМИ СПЕЦОБЧИСЛЮВАЧА
Модель розробленого спеціалізованого обчислювача показано на рис.16.
Рис. 16
VHDL коди складових спецобчислювача:
Лічильник адреси;
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity counter is
port(
L : in STD_LOGIC; -- âõ³ä ïîïåðåäíüîãî çàïèñó
R : in STD_LOGIC; -- ñêèä òðèãåð³â â "0"
pr : in STD_LOGIC; -- âõ³ä "ïðÿìèé ðàõóíîê"
zr : in STD_LOGIC; -- âõ³ä "çâîðîòí³é ðàõóíîê"
D : in STD_LOGIC_VECTOR(0 to 3); -- ³íôîðìàö³éí³ âõîäè
Q : out STD_LOGIC_VECTOR(0 to 3); -- ³íôîðìàö³éí³ âèõîäè
pp : out STD_LOGIC; -- âèõ³ä "ïðÿìèé ïåðåíîñ"
zp : out STD_LOGIC -- âèõ³ä "çâîðîòí³é ïåðåíîñ"
);
end counter;
architecture counter of counter is
signal CNT_VAL: std_logic_vector(3 downto 0);
begin
Q<=CNT_VAL;
process(L,R,pr,zr)
begin
pp<='0';
zp<='0';
if pr'event and pr='0' then
if R='1' then CNT_VAL<=(others=>'0');
else
if L='0' then CNT_VAL<=D;
else
if L='1' then CNT_VAL<=CNT_VAL+1;
if CNT_VAL="1111" then pp<='1';
end if;
end if;
end if;
end if;
end if;
if zr'event and zr='0' then
if R='1' then CNT_VAL<=(others=>'0');
else
if L='0' then CNT_VAL<=D;
else
if L='1' then CNT_VAL<=CNT_VAL-1;
if CNT_VAL="0000" then zp<='1';
end if;
end if;
end if;
end if;
end if;
end process;
end counter;
ОЗП;
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity ram is
port(
CE : in STD_LOGIC;
WE : in STD_LOGIC;
OE : in STD_LOGIC;
AD : in STD_LOGIC_VECTOR(10 downto 0);
D : inout STD_LOGIC_VECTOR(7 downto 0)
);
end ram;
architecture ram of ram is
type MEM is array(0 to 2047) of
std_logic_vector (7 downto 0);
begin
PROCESS(AD, CE, OE, WE, D)
TYPE ram_array IS ARRAY (0 TO 2047) OF BIT_VECTOR(7 DOWNTO 0);
VARIABLE index : INTEGER := 0;
VARIABLE ram_store : ram_array;
BEGIN
IF CE = '0' THEN
index := 0;
FOR i IN AD'RANGE LOOP
IF AD(i) = '1' THEN
index := index + 2**i;
END IF;
END LOOP;
IF rising_edge(WE) THEN
ram_store(index) := To_bitvector(D);
ELSIF OE = '0' THEN
D <= To_StdlogicVector(ram_store(index));
ELSE
D <= "ZZZZZZZZ";
END IF;
ELSE
D <= "ZZZZZZZZ";
END IF;
END PROCESS;
end ram;
Суматор;
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.all;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity Sum is
port(
C0 : in STD_LOGIC;
A : in STD_LOGIC_VECTOR(3 downto 0);
B : in STD_LOGIC_VECTOR(3 downto 0);
C4 : out STD_LOGIC;
P : out STD_LOGIC_VECTOR(3 downto 0)
);
end Sum;
architecture Sum_arc of Sum is
signal tmp: std_logic_vector(4 downto 0);
begin
tmp <= conv_std_logic_vector((conv_integer(A) + conv_integer(B) + conv_integer(C0)), 5);
P <= tmp(3 downto 0);
C4 <= tmp(4);
end Sum_arc;
architecture Sum_arc of Sum is
signal tmp: std_logic_vector(4 downto 0);
begin
tmp <= conv_std_logic_vector((conv_integer(A) + conv_integer(B) + conv_integer(C0)), 5);
P <= tmp(3 downto 0);
C4 <= tmp(4);
end Sum_arc;
Регістр зсуву;
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity RG is
port(
CLK : in STD_LOGIC;
CLR : in STD_LOGIC;
DSR : in STD_LOGIC;
DSL : in STD_LOGIC;
S0 : in STD_LOGIC;
S1 : in STD_LOGIC;
D : in STD_LOGIC_VECTOR(7 downto 0);
Q : out STD_LOGIC_VECTOR(7 downto 0)
);
end RG;
architecture RG of RG is
SIGNAL INT_DAT : std_logic_vector (7 downto 0);
SIGNAL S1_S0 : std_logic_vector (1 downto 0);
begin
Q<=INT_DAT;
S1_S0 <= S1&S0;
process (CLK, CLR)
begin
if CLR ='0' then INT_DAT<=(others =>'0') ;
elsif rising_edge(CLK) then
case S1_S0 is
when "01" => INT_DAT <= INT_DAT (6 downto 0) & DSR;
when "10" => INT_DAT <= DSL & INT_DAT(7 downto 1);
when "11" => INT_DAT <= D;
when others =>
end case;
end if;
end process ;
end RG;
Буфер;
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity Buf is
port(
Dir : in STD_LOGIC;
OE : in STD_LOGIC;
A : inout STD_LOGIC_VECTOR(7 downto 0);
B : inout STD_LOGIC_VECTOR(7 downto 0)
);
end Buf;
--}} End of automatically maintained section
architecture Buf of Buf is
begin
A<=B when (OE = '0' and Dir = '0') else (others =>'Z');
B<=A when (OE = '0' and Dir = '1') else (others =>'Z');
end Buf;
Автомат керування;
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.all;
entity Avt is
port(
Clk : in STD_LOGIC;
Res : in STD_LOGIC;
load : in STD_LOGIC;
We_RE : in STD_LOGIC;
S : in STD_LOGIC_VECTOR(7 downto 0);
O : out STD_LOGIC_VECTOR(23 downto 0);
Mk : out STD_LOGIC_VECTOR(15 downto 0)
);
end Avt;
architecture Avt of Avt is
signal q:integer;
signal k :std_logic_vector(23 downto 0);
begin
process(CLK,Res)
begin
if Res = '1'
then k <= X"00473D";
elsif (CLK ='1' and CLK'event) then
q<= CONV_INTEGER(S);
case q is
when 0 => k <= X"01C733";
when 1 => k <= X"02E613";
when 2 => k <= X"03E213";
when 3 => k <= X"04E613";
when 4=> k <= X"05A719";
when 5=> k <= X"06371D";
when 6=> k <= X"07371F";
when 7=> k <= X"08361F";
when 8=> k <= X"09E41F";
when 9=> k <= X"0aF61F";
when 10=> k <= X"0bE71D";
when 11=> k <= X"0c371F";
when 12=> k <= X"0d361F";
when 13=> k <= X"0eE41F";
when 14=> k <= X"0fF61F";
when 15=> k <= X"10E71D";
when 16=> k <= X"11A719";
when 17=> k <= X"12371D";
when 18=> k <= X"13371F";
when 19=> k <= X"14361F";
when 20=> k <= X"15E41F";
when 21=> k <= X"16F61F";
when 22=> k <= X"17E71D";
when 23=> k <= X"18A719";
when 24=> k <= X"19371D";
when 25=> k <= X"1a371F";
when 26=> k <= X"1b361F";
when 27=> k <= X"1cE41F";
when 28=> k <= X"1dF61F";
when 29=> k <= X"1eE71D";
when 30=> k <= X"1fA719";
when 31=> k <= X"20371D";
when 32=> k <= X"21371F";
when 33=> k <= X"22361F";
when 34=> k <= X"23E41F";
when 35=> k <= X"24F61F";
when 36=> k <= X"25E71D";
when 37=> k <= X"26371F";
when 38=> k <= X"27361F";
when 39=> k <= X"28E41F";
when 40=> k <= X"29F61F";
when 41=> k <= X"2aE71D";
when 42=> k <= X"2bA719";
when 43=> k <= X"2c371D";
when 44=> k <= X"2d371F";
when 45=> k <= X"2e361F";
when 46=> k <= X"2fE41F";
when 47=> k <= X"30F61F";
when 48=> k <= X"31E71D";
when 49=> k <= X"32371F";
when 50=> k <= X"33361F";
when 51=> k <= X"34E41F";
when 52=> k <= X"35F61F";
when 53=> k <= X"36E71D";
when 54=> k <= X"37A719";
when 55=> k <= X"38371D";
when 56=> k <= X"39A719";
when 57=> k <= X"3a371D";
when 58=> k <= X"3b371F";
when 59=> k <= X"3c361F";
when 60=> k <= X"3dE41F";
when 61=> k <= X"3eF615";
when 62=> k <= X"3fE715";
when others => k <= X"000000";
END CASE;
end if;
O<=k;
END PROCESS;
end Avt;
VHDL код спецобчислювача:
library IEEE;
use IEEE.std_logic_1164.all;
entity COMP is
port(
CLK : in STD_LOGIC;
LOAD : in STD_LOGIC;
RES : in STD_LOGIC;
WE_RE : in STD_LOGIC;
Cnt : out STD_LOGIC_VECTOR(3 downto 0);
S : out STD_LOGIC_VECTOR(7 downto 0);
Temp : out STD_LOGIC_VECTOR(15 downto 0);
Q : inout STD_LOGIC_VECTOR(15 downto 0)
);
end COMP;
architecture COMP of COMP is
---- Component declarations -----
component Avt
port (
Clk : in STD_LOGIC;
Res : in STD_LOGIC;
S : in STD_LOGIC_VECTOR(7 downto 0);
We_RE : in STD_LOGIC;
load : in STD_LOGIC;
Mk : out STD_LOGIC_VECTOR(15 downto 0);
O : out STD_LOGIC_VECTOR(23 downto 0)
);
end component;
component Buf
port (
Dir : in STD_LOGIC;
OE : in STD_LOGIC;
A : inout STD_LOGIC_VECTOR(7 downto 0);
B : inout STD_LOGIC_VECTOR(7 downto 0)
);
end component;
component counter
port (
D : in STD_LOGIC_VECTOR(0 to 3);
L : in STD_LOGIC;
R : in STD_LOGIC;
pr : in STD_LOGIC;
zr : in STD_LOGIC;
Q : out STD_LOGIC_VECTOR(0 to 3);
pp : out STD_LOGIC;
zp : out STD_LOGIC
);
end component;
component ram
port (
AD : in STD_LOGIC_VECTOR(10 downto 0);
CE : in STD_LOGIC;
OE : in STD_LOGIC;
WE : in STD_LOGIC;
D : inout STD_LOGIC_VECTOR(7 downto 0)
);
end component;
component reg_16
port (
CLK : in STD_LOGIC;
D : in STD_LOGIC_VECTOR(15 downto 0);
DSL : in STD_LOGIC;
R : in STD_LOGIC;
S0 : in STD_LOGIC;
S1 : in STD_LOGIC