Проектирование процессорного модуля

4.1 Схема объединения операционного и управляющего автоматов

проектирование процессорного модуля - student2.ru

Рис. 4.1 Схема объединения операционного и управляющего автоматов

4.2 Результаты тестирования

проектирование процессорного модуля - student2.ru

Рис. 4.2.1 Результат ускоренного умножения двух беззнаковых чисел

проектирование процессорного модуля - student2.ru

Рис. 4.2.2 Результат деления целых двоичных беззнаковых чисел без восстановления остатка

ВЫВОД

Данный курсовой проект разработан для изучения современных средств проектирования цифровых вычислительных машин. В этом проекте был разработан двухуровневый процессорный модуль, который был спроектирован на основе управляющего автомата типа П с естественной адресацией и операционного автомата класса I. С помощью данного устройства можно выполнять такие микрооперации, как сложение, умножение и деление двоичных знаковых и беззнаковых чисел. П-автомат является автоматом с программируемой логикой. Для таких автоматов затраты оборудование больше (при несложных микрокомандах), чем в автоматах с жесткой логикой. Чем сложнее микропрограмма, тем меньше аппаратные затраты.

Управляющие автоматы и автоматы с жесткой логикой отличаются степенью гибкости. Для автоматов с жесткой логикой, при возникновении ошибки в микропрограмме, необходимо перестраивать структуру автомата. Программируемая логика позволяет решить задачу перестройки структуры относительно просто – путем прошивки в ПЗУ дополнительных микрокоманд, изменяемых при внесении изменений в микропрограмму. Таким образом, можно считать, что гибкостью обладают только автоматы с программируемой логикой.

СПИСОК ИСПОЛЬЗУЕМЫХ ИСТОЧНИКОВ

1. Майоров С.А., Новиков Г.И., Структура электронных вычислительных машин. - Л.: Машиностроение. Ленингр. Отделение, 1979. -
384 с., ил.

2. Баранов С.И., Скляров В. А., Цифровые устройства на программируемых БИС с матричной структурой. - М.: Радио и связь, 1986. - 272 с, ил.

3. Угрюмов Е.П., Проектирование элементов и узлов ЭВМ: Учеб.
Пособие для спец. ЭВМ вузов. - М.: Высш. шк., 1987. - 318 с, ил.

4. ДСТУ 3008-95. «Звіти у сфері науки і техніки. Структура та
правила оформлення».

ПРИЛОЖЕНИЕ А

Листинг программы

---------------

-- unit.vhd

---------------

library IEEE;

use IEEE.STD_LOGIC_1164.all;

use IEEE.STD_LOGIC_unsigned.all;

entity OU is

generic (n:natural:=8);

port( -- n = 8

clk,rst:in std_logic;

d1:in std_logic_vector(2*n-1 downto 0);

d2:in std_logic_vector(n-1 downto 0);

f:in std_logic;

y:in std_logic_vector(22 downto 1);

x:out std_logic_vector(9 downto 1);

DBUS:out std_logic_vector(2*n-1 downto 0)

);

end OU;

--}} End of automatically maintained section

architecture OU of OU is

--use ieee.std_logic_unsigned.all;

signal A:std_logic_vector(2*n downto 0);

signal B:std_logic_vector(n downto 0);

signal C:std_logic_vector(n+1 downto 0); --Po GSA 7

signal CnT:std_logic_vector(3 downto 0);

--signal CnTu:std_logic_vector(2 downto 0);

signal TgA,IRQ1,IRQ2:std_logic;

--signal stop:std_logic:= '0';

begin

process (clk,rst) is

begin

if rst='0' then A <=(others=>'0');

B <=(others=>'0');

C <=(others=>'0');

Cnt <= "1000";

-- CnT <= "111";

elsif rising_edge(clk) then

if y(1)='1' then A <= ("00000000" & d1(2*n-1 downto 0));

elsif y(15)='1' then A <= ("00000000" & d1(n-1 downto 0));

elsif y(3)='1' then A(2*n downto n) <= IEEE.std_logic_signed."+"(A(2*n downto n), (not B));

A(2*n-1 downto n-1) <= IEEE.std_logic_signed."+"(A(2*n downto n),1);--****

elsif y(8)='1' then A(2*n downto n) <= IEEE.std_logic_signed."+"(A(2*n downto n), B);

elsif y(5)='1' then A <= '0'&A(2*n-1 downto 0) & '0';

elsif y(17)='1' then A <= '0'&A(n-1 downto 0) & '0';

end if;

if y(2)='1' then B <= ("00000000" & d2(n-1 downto 0));

elsif y(16)='1' then B <= d2(n-1 downto 0);

elsif y(20)='1' then B <= '0' & C(1 downto 0) & B(n-1 downto 2);

end if;

if y(6)='1' then C <=(others=>'0');

elsif y(9)='1' then C <= '0'&C(n-2 downto 0)&(not A(2*n));

elsif y(19)='1' then C(n+1 downto 0) <= IEEE.std_logic_signed."+"(C(n+1 downto 0), (not A));

C(n downto -1) <= IEEE.std_logic_signed."+"(C(n+1 downto 0),1);--****

elsif y(18)='1' then C(n+1 downto 0) <= IEEE.std_logic_signed."+"(C(n+1 downto 0), A);

elsif y(21)='1' then c <= '0' & C(n+1)& C(n+1)& C(n+1 downto 2);

end if;

if y(7)='1' then CnT<="1000";

elsif y(10)='1' then CnT <= CnT - 1;

end if;

if y(4)='1' then TgA <= A(2*n);

end if;

if y(13)='1' then IRQ1 <= '1'; assert (0>1) report "IRQ1 was thrown" severity failure ;

elsif y(14)='1' then IRQ2 <= '1'; assert (0>1) report "IRQ2 was thrown" severity failure ;

end if;

end if;

end process;

----------------------

-- IRQ1 <= '1' when y(13)='1';--assert (0>1) severity failure;

-- IRQ2 <= '1' when y(14)='1';--assert (0>1) severity failure;

DBUS <= C(n-1 downto 0) & B(n-1 downto 0) when y(22)='1'else

--DBUS <=

C(n-1 downto 0) when y(11)='1' else

A(2*n-1 downto n) when y(12)='1' else (others=>'Z');

x(1) <= f;

x(2) <= '1' when B = "000000000" else '0';

x(3) <= A(2*n);

x(4) <= TgA;

x(5) <= '1' when CnT = "000" else '0';

x(6) <= (not B(1)) and (C(n+1) xor B(0));

x(7) <= ((not C(n+1)) and B(1) and (not B(0))) or (C(n+1) and (not B(1))and B(0));

x(8) <= B(1) and (C(n+1) xor B(0));

x(9) <= C(n+1);

end OU;

library IEEE;

use IEEE.STD_LOGIC_1164.all;

use IEEE.std_logic_unsigned.all;

entity CU is

port(

clk,rst:in std_logic;

x:in std_logic_vector(9 downto 1);

y:out std_logic_vector(22 downto 1)

);

end CU;

architecture CU of CU is

subtype TCommand is std_logic_vector(10 downto 0);

type TROM is array (0 to 37) of TCommand;

constant ROM:TROM := (

"10001010110",--0

"00001001000",--1

"10010001110",--2

"00010000000",--3

"10011010000",--4

"00011010011",--5

"10100010010",--6

"00010000000",--7

"00011011100",--8

"10101010100",--9

"10100001100",--10

"00100000000",--11

"00101100000",--12

"10000000000",--13

"00110000000",--14

"10000000000",--15

"00111000000",--16

"10000001111",--17

"00100000000",--18

"10000001000",--19

"00000010000",--20

"10000000110",--21

"01000101011",--22

"10110011111",--23

"01010000000",--24

"01100110100",--25

"10101100101",--26

"11001011101",--27

"01010000000",--28

"00000111000",--29

"10000000000",--30

"10111100010",--31

"01001000000",--32

"10000011000",--33

"11000100100",--34

"01011000000",--35

"10000011001",--36

"10000010111");--37

signal RegCom:TCommand;

signal PC:integer;

begin

process(rst,clk) is

variable PCv:integer range 0 to 37;

begin

if rst='0' then PCv:=0;

elsif rising_edge(clk) then

if RegCom(10)='1' and ((x and RegCom(9 downto 6))="0000") then

PCv:=conv_integer(RegCom(5 downto 0));

else

PCv:=PCv+1;

end if;

end if;

RegCom<=ROM(PCv);

PC<=PCv;

end process;

y <= RegCom(9 downto 0) when RegCom(10)='0' else (others=>'0');

end CU;

----------------

--cpu.vhd

----------------

library IEEE;

use IEEE.STD_LOGIC_1164.all;

use work.all;

entity CPU is

port(

clk,rst:in std_logic;

d1:in std_logic_vector(15 downto 0);

d2:in std_logic_vector(7 downto 0);

F:in std_logic;

DBUS:out std_logic_vector(15 downto 0)

);

end CPU;

--}} End of automatically maintained section

architecture cpu of cpu is

component OU

port(

clk,rst:in std_logic;

d1:in std_logic_vector(15 downto 0);

d2:in std_logic_vector(7 downto 0);

f:in std_logic;

y:in std_logic_vector(22 downto 1);

x:out std_logic_vector(9 downto 1);

DBUS:out std_logic_vector(15 downto 0)

);

end component ;

component CU

port (

clk,rst:in std_logic;

x:in std_logic_vector(9 downto 1);

y:out std_logic_vector(22 downto 1)

);

end component ;

signal y: std_logic_vector (22 downto 1);

signal x: std_logic_vector (9 downto 1);

signal nclk: std_logic;

begin

nclk <= not clk;-- after 10 ns;

dd1:OU port map (nclk,rst,d1,d2,f,y,x,DBUS);

dd2:CU port map (clk,rst,x,y);

end cpu;

Наши рекомендации