Частина тексту файла (без зображень, графіків і формул):
Міністерство освіти і науки,молоді та спорту України
Національний університет „Львівська політехніка”
Кафедра ЕОМ
/
Звіт
по Курсовій роботі
з дисципліни: “Комп’ютерна схемотехніка:
“ Спеціалізований обчислювач”
З А В Д А Н Н Я
Розробити спеціалізований обчислювач, що має відповідати наступним вимогам :
структурна схема обчислювача : мікропрограмний автомат Мілі;
робоча формула : Yi = ( Xi * N) mod 216, де 9 ≤ i ≤ 15 ( значення N та i задаються керівником курсового проекта );
формат даних : 16 бітний беззнаковий двійковий код з фіксованою комою( тобто коди від (0).0000 0000 0000 0000 до (0).1111 1111 1111 1111 );
інформаційний обмін здійснюється через паралельну 16-ти розрядну двонаправлену шину даних за допомогою додаткових сигналів синхронізації ( рівні сигналів сумісні з ТТЛ );
керуючий автомат реалізувати на основі ПЗП та регістра;
напруга живлення та тактові імпульси надходять від зовнішнього джерела, а сигнал початкового скидання формується локально.
Задана константа : 9B2B16=1001 1011 0010 10112
Розробка та моделювання спеціалізованого обчислювача
/
Результати моделювання:
VHDL – коди елементів:
Buf.vhd
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;
RAM.vhd
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;
Reg.vhd
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;
--}} End of automatically maintained section
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;
Sum.vhd
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;
--}} End of automatically maintained section
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;
Counter.vhd
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;
VHDL-код прошивки автомата
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 st:integer;--ñòàíè àâòîìàòà
signal bb :std_logic_vector(23 downto 0);
begin
process(CLK,Res)
begin
if Res = '1'
then bb <= X"00473D"; --;Mmk<="1001 1011 0010 1011";
elsif (CLK ='1' and CLK'event) then
st<= CONV_INTEGER(S);
case st is
when 0 => bb <= X"01C733";
when 1 => bb <= X"02E613";
when 2 => bb <= X"03E213";
when 3 => bb <= X"04E613";
when 4=> bb <= X"05E715";
when 5=> bb <= X"06E717";
when 6=> bb <= X"07E617";
when 7=> bb <= X"08E417";
when 8=> bb <= X"09F617";
when 9=> bb <= X"0AE717";
when 10=> bb <= X"0BE715";
when 11=> bb <= X"0C3716";
when 12=> bb <= X"0D3616";
when 13=> bb <= X"0E3416";
when 14=> bb <= X"0F3616";
when 15=> bb <= X"103715";
when 16=> bb <= X"113715";
when 17=> bb <= X"12E717";
when 18=> bb <= X"13E617";
when 19=> bb <= X"14E417";
when 20=> bb <= X"15F617";
when 21=> bb <= X"16E715";
when 22=> bb <= X"17A719";
when 23=> bb <= X"183715";
when 24=> bb <= X"193716";
when 25=> bb <= X"1A3616";
when 26=> bb <= X"1B3416";
when 27=> bb <= X"1C3616";
when 28=> bb <= X"1D3715";
when 29=> bb <= X"1E3715";
when 30=> bb <= X"1FE717";
when 31=> bb <= X"20E617";
when 32=> bb <= X"21E417";
when 33=> bb <= X"22F617";
when 34=> bb <= X"23E715";
when 35=> bb <= X"24A719";
when 36=> bb <= X"253715";
when 37=> bb <= X"263716";
when 38=> bb <= X"273616";
when 39=> bb <= X"283416";
when 40=> bb <= X"293616";
when 41=> bb <= X"2A3715";
when 42=> bb <= X"2B3715";
when 43=> bb <= X"2CE717";
when 44=> bb <= X"2DE617";
when 45=> bb <= X"2EE417";
when 46=> bb <= X"2FF617";
when 47=> bb <= X"30E715";
when 48=> bb <= X"31A719";
when 49=> bb <= X"323715";
when 50=> bb <= X"33A719";
when 51=> bb <= X"343715";
when 52=> bb <= X"353716";
when 53=> bb <= X"363616";
when 54=> bb <= X"373416";
when 55=> bb <= X"383616";
when 56=> bb <= X"393715";
when 57=> bb <= X"3A3715";
when 58=> bb <= X"3BE717";
when 59=> bb <= X"3CE617";
when 60=> bb <= X"3DE417";
when 61=> bb <= X"3EF617";
when 62=> bb <= X"3FE715";
when 63=> bb <= X"403716";
when 64=> bb <= X"413616";
when 65=> bb <= X"423416";
when 66=> bb <= X"433616";
when 67=> bb <= X"443715";
when 68=> bb <= X"453715";
when 69=> bb <= X"46E717";
when 70=> bb <= X"47E617";
when 71=> bb <= X"48E417";
when 72=> bb <= X"49F617";
when 73=> bb <= X"4AE715";
when 74=> bb <= X"4BA719";
when 75=> bb <= X"4C3715";
when 76=> bb <= X"4D3716";
when 77=> bb <= X"4E3616";
when 78=> bb <= X"4F3416";
when 79=> bb <= X"503616";
when 80=> bb <= X"513715";
when 81=> bb <= X"523715";
when 82=> bb <= X"53E717";
when 83=> bb <= X"54E617";
when 84=> bb <= X"55E417";
when 85=> bb <= X"56F617";
when 86=> bb <= X"57E715";
when 87=> bb <= X"583716";
when 88=> bb <= X"593616";
when 89=> bb <= X"5A3416";
when 90=> bb <= X"5B3616";
when 91=> bb <= X"5C3715";
when 92=> bb <= X"5D3715";
when 93=> bb <= X"5EE717";
when 94=> bb <= X"5FE617";
when 95=> bb <= X"60E417";
when 96=> bb <= X"61F617";
when 97=> bb <= X"62E715";
when 98=> bb <= X"63A719";
when 99=> bb <= X"643715";
when 100=> bb <= X"65A719";
when 101=> bb <= X"663715";
when 102=> bb <= X"673716";
when 103=> bb <= X"683616";
when 104=> bb <= X"693416";
when 105=> bb <= X"6A3616";
when 106=> bb <= X"6B3715";
when 107=> bb <= X"6C3715";
when 108=> bb <= X"6DE717";
when 109=> bb <= X"6EE617";
when 110=> bb <= X"6FE417";
when 111=> bb <= X"70F617";
when 112=> bb <= X"71E715";
when 113=> bb <= X"72E717";
when others => bb <= X"000000";
END CASE;
end if;
O<=bb;
END PROCESS;
end Avt;