Частина тексту файла (без зображень, графіків і формул):
Міністерствоосвіти і науки,молоді та спортуУкраїни
Національнийуніверситет „Львівськаполітехніка”
Кафедра ЕОМ
/
Звіт
по Курсовій роботі
з дисципліни: “Комп’ютерна схемотехніка:
“Спеціалізований обчислювач”
З А В Д А Н Н Я
Розробити спеціалізований обчислювач, що має відповідати наступним вимогам :
структурна схема обчислювача : мікропрограмний автомат Мілі;
робоча формула : Yi = ( Xi * N) mod 216, де 9 ≤ i ≤ 15( значення N та i задаються керівником курсового проекта );
формат даних : 16 бітний беззнаковий двійковий код з фіксованою комою( тобто коди від (0).0000 0000 0000 0000 до (0).1111 1111 1111 1111 );
інформаційний обмін здійснюється через паралельну 16-ти розрядну двонаправлену шину даних за допомогою додаткових сигналів синхронізації ( рівні сигналів сумісні з ТТЛ );
керуючий автомат реалізувати на основі ПЗП та регістра;
напруга живлення та тактові імпульси надходять від зовнішнього джерела, а сигнал початкового скидання формується локально.
Задана константа : A6CD16=1010 0110 1100 11012
Розробка та моделювання спеціалізованого обчислювача
/
Результати моделювання:
Принципова схема:
VHDL – код складових обчислювача:
RAM.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entityramis
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)
);
endram;
architectureramoframis
type MEM isarray(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;
endram;
Buf.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entityBuf 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)
);
endBuf;
--}} End of automatically maintained section
architectureBuf 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');
endBuf;
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') ;
elsifrising_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;
useIEEE.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
architectureSum_arc of Sum is
signaltmp: 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);
endSum_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';
ifpr'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;
ifzr'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;
entityAvtis
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)
);
endAvt;
architectureAvtofAvtis
signalst:integer;--ñòàíè àâòîìàòà
signalbb :std_logic_vector(23 downto 0);
begin
process(CLK,Res)
begin
ifRes = '1'
thenbb<= X"00473D";
elsif (CLK ='1' andCLK'event) then
st<= CONV_INTEGER(S);
casestis
when 0 =>bb<= X"01C733";
when 1 =>bb<= X"02E613";
when 2 =>bb<= X"03E213";
when 3 =>bb<= X"04E613";
when 4=>bb<= X"05E71D";
when 5=>bb<= X"06E71F";
when 6=>bb<= X"07E61F";
when 7=>bb<= X"08E41F";
when 8=>bb<= X"09F61F";
when 9=>bb<= X"0AE71F";
when 10=>bb<= X"0BE71D";
when 11=>bb<= X"0cA719";
when 12=>bb<= X"0d371D";
when 13=>bb<= X"0e371F";
when 14=>bb<= X"0f361F";
when 15=>bb<= X"10E41F";
when 16=>bb<= X"11F61F";
when 17=>bb<= X"12E71D";
when 18=>bb<= X"13371F";
when 19=>bb<= X"14361F";
when 20=>bb<= X"15E41F";
when 21=>bb<= X"16F61F";
when 22=>bb<= X"17E71D";
when 23=>bb<= X"18A719";
when 24=>bb<= X"19371D";
when 25=>bb<= X"1aA719";
when 26=>bb<= X"1b371D";
when 27=>bb<= X"1c371F";
when 28=>bb<= X"1d361F";
when 29=>bb<= X"1eE41F";
when 30=>bb<= X"1fF61F";
when 31=>bb<= X"20E71D";
when 32=>bb<= X"21371F";
when 33=>bb<= X"22361F";
when 34=>bb<= X"23E41F";
when 35=>bb<= X"24F61F";
when 36=>bb<= X"25E71D";
when 37=>bb<= X"26A719";
when 38=>bb<= X"27371D";
when 39=>bb<= X"28371F";
when 40=>bb<= X"29361F";
when 41=>bb<= X"2aE41F";
when 42=>bb<= X"2bF61F";
when 43=>bb<= X"2cE71D";
when 44=>bb<= X"2d371F";
when 45=>bb<= X"2e361F";
when 46=>bb<= X"2fE41F";
when 47=>bb<= X"30F61F";
when 48=>bb<= X"31E71D";
when 49=>bb<= X"32A719";
when 50=>bb<= X"33371D";
when 51=>bb<= X"34A719";
when 52=>bb<= X"35371D";
when 53=>bb<= X"36371F";
when 54=>bb<= X"37361F";
when 55=>bb<= X"38E41F";
when 56=>bb<= X"39F61F";
when 57=>bb<= X"3aE71D";
when 58=>bb<= X"3bA719";
when 59=>bb<= X"3c371D";
when 60=>bb<= X"3d371F";
when 61=>bb<= X"3e361F";
when 62=>bb<= X"3fE41F";
when 63=>bb<= X"40F615";
when 64=>bb<= X"41E715";
whenothers =>bb<= X"000000";
END CASE;
endif;
O<=bb;
END PROCESS;
endAvt;