МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра ЕОМ
/
КУРСОВА РОБОТА
з курсу
“Комп’ютерна схемотехніка” і
“моделювання комп’ютерних систем.”
На тему:
«Розробка спеціалізованого обчислювача»
Зміст
Завдання…………………………………………………………………………..3
Структурна схема спецобчислювача……………………………………………4
Блок схема алгоритму задачі…………………………………………………….5
Функціональна схема спеціалізованого обчислювача…………………………6
Принципова схема та її опис…………………….………………………………7
Обчислення загального часу роботи алгоритму множення…………………11
Такт вводу……………………………………………………………………11
Такт виводу. …………………………………………………………………11
Такт обчислення. ……………………………………………………………11
Опис автомата керування ……………………………………………………..12
Таблиця прошиття ПЗП……………………..…………………………………………………13
Граф автомата……………………………………………………….……14
VHDL реалізація проекту………………………………………………………15
7.1. Результати моделювання…………………………………………………..16
7.2. VHDL опис використаних пристроїв……………………………………..17
Висновок. …………………………………………………………………...………22
Список використаної літератури. ………………………………………..………..23
Додатки.
ЗАВДАННЯ:
Розробити спеціалізований обчислювач, що має відповідати наступним вимогам :
структурна схема обчислювача : мікропрограмний автомат Мілі;
робоча формула : див. таблицю (варіант задається керівником проекту);
формат даних : 8 бітний доповняльний код
інформаційний обмін здійснюється через паралельну 8-ти розрядну двонаправлену шину даних за допомогою додаткових сигналів синхронізації ( рівні сигналів сумісні з ТТЛ );
керуючий автомат реалізувати на основі ПЗП та регістра;
напруга живлення та тактові імпульси надходять від зовнішнього джерела а сигнал початкового скидання також формується ззовні.
Згідно варіанту формула: Yi = Xi/16 – 7∙Xi+1 /8
К-сть введених значень: 14
Структурна схема спецобчислювача
На рис 1. подана структурна схема спецобчислювача.
/
Рис.1 Структурна схема спецобчислювача
Схема складається з двох елементів, а саме операційного пристрою, і пристрою керування.
Операційний пристрій виконує обрахунок заданої формули за допомогою значень, що надходять ззовні через двонаправлену шину вводу/виводу даних.
Пристрій керування реалізований на автоматі Мілі, він подає відповідні сигнали керування операційному пристрою для коректного опрацювання даних.
Блок схема алгоритму задачі.
Функціональна схема спеціалізованого обчислювача.
На рис.4 подана функціональна схема спецобчислювача
До складу вищенаведеного спеціалізованого обчислювача входять наступні елементи:
ОЗП;
Суматор;
Регістр зсуву;
Лічильник адреси;
Буфер виводу;
Буфер вводу-виводу;
ПЗП;
Регістр автомата.
Обмін інформацією виконується через паралельну 8-ти розрядну двонаправлену шину даних. Отримавши потрібний сигнал від пристрою керування, дані проходять через буфер вводу/виводу і записуються в пам’ять. Така послідовність дій повторюється N разів (з кожним повтором лічильник адреси збільшується на одиницю). Далі, в залежності від прошиття автомата керування, відбувається читання даних з пам’яті і обрахунок за допомогою цих пристроїв( додавання, ділення зсувом на 2, інверсія, і.т.д.). Після цього через буфер вводу/виводу виводимо дані порціями N разів.
Автомат керування реалізований на основі постійно запам’ятовуючого пристрою (ПЗП) і регістра. Для керування спецобчислювача потрібно 16 сигналів, також 8 сигналів потрібно для зворотнього зв’язку. Отож, автомат керування складається з поєднання трьох пар восьмирозрядного регістра і ПЗП.
4.1. Елементи принципової схеми
ОПЕРАТИВНО ЗАПАМ’ЯТОВУЮЧИЙ ПРИСТРІЙ
На рис. 5 поданий оперативно запам’ятовуючий пристрій серії CY7C128A .
12 – Gnd; 24 - +5V
Рис.2. ОЗП
ОЗП серії IDT611SA являє собою асинхронну оперативну пам’ять об’ємом 16 кбит. Організація пам’яті 2К х 8.
Таблиця даного ОЗП приведена в таблиці 1.
Таблиця 1
Режим
CE
OE
WE
DQ
Збереження
0
1
1
Z
Запис
0
0
0
DATAin
Читання
0
0
1
DATAout
Неробочий режим
1
X
X
Z
РЕГІСТР ЗСУВУ
На рис. 9 подана мікросхема серії ТТЛ К155ИР13 , яка являє собою універсальний, восьми розрядний, синхронний регістр зсуву
12 – Gnd; 24 - +5V
Рис.4. Універсальний регістр
Кожна операція триває в регістрі не більше 20 нс, тому він придатний для обслуговування швидкісних процесорів та ЗУ як буферний накопичувач байта. Синхронну роботу регістру забезпечують спеціальні входи вибору режиму S0 і S1. У таблиці вказані поєднання рівнів на цих входах, що дозволяють переводити регістр в режими: зберігання (на входах S0 і S1 напруги низького рівня), паралельної завантаження (на цих входах напруги високого рівня), зсуву вліво (S1-в, S0-н) та зсуву вправо (S1-н, SO-в).
Таблиця істинності даного регістра зображена в табл.3.
Таблиця 3
Режим роботи
Вхід
Вихід
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 подана мікросхема серії ТТЛ К155ИЕ7, яка являє собою лічильник.
8 – Gnd; 16 - +5V
Рис.5. Лічильник
Лічильник представляє із себе двійковий синхронний лічильник. ИЕ7 має асинхронне скидання і асинхронне початкове завантаження.
Таблиця істинності лічильника подана на рис. 6./
Рис.6. Таблиця істинності лічильника
БУФЕР
На рис. 7 подана мікросхема серії SN74LV245 , яка являє собою двонаправлений буфер з можливістю переходу в третій стан.
10 – Gnd; 20 - +5V
Рис.7. Буфер
Таблиця істинності показана в табл. 4.
Таблиця 4
Dir
OE
0
0
A<=B
0
1
ZZZZZ
1
0
B<=A
1
1
ZZZZZ
В таблиці 3 символи «ZZZZZ» позначають високий імпеданс.
Вирази «A<=B» означає присвоєння сигналу А значення сигналу В.
Вирази «B<=A» означає присвоєння сигналу B значення сигналу A
5. Обчислення загального часу роботи алгоритму множення.
Такт вводу:
Для того, щоб записати одне число в пам’ять необхідно 2 такти.
Ми записуємо 14 чисел, тому для запису чисел необхідно 28 тактів.
Щоб закінчити цикл вводу, ми переходимо на старші адреси, тому необхідно ще 2 такти.
Загалом 30 такти.
Такт виводу:
Для того, щоб вивести одне число в пам’ять необхідно 1 такт.
Ми виводимо 13 чисел, тому для запису чисел необхідно 13 тактів.
Щоб закінчити вивід, ми переходимо на старші адреси, тому необхідно ще 1 такт.
Загалом 14 тактів.
Такт обчислення:
Для обчислення одного результату необхідно 42 такти.
Ми виконуємо 13 обчислень, тому для множення необхідно 546 тактів.
Щоб закінчити цикл обрахунку, ми переходимо на старші адреси, тому необхідно ще 1 такт.
Загалом 547 такти.
Загальна к-сть тактів: 590 тактів.
6.Опис автомата керування
Структура регістру керування автоматом подана в табл.5.
Таблиця 5
/
Буфер вводу/виводу:
ОЕ- дозвіл роботи
DIR:- напрям передавання даних
Лічильник:
+1 - інкремент
-1 - декремент
Load – паралельний запис
Оперативно запам’товуючий пристрій:
WE-режим запису\читання
ОЕ-дозвіл виводу на виходи ОЗП
Регістр :
S1 – вхід для вибору команди запису/зсуву вліво
So – вхід для вибору команди запису/зсуву вправоСLK - синхроімпульс
6.1. Таблиця прошиття ПЗП
aaddr(7:0)
N(3:0)
INC
DEC
ct_ld
R
ram_oe
ram_we
Invert
DR
DL
rg_sl
rg_sr
rg_rst
clk2
res_en
io_en
r_or_l
0
1
1
1
0
0
1
0
0
0
0
0
0
0
0
0
0
0
Підготовказапису(S0)
1025
1
0
1
1
0
1
0
0
0
0
0
0
0
0
0
0
0
ЗАПИС У ПАМЯТЬ(S1-S2)
1026
1
1
1
1
0
0
1
0
0
0
0
0
0
0
0
0
0
1282
1
1
1
0
0
0
0
0
0
0
0
0
0
0
0
1
0
закриття буфера(S3)
1283
1
0
1
1
0
0
0
0
0
0
0
0
0
1
0
1
0
збереження в рег 1 адреси(S4)
3
1
0
1
1
0
1
0
0
0
0
0
0
0
0
0
1
0
Інкремент(S23)
4
1
1
1
1
0
0
0
0
0
0
0
0
0
0
0
1
0
46
1
1
1
1
0
0
0
0
0
0
0
0
0
1
0
1
0
збереження в регістр(S24)
5
1
0
1
1
0
1
0
0
0
0
0
1
0
0
0
1
0
зсув вправо(S5-S6)
12
1
0
1
1
0
1
0
0
0
0
0
1
0
1
0
1
0
13
1
0
1
1
0
1
0
0
0
0
0
1
0
1
1
1
0
ВЫДКРИТТЯ ВНБУФ(S7)
14
1
0
1
1
0
0
1
0
0
0
0
1
0
1
1
1
0
ЗАПИС У ПАМЯТЬ(S8)
15
1
0
1
1
0
1
0
0
0
0
0
0
1
0
0
1
0
обнулення регістра(S9-S10)
16
1
0
1
1
0
1
0
0
0
0
0
0
1
1
0
1
0
17
1
1
1
1
0
0
0
1
0
0
0
0
0
0
0
1
0
вичитування Хі+1(S11)
30
1
1
1
1
0
1
0
0
0
0
0
0
0
1
0
1
0
збереження в регістр(S12)
31
1
1
0
1
0
1
0
0
0
0
0
1
0
0
0
1
0
зсув вправо 3 рази(S13-S14)
36
1
1
0
1
0
1
0
0
0
0
0
1
0
1
0
1
0
37
1
1
0
1
0
1
0
0
0
0
0
0
0
0
0
1
0
підготовка до вичитування Хі(S15)
38
1
1
1
1
0
0
0
0
0
0
0
0
0
0
0
1
0
вичитування Хі і додавання(S16)
39
1
1
1
1
0
0
0
0
0
0
0
0
0
1
0
1
0
збереження в рег (S17)
40
1
1
1
1
0
1
0
0
0
0
0
0
0
0
0
1
0
підготовка до вичитування з регістра(S18)
41
1
1
1
1
0
1
0
0
0
0
1
1
0
1
0
1
0
Вичитування(S19)
42
1
1
1
1
0
1
0
0
0
0
1
1
0
1
1
1
0
відкриття буфера(S20)
43
1
1
1
1
0
0
1
0
0
0
1
1
0
1
1
1
0
ЗАПИС У ПАМЯТЬ(S21)
44
1
1
1
1
0
1
0
0
0
0
0
0
1
0
0
1
0
обнулення регістра(S9-S10)
45
1
1
1
1
0
1
0
0
0
0
0
0
1
1
0
1
0
559
1
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
1
Вивід(S25)
560
2
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
1
561
3
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
1
562
4
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
1
563
5
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
1
564
6
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
1
565
7
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
1
566
8
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
1
567
9
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
1
568
A
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
1
569
B
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
1
570
C
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
1
572
D
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
1
60
1
0
0
0
1
1
0
0
0
0
0
0
0
0
0
1
0
кінець
6.2 Граф автомата
7.VHDL реалізація проекту
/
/
7.1. Результати моделювання:/
/
Рис. 8,9. Результат роботи спец обчислювача
7.2. VHDL опис використаних пристроїв:
Лічильник:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_unsigned.all;
entity ct is
port(
ct_ld : in STD_LOGIC;
INC : in STD_LOGIC;
DEC : in STD_LOGIC;
R : in STD_LOGIC;
N : in STD_LOGIC_VECTOR(3 downto 0);
ct_full : out STD_LOGIC;
A : out STD_LOGIC_VECTOR(3 downto 0)
);
end ct;
architecture ct of ct is
signal MEM:std_logic_vector(3 downto 0):="0000";
begin
process(ct_ld,INC,DEC,R,MEM,N)
begin
if R='1' then
MEM<=(others=>'0');
ct_full<='0';
A<=(others=>'0');
else
if ct_ld='0' then
A<=N;
MEM<=N; ct_full<='0';
elsif rising_edge(INC) and DEC='1' then
MEM<=MEM+1;
A<=MEM+1;
elsif rising_edge(DEC) and INC='1'then
MEM<=MEM-1;
A<=MEM-1;
end if;
if INC='1' and MEM="1111" then
ct_full<='1';
else ct_full<='0';
end if;
if DEC='1'and MEM="0000" then
ct_full<='1';
else ct_full<='0';
end if;
end if;
end process;
end ct;
ОЗП:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.std_logic_unsigned.all;
entity pamyat is
port(
A : in STD_LOGIC_VECTOR(3 downto 0);
ram_oe : in STD_LOGIC;
ram_we : in STD_LOGIC;
Q : inout STD_LOGIC_VECTOR(7 downto 0)
);
end pamyat;
architecture pamyat of pamyat is
begin
process(A,ram_oe,ram_we)
type ar is array(15 downto 0) of STD_LOGIC_VECTOR(7 downto 0);
variable B : ar := (
"00000000",
"00000000",
"00000000",
"00000000",
"00000000",
"00000000",
"00000000",
"00000000",
"00000000",
"00000000",
"00000000",
"00000000",
"00000000",
"00000000",
"00000000",
"00000000");
begin
if (A/="ZZZZ" or A/="UUUU") then
if ram_oe ='0' then
if ram_we ='1' then
B(conv_integer(A)):=Q;
else
Q<=B(conv_integer(A));
end if;
else Q<="ZZZZZZZZ";
end if;
else
Q<="ZZZZZZZZ";
end if;
end process;
end pamyat;
Суматор:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.std_logic_unsigned.all;
entity sumator is
port(
A : in STD_LOGIC_VECTOR(11 downto 0);
B : in STD_LOGIC_VECTOR(7 downto 0);
Invert : in STD_LOGIC;
Q : in STD_LOGIC;
S : out STD_LOGIC_VECTOR(11 downto 0);
P12 : out STD_LOGIC
);
end sumator;
architecture sumator of sumator is
begin
process(A,B,Invert)
variable c:std_logic;
variable n:std_logic;
variable sum:STD_LOGIC_VECTOR(12 downto 0);
begin
if((B/="ZZZZZZZZ" OR B/="UUUUUUUU") AND (A/="ZZZZZZZZZZZZ" OR A/="UUUUUUUUUUUU") )then
if(Invert='U' or Invert='Z' or Invert ='0')then
n:='0';
else
n:='1';
end if;
if(Q='0' or Q='Z')then
c:='0';
else
c:='1';
end if;
sum:= ('0'& A) + ('0'&( c & c & c & c xor Invert & Invert & Invert & Invert) & B(7 downto 0)) + ('0' & n);
S<=sum(11 downto 0);
P12<=sum(12);
else
S<="ZZZZZZZZZZZZ";
P12<='Z';
end if;
end process;
end sumator;
Універсальний регістр:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity parvreg is
port(
S : in STD_LOGIC_VECTOR(11 downto 0);
DR : in STD_LOGIC;
DL : in STD_LOGIC;
rg_sr : in STD_LOGIC;
rg_sl : in STD_LOGIC;
rg_rst : in STD_LOGIC;
clk2 : in STD_LOGIC;
A : out STD_LOGIC_VECTOR(11 downto 0)
);
end parvreg;
architecture parvreg of parvreg is
begin
process(clk2)
variable reg:STD_LOGIC_VECTOR(11 downto 0):="000000000000";
begin
if(clk2='1')then
if( rg_sr='0' and rg_sl='0' and rg_rst='0' ) then
reg:=S;
elsif( rg_sr='0' and rg_sl='1'and rg_rst='0' ) then
A(11 downto 1)<=S(10 downto 0);
A(0)<='0';
reg(11 downto 1):=S(10 downto 0);
reg(0):='0';
elsif( rg_sr='1' and rg_sl='0'and rg_rst='0' ) then
A(10 downto 0)<=S(11 downto 1);
A(11)<=S(11);
reg(10 downto 0):=S(11 downto 1);
reg(11):=S(11);
elsif(rg_sr='1' and rg_sl='1'and rg_rst='0' ) then
A<=reg;
elsif(rg_rst='1')then
reg:="000000000000";
A<="000000000000";
end if;
elsif(clk2='0')then
if(reg/="UUUUUUUUUUUU" AND REG/="000000000000")THEN
A<=reg;
else
A<="000000000000";
end if;
end if;
end process;
end parvreg;
Буфер даних:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.std_logic_unsigned.all;
entity buf0 is
port(
r_or_l : in STD_LOGIC;
io_en : in STD_LOGIC;
Q : inout STD_LOGIC_VECTOR(7 downto 0);
data : inout STD_LOGIC_VECTOR(7 downto 0)
);
end buf0;
architecture buf0 of buf0 is
begin
Q<=data when (io_en='0' and r_or_l='0') else (others=> 'Z');
data<=Q when (io_en='0' and r_or_l='1') else (others=> 'Z');
end buf0;
Автомат:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
use ieee.std_logic_arith.ALL;
entity kavtpzp is
port(
oec : in STD_LOGIC;
wr_rdy : in STD_LOGIC;
rd_ack : in STD_LOGIC;
aaddr : in STD_LOGIC_VECTOR(7 downto 0);
avt : out STD_LOGIC_VECTOR(31 downto 0)
);
end kavtpzp;
architecture kavtpzp of kavtpzp is
begin
process (aaddr,wr_rdy,rd_ack)
variable temp:integer;
begin
temp:= conv_integer(wr_rdy & rd_ack & oec & aaddr(7 downto 0)); -- 0/1 + õõõõ õõõõ (àäðåñíèé ïðîñò³ð) A8-A0
case temp is
when 0 => avt <= x"00011802";
when 1024 => avt <= x"2011C800"; --vkaz na zukl zapucy
when 1025 => avt <= x"20216800"; --zukl zapucy
when 1026 => avt <= x"2011E400"; --zukl zapucy
when 3 => avt <= x"00416802"; --inc 0
when 4 => avt <= x"02E1E002"; --inc 1
when 46 => avt <= x"0051E00A"; --zberegty v reg
when 5 => avt <= x"00616822"; -- ---------------------
when 6 => avt <= x"0071682A"; --
when 7 => avt <= x"00816822"; --
when 8 => avt <= x"0091682A"; --
when 9 => avt <= x"00A16822"; -- ZSYB NA 4
when 10 => avt <= x"00B1682A"; --
when 11 => avt <= x"00C16822"; --
when 12 => avt <= x"00D1682A"; -- --------------------
when 13 => avt <= x"00E1682E"; -- ZBEREZHENNIA
when 14 => avt <= x"00F1642E"; -- ---------------------
when 15 => avt <= x"01016812"; -- ------------------------
-- obnyllennia registra
when 16 => avt <= x"0111681A"; -- ------------------------
----------------------------
when 17 => avt <= x"0121E202"; -- -XI+1
when 18 => avt <= x"0131E80A"; -- ZAPYS V REG
when 19 => avt <= x"0141E202"; -- -XI+1
when 20 => avt <= x"0151E80A"; -- ZAPYS V REG
when 21 => avt <= x"0161E202"; -- -XI+1
when 22 => avt <= x"0171E80A"; -- ZAPYS V REG
when 23 => avt <= x"0181E202"; -- -XI+1
when 24 => avt <= x"0191E80A"; -- ZAPYS V REG
when 25 => avt <= x"01A1E202"; -- -XI+1
when 26 => avt <= x"01B1E80A"; -- ZAPYS V REG
when 27 => avt <= x"01C1E202"; -- -XI+1
when 28 => avt <= x"01D1E80A"; -- ZAPYS V REG
when 29 => avt <= x"01E1E202"; -- -XI+1
when 30 => avt <= x"01F1E80A"; -----------------------
when 31 => avt <= x"0201A822"; --zsyv vpravo
when 32 => avt <= x"0211A82A"; --
when 33 => avt <= x"0221A822";
when 34 => avt <= x"0231A82A";
when 35 => avt <= x"0241A822";
when 36 => avt <= x"0251A82A"; -----------------
when 37 => avt <= x"0261A802"; ---------
when 38 => avt <= x"0271E002"; -- read Xi and sum
when 39 => avt