Проектирование процессорного модуля
4.1 Схема объединения операционного и управляющего автоматов
Рис. 4.1 Схема объединения операционного и управляющего автоматов
4.2 Результаты тестирования
Рис. 4.2.1 Результат ускоренного умножения двух беззнаковых чисел
Рис. 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;