Реферат: Разработка структуры процессора на основе МПА с жесткой логикой

СОДЕРЖАНИЕ

ВВЕДЕНИЕ

1.      Анализ задания иразработка структурной (функциональной) схемы процессора.

2.      Общее описаниепринципа работы процессора.

3.      Временныедиаграммы, описывающие выполнение микроопераций для каждой команды.

4.      Содержательныйалгоритм микропрограммы.

5.      Синтезуправляющего автомата на основе жесткой логики.

6.      Создание описанияотдельных узлов процессора и всего процессора средствами Active HDL.

7.      Тестированиепроцессора и подтверждение правильности его работы с помощью временныхдиаграмм.

ВЫВОДЫ


ВВЕДЕНИЕ

В данной работеразрабатывается модель процессора выполняющего набор машинных команд.

ЭВМс хранимой программой (stored program electronic computer) может быть определенакак машина, обрабатывающая данные в соответствии с заранее определеннымиправилами (инструкциями); при этом программа (набор инструкций) и данныенаходятся в памяти машины. Для загрузки программы и данных в память, а такжедля вывода результатов обработки из памяти необходим какой-либо способ связи свнешними объектами. Этой цели служат устройства ввода-вывода.

Устройствоуправления ЭВМ управляет работой всей машины в целом. Оно принимает управляющуюинформацию от памяти, о том, какие действия надо осуществить и где в памятирасположены данные, над которыми должны производиться эти действия. После тогокак устройство управления определит, какую именно команду необходимо исполнить,оно выдает управляющие сигналы, позволяющие открыть и закрыть соответствующиевентили по всей системе, в результате чего данные, представленные в видеэлектрических сигналов, смогут поступать от одного функционального устройства кдругому в процессе исполнения операции, заданной выбранной командой. Как толькоALU заканчивает выполнять свою часть в данной операции, устройство управления можетвыдать необходимую управляющую информацию, разрешающую передачу результатовобратно в память или направляющую эти результаты к какому-нибудь устройствувывода; это делается для того, чтобы зафиксировать результаты на другомносителе, например на диске. В конце исполнения команды устройство управления заставляетмашину выбрать и декодировать следующую команду.

Такимобразом, каждой машиной управляют последовательности команд программы,написанной для решения конкретной задачи. Каждая из этих команд представляетсобой простое обращение к устройству управления, сделанное для того, чтобыпривести в действие встроенные в машину функциональные узлы (сумматор, регистры,счетчики), а также открыть и закрыть определенные вентили в цепях передачиданных; коммутация этих вентилей позволяет вводить в элементарныеарифметические и логические функциональные узлы требуемые операнды, причем вводих осуществляется в определенном порядке и в рамках определеннойпоследовательности машинных циклов.

Устройство управленияданного процессора необходимо построить на жёсткой логике. Конкретизировав задачу,определим, что необходимо выбрать схему процессора, и схему управляющегоустройства. В данной работе будет использована схема процессора с одноймагистралью.

Команды закодированымаксимально просто, и не требуют больших ресурсов для своего выполнения. В тожевремя данная схема имеет сравнительно небольшое количество элементов.


1 АНАЛИЗ ЗАДАНИЯ ИРАЗРАБОТКА СТРУКТУРНОЙ (ФУНКЦИОНАЛЬНОЙ) СХЕМЫ ПРОЦЕССОРА

Разработатьструктурную схему процессора (операционного и управляющего автоматов) длявыполнения набора машинных команд. Создать описание процессора на языке VHDL,провести тестирование.

Управляющийавтомат должен представлять собой устройство с хранимыми в памятимикропрограммами управления ходом выполнения машинных команд.

Использоватьодномагистральную структуру.

Реализоватьследующие команды для исполнения в системе:

1.JMP #             ; Переход в указанную часть программы

2.MOV A, #d    ; Загрузка в аккумулятор константы

3.MOV Rn, #d   ; Загрузка в регистр константы

4. RLА               ; Сдвиг аккумулятора влево циклический

Примечание:

— обозначения команд процессора соответствуют мнемокодам языка ассемблера МК51.

— команды, могут размещаться в памяти в любой последовательности;

— константа #d размещается в следующем по порядку байте после команды;

— n –номер регистра 0, 1, 2, 3;

— bit– 7, 6, 5, 4, 3, 2, 1, 0.

Структурнаясхема процессора показана на рис.1. В ней имеется двухвходовое АЛУ (хотя в этомнет необходимости в данном случае, однако это сделано для обеспеченияуниверсальности данного устройства). Имеется банк из 4-х регистров общегоназначения (РОН) R0-R3, которые работают только на запись в них, поскольку принастраивании их работы на чтение из них значительно усложнится общая структураавтомата, возможно даже будет не возможно создать на одномагистральной шине.

Вналичии блок интерпретации кода операции, построенный на счетчике шагов, атакже на декодере инструкции и шифраторе, выдающий управляющие сигналы (AccIn,ALURL, RegIn, PCIn, PCInc, MBROut, IRIn,MemRd, Reset).

Всерегистры являются 8-разрядными, таким образом, шина также будет 8-разрядной.


/>

Рис.1. Структурная схема процессора


2ОБЩЕЕ ОПИСАНИЕ ПРИНЦИПА РАБОТЫ ПРОЦЕССОРА

Данный процессор содномагистральной структурой выполняет указанный в задании набор команд.

К недостаткам такой схемыможно отнести низкую по сравнению с многошинными процессорамипроизводительность, так как и для адресации и для передачи данных используетсяединственная шина. Но в данном случае адресация производится по содержимомупрограммного счетчика, и по шине будет производиться только передача данных.Поэтому производительность такой системы будет не ниже, чем у многошинной.

На рис. 1 показанаструктурная схема процессора с одной магистралью.

Следует привестинекоторые пояснения к этой схеме. Блок «Memory» содержит последовательность команд, которыепринадлежат набору команд, приведенному в предыдущем разделе. Выполнение какихлибо других команд не данном процессоре будет невозможно. Выборка команд изпамяти производится следующим образом: адрес команды, содержащийся впрограммном счетчике, записывается в регистр адреса, а затем выдается наадресные входы блока памяти, что сопровождается выдачей управляющим устройствомсигнала чтения из памяти. Данные из памяти считываются буферный регистр. Послетого, как выбранная из памяти команда попадает в буферный регистр, она выдаетсяна внутрипроцессорную шину, откуда она записывается в регистр команд (IR). На этом выборка командызаканчивается. Эту последовательность действий принято называть фазойизвлечения команды (Fetch).

Итак, после окончанияфазы извлечения команды начинается фаза интерпретации команды. В зависимости откоманды эта фаза может представлять собой, например, извлечение из памятиконстанты, необходимой для выполнения команды, сдвиг аккумулятора и т. д. Вконце этой фазы процессор готов к выполнению команды. На этом начинается фазавыполнения.

Алгоритм выполнения команды в общемслучае состоит из таких фаз:

1.        Выборка команды

2.        Интерпретациякоманды

3.        Формированиеадреса из команды

4.        Выполнениекоманды

3 ВРЕМЕННЫЕ ДИАГРАММЫ,ОПИСЫВАЮЩИЕ ВЫПОЛНЕНИЕ МИКРООПЕРАЦИЙ ДЛЯ КАЖДОЙ КОМАНДЫ

Разработаем форматкоманды, способный закодировать операции:

Код операции Номер РОН Не используются 7 6 5 4 3 2 1 /> /> /> /> /> /> /> />

Пронумеруемоперации процессора:

Код операции Команды Jmp # 1 Mov A,# 1 Mov Rn,# 1 1 Rl A

Временнаядиаграмма микроопераций выполнения команды JMP #d:


/>

Временнаядиаграмма микроопераций выполнения команды MOV A, #d:

/>


Временнаядиаграмма микроопераций выполнения команды MOV Rn, #d:

/>

Временнаядиаграмма микроопераций выполнения команды RL A:

/>


4СОДЕРЖАТЕЛЬНЫЙ АЛГОРИТМ МИКРОПРОГРАММЫ

Опишемосновные алгоритмы выполнения команд в процессоре по тактам с краткимипояснениями к каждой из них:

Переходв заданную часть кода (JMP #d)

1   MemRd, PCInc (чтениеиз памяти, инкремент программного счетчика)

2   MBROut, IRIn(загрузка из MBR, загрузка следующей команды)

3   MemRd, PCInc(чтение из памяти, инкремент программного счетчика)

4   MBROut, PCIn(загрузка из MBR)

5   Reset (сброс)

Загрузкаконстанты в аккумулятор (MOV A, #d)

1   MemRd, PCInc(чтение из памяти, инкремент программного счетчика)

2   MBROut, IRIn(загрузка из MBR, загрузка следующей команды)

3   MemRd, PCInc(чтение из памяти, инкремент программного счетчика)

4   MBROut, AccIn,Reset (загрузка из MBR, загрузка в аккумулятор, сброс)

Загрузкаконстанты в РОН (MOV Rn, #d)

1   MemRd, PCInc(чтение из памяти, инкремент программного счетчика)

2   MBROut, IRIn(загрузка из MBR, загрузка следующей команды)

3   MemRd, PCInc(чтение из памяти, инкремент программного счетчика)

4   MBROut, RegIn,Reset (загрузка из MBR, загрузка в РОН, сброс)

Сдвигаккумулятора влево циклический (RL A)

1   MemRd, PCInc(чтение из памяти, инкремент программного счетчика)

2   MBROut, IRIn(загрузка из MBR, загрузка следующей команды)

3   MemRd, PCInc (чтениеиз памяти, инкремент программного счетчика)

4   MBROut (загрузкаиз MBR)

5   ALUOP, AccIn,Reset (выполнение операции, загрузка результата в аккумулятор, сброс)

5 СИНТЕЗ УПРАВЛЯЮЩЕГОАВТОМАТА НА ОСНОВЕ ЖЕСТКОЙ ЛОГИКИ

Структурнаясхема управляющего автомата на основе жесткой логики показана на рис. 2.


/>

Рис.2. Структурная схема управляющего автомата на основе жесткой логики

Нижезаписаны выражения для выходных сигналов шифратора:

MemRd<='1' when c=«00000001» or c=«00000100» else'0' after 5ns;

PCInc<='1' when c=«00000001» or c=«00000100» else'0' after 5ns;

MBROut<='1' when c=«00000010» or c=«00001000» else'0' after 5ns;

IrIn<='1' when c=«00000010» else '0' after 5ns;

PCIn<='1' when c=«00001000» and i=«0001» else '0'after 5ns;

AccIn<='1' when (c=«00001000» and i=«0010») or(c=«00010000» and i=«1000») else '0' after 5ns;

RegIn<='1' when c=«00001000» and i=«0100» else '0'after 5ns;

ALURL<='1' when c=«00010000» and i=«1000» else '0'after 5ns;

Reset<='1' when (c=«00010000» and i=«0001») or(c=«00010000» and i=«1000»)

         or (c=«00001000» and i=«0010»)or(c=«00001000» and i=«0100») else '0' after 5ns;

 

6 СОЗДАНИЕ ОПИСАНИЯОТДЕЛЬНЫХ УЗЛОВ ПРОЦЕССОРА И ВСЕГО ПРОЦЕССОРА СРЕДСТВАМИ ACTIVEHDL

Описаниерегистров, счетчика, мультиплексора и декодера:

library ieee;

use ieee.std_logic_1164.all;

entity MAR is

         port(D: in std_logic_vector(7 downto 0);

                   Q: out std_logic_vector(7 downto 0);

                   RST: in std_logic;

                   Clk: in std_logic);

end MAR;

architecture MAR of MAR is

signal master, slave: std_logic_vector(7 downto 0);

begin

         Q<=slave;

         process(D,RST,Clk)

         begin

                   if Clk='0'    then

                            if RST='1'then master<=(others => '0')after 2ns;

                                                        else master<=Dafter 2ns;

                            end if;

                   end if;

         end process;

        

         process(master,Clk)

         begin

                   if Clk='1'then slave<=master after 2ns;

                   end if;

         end process;

end architecture MAR; 

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

library ieee;

use ieee.std_logic_1164.all;

entity REGI is

         port(D: in std_logic_vector(7 downto 0);

                   Q: out std_logic_vector(7 downto 0);

                   EI: in std_logic;

                   RST: in std_logic;

                   Clk: in std_logic);

end REGI;

architecture REGI of REGI is

signal master, slave: std_logic_vector(7 downto 0);

begin

         Q<=slave;

         process(D,RST,Clk,EI)

         begin

                   if Clk='0'then

                            if RST='1' then master<=(others => '0')after 2ns;

                                                        elsif EI='1' thenmaster<=D after 2ns;

                            end if;

                   end if;

         end process;

        

         process(master,Clk)

         begin

                   if Clk='1'then slave<=master after 2ns;

                   end if;

         end process;

end architecture REGI; 

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

library ieee;

use ieee.std_logic_1164.all;

entity MBR is

         port(D: in std_logic_vector(7 downto 0);

                   Q: out std_logic_vector(7 downto 0);

                   EO: in std_logic;

                   RST: in std_logic;

                   Clk: in std_logic);

end MBR;

architecture MBR of MBR is

signal master, slave: std_logic_vector(7 downto 0);

begin

         process(D,RST,Clk)

         begin

                   if Clk='0'then

                            if RST='1' then master<=(others => '0')after 2ns;

                                                        else master<=Dafter 2ns;

                            end if;

                   end if;

         end process;

        

         process(master,Clk)

         begin

                   if Clk='1'then slave<=master after 2ns;

                   end if;

         end process;

        

         process(slave,EO)

         begin

                   if EO='1'then Q<=slave;

                                      else Q<=(others => 'Z');

                   end if;

         end process;

end architecture MBR; 

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

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity Counter is

         port(Q: out std_logic_vector(2 downto 0);

                   RST: in std_logic;

                   Clk: in std_logic);

end Counter;

architecture Counter of Counter is

signal master, slave, slave_inc: std_logic_vector(2 downto 0);

begin

         Q<=slave;

         slave_inc<=slave+1 after 2ns;

        

         process(slave_inc,RST,Clk)

         begin

                   if Clk='0'then

                            if RST='1'then master<=(others => '0')after 2ns;

                                               else master<=slave_incafter 2ns;

                            end if;

                   end if;

         end process;

        

         process(master,Clk)

         begin

                   if Clk='1' then      slave<=master after 2ns;

                   end if;

         end process;

end Counter;       

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

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity PC is

         port(D: in std_logic_vector(7 downto 0);

                   Q: out std_logic_vector(7 downto 0);

                   EI: in std_logic;

                   Inc: in std_logic;

                   RST: in std_logic;

                   Clk: in std_logic);

end PC;

architecture PC of PC is

signal master, slave, slave_inc: std_logic_vector(7 downto 0);

begin

         Q<=slave;

         slave_inc<=slave+1 after 2ns;

         process(D,RST,Clk,EI,Inc,slave_inc)

         begin

                   if Clk='0'    then

                            if RST='1' then master<=(others => '0')after 2ns;

                                                        elsif EI='1' thenmaster<=D after 2ns;

                                                        elsif Inc='1'then master<=slave_inc after 2ns;

                            end if;

                   end if;

         end process;

        

         process(master,Clk)

         begin

                   if Clk='1'then slave<=master after 2ns;

                   end if;

         end process;

end PC;     

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

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity Decoder is

         generic(n: integer:=2);

         port(D: in std_logic_vector(n-1 downto 0);

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

end Decoder;

architecture Decoder of Decoder is

begin

process(D)

variable i:integer;

variable s:bit_vector((2**n)-1 downto 0);

         begin

                   s:=(0 => '1', others => '0');

                   i:=conv_integer(D);

                   s:=s rol i;

                   for ind in 2**n-1 downto 0 loop

                            if s(ind)='0' then Q(ind)<='0' after 2ns;

                                      else Q(ind)<='1' after 2ns;

                            end if;

                   end loop;

         end process;

end architecture;           

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

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity MUX is

         port(D: in std_logic_vector(1 downto 0);

                   P: in std_logic;

                   Q: out std_logic_vector(3 downto 0));

endMUX;

architecture MUX of MUX is

begin

process(D,P)

variable i:integer;

variable s:bit_vector(3 downto 0);

         begin

                   s:=(0 => '1', others => '0');

                   i:=conv_integer(D);

                   s:=s rol i;

                   for ind in 3 downto 0 loop

                            if s(ind)='0' then Q(ind)<='0' after 2ns;

                            else Q(ind)<=P after 2ns;

                            end if;

                   end loop;

         end process;

end architecture MUX; 

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

Описание блока РОН:

library ieee;

use ieee.std_logic_1164.all;

entity BlockRG is

         port(D: in std_logic_vector(7 downto 0);

                   Addr: in std_logic_vector(1 downto 0);

                   EI: in std_logic;

                   RST: in std_logic;

                   Clk: in std_logic);

end BlockRG;

architecture BlockRG of BlockRG is

signal Enable: std_logic_vector(3 downto 0);

component REGI is

         port(D: in std_logic_vector(7 downto 0);

                   Q: out std_logic_vector(7 downto 0);

                   EI: in std_logic;

                   RST: in std_logic;

                   Clk: in std_logic);

end component REGI;

component MUX is

         port(D: in std_logic_vector(1 downto 0);

                   P: in std_logic;

                   Q: out std_logic_vector(3 downto 0));

end component MUX;

begin

Registers: for i in 3 downto 0 generate

Reg: REGI portmap(D=>D,Q=>open,EI=>Enable(i),RST=>RST,Clk=>Clk);

end generate;

Switch: MUX port map(D=>Addr,P=>EI,Q=>Enable);

endBlockRG;

Описаниеузла АЛУ:

libraryieee;

use ieee.std_logic_1164.all;


entity ALU is

         port(In1: in std_logic_vector(7 downto 0);

                   OP: in std_logic;

          Res: out std_logic_vector(7 downto 0);

                   RST: in std_logic;

                   Clk: in std_logic);

end ALU;

architecture ALU of ALU is

signal RL :std_logic_vector(7 downto 0);

component MBR is

         port(D: in std_logic_vector(7 downto 0);

                   Q: out std_logic_vector(7 downto 0);

                   EO: in std_logic;

                   RST: in std_logic;

                   Clk: in std_logic);

end component;                     

begin

DD0:for i in 7 downto 1 generate

                   RL(i)<=In1(i-1);

         end generate;       

         RL(0) <= In1(7) after 10ns;

BUFF: MBR port map(D=>RL,Q=>Res,EO=>OP,RST=>RST,Clk=>Clk);

endarchitecture;

Временнаядиаграмма АЛУ:


/>

Каквидно из диаграммы общая задержка на этом узле 14,5 ns.

Описаниеузла памяти Memory:

library IEEE;

use IEEE.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity Memory is

         generic(file_name: string:= «MEM.DAT»);

port (addr: in std_logic_vector(7 downto 0);

                   data: out std_logic_vector(7 downto 0);

                   rd: in std_logic;

                   ld: in std_logic);

end Memory;

architecture Memory of Memory is

type t_rom_data is array (15 downto 0) of std_logic_vector(7 downto 0);

type rom_file_type is file of character;

file rom_file: rom_file_type;

signal rom_data: t_rom_data;

begin

         process(addr,rd)

         variable i: natural;

         begin

                   if rd = '1' then

                            i := conv_integer(addr);

                            data <= rom_data(i) after 5ns;

                   else

                            data <= (others => 'Z');

                   end if;

         end process;

         process(ld)

         variable c: character;

         begin

                   if ld='1' then        file_open(rom_file,file_name,read_mode);

                            for i in 0 to 15 loop

                                      for b in 7 downto 0 loop

                                               c:='U';

                                               if not(endfile(rom_file))then  read(rom_file,c);

                                                        whilenot(endfile(rom_file)) and c/='0' and c/='1' and c/='Z' and c/='W'

                                                        and c/='L' andc/='H' and c/='-' and c/='X' and c/='U' loop

                                                                  read(rom_file,c);

                                                        end loop;                                         

                                               end if;        

                                               if c='0' thenrom_data(i)(b) <= '0';

                                               elsif c='1' thenrom_data(i)(b) <='1';

                                               elsif c='Z' thenrom_data(i)(b) <='Z';

                                               elsif c='W' thenrom_data(i)(b) <='W';

                                               elsif c='L' thenrom_data(i)(b) <='L';

                                               elsif c='H' thenrom_data(i)(b) <='H';

                                               elsif c='-' thenrom_data(i)(b) <='-';

                                               elsif c='X' thenrom_data(i)(b) <='X';

                                               else rom_data(i)(b)<='U';

                                               end if;

                           

                                      end loop;

                            end loop;

                            file_close(rom_file);

                   end if;

         end    process;

end Memory;

Временнаядиаграмма работы памяти:

/>

Описаниеблока управления:


library ieee;

use ieee.std_logic_1164.all;

entity CU is

         port(Instr: in std_logic_vector(1 downto 0);

                   AccIn: out std_logic;

                   ALURL: out std_logic;

                   RegIn: out std_logic;

                   PCIn: out std_logic;

                   PCInc: out std_logic;

                   MBROut: out std_logic;

                   IRIn: out std_logic;

                   MEMRd: out std_logic;

                   Reset: inout std_logic;

                   RST: in std_logic;

                   Clk: in std_logic);

end CU;     

architecture CU of CU is

signal R: std_logic;

signal InstrDecoded,i: std_logic_vector(3 downto 0);

signal CounterPacked: std_logic_vector(2 downto 0);

signal CounterDecoded,c: std_logic_vector(7 downto 0);

component Counter is

         port(Q: out std_logic_vector(2 downto 0);

                   RST: in std_logic;

                   Clk: in std_logic);

end component;

component Decoder is

         generic(n: integer:=2);

         port(D: in std_logic_vector(n-1 downto 0);

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

end component;

begin

DD0: Counter port map(Q=>CounterPacked,RST=>R,Clk=>Clk);

InstrDecoder: Decoder generic map(2)portmap(D=>Instr,Q=>InstrDecoded);

CounterDecoder: Decoder generic map(3)portmap(D=>CounterPacked,Q=>CounterDecoded);

c<=CounterDecoded;

i<=InstrDecoded;

MemRd<='1' when c=«00000001» or c=«00000100» else'0' after 5ns;

PCInc<='1' when c=«00000001» or c=«00000100» else'0' after 5ns;

MBROut<='1' when c=«00000010» or c=«00001000» else'0' after 5ns;

IrIn<='1' when c=«00000010» else '0' after 5ns;

PCIn<='1' when c=«00001000» and i=«0001» else '0'after 5ns;

AccIn<='1' when (c=«00001000» and i=«0010») or(c=«00010000» and i=«1000») else '0' after 5ns;

RegIn<='1' when c=«00001000» and i=«0100» else '0'after 5ns;

ALURL<='1' when c=«00010000» and i=«1000» else '0'after 5ns;

Reset<='1' when (c=«00010000» and i=«0001») or(c=«00010000» and i=«1000»)

         or (c=«00001000» and i=«0010»)or(c=«00001000» and i=«0100») else '0' after 5ns;

R<=RSTor Reset;

endarchitecture;


7 ТЕСТИРОВАНИЕПРОЦЕССОРА И ПОДТВЕРЖДЕНИЕ ПРАВИЛЬНОСТИ ЕГО РАБОТЫ С ПОМОЩЬЮ ВРЕМЕННЫХ ДИАГРАММ

Описаниепроцессора:

library ieee;

use ieee.std_logic_1164.all;

entity CPU is

         generic(file_name: string:=".\src\MEM.DAT");

         port(RST: in std_logic;

                   Clk: in std_logic);

end entity; 

architecture CPU of CPU is

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

                                      component MAR is

                                               port(D: instd_logic_vector(7 downto 0);

                                                        Q: outstd_logic_vector(7 downto 0);

                                                        RST: instd_logic;

                                                        Clk: instd_logic);

                                      end component;

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

                                      component REGI is

                                               port(D: instd_logic_vector(7 downto 0);

                                                        Q: outstd_logic_vector(7 downto 0);

                                                        EI: in std_logic;

                                                        RST: instd_logic;

                                                        Clk: instd_logic);

                                      end component;

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

                                      component MBR is

                                               port(D: instd_logic_vector(7 downto 0);

                                                        Q: outstd_logic_vector(7 downto 0);

                                                        EO: in std_logic;

                                                        RST: instd_logic;

                                                        Clk: instd_logic);

                                      end component;

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

                                      component PC is

                                               port(D: instd_logic_vector(7 downto 0);

                                                        Q: outstd_logic_vector(7 downto 0);

                                                        EI: in std_logic;

                                                        Inc: instd_logic;

                                                        RST: in std_logic;

                                                        Clk: instd_logic);

                                      end component;

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

                                      componentALU is

                                               port(In1: instd_logic_vector(7 downto 0);

                                                        OP: in std_logic;

                                                Res: outstd_logic_vector(7 downto 0);

                                                        RST: in std_logic;

                                                        Clk: in std_logic);

                                      end component;

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

                                      component BlockRG is

                                               port(D: instd_logic_vector(7 downto 0);

                                                        Addr: instd_logic_vector(1 downto 0);

                                                        EI: in std_logic;

                                                        RST: in std_logic;

                                                        Clk: instd_logic);

                                      end component;

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

                                      component Memory is

                                       generic(file_name: string:=«MEM.DAT»);

                                               port (addr: instd_logic_vector(7 downto 0);

                                                        data: outstd_logic_vector(7 downto 0);

                                                        rd: in std_logic;

                                                        ld: instd_logic);

                                      end component;

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

                                      componentCU is

                                               port(Instr: instd_logic_vector(1 downto 0);

                                                        AccIn: outstd_logic;

                                                        ALURL: outstd_logic;

                                                        RegIn: outstd_logic;

                                                        PCIn: outstd_logic;

                                                        PCInc: out std_logic;

                                                        MBROut: out std_logic;

                                                        IRIn: outstd_logic;

                                                        MEMRd: outstd_logic;

                                                        Reset: inoutstd_logic;

                                                        RST: in std_logic;

                                                        Clk: in std_logic);

                                      end component;

signal          AccIn,ALURL,RegIn,PCIn,PCInc,MBROut,IRIn,MEMRd,Reset:std_logic;

signal Inst_Addr:std_logic_vector(7 downto 0);

signal          mem_mbr,BUS1,pc_mar,mar_mem,acc_alu:std_logic_vector(7downto 0);

begin

DD0: CU port map(Instr=> Inst_Addr(7 downto 6),AccIn=>AccIn,ALURL=> ALURL,

                   RegIn=> RegIn,PCIn=> PCIn,PCInc=>PCInc,MBROut=> MBROut,IRIn=> IRIn,

                   MEMRd=> MEMRd,Reset    =>Reset,RST       =>RST,     Clk    => Clk);

DD1: ALU port map(In1=> acc_alu,OP=> ALURL,Res=> BUS1,RST=>RST,Clk  => Clk);

DD2: Memory generic map(file_name)port map(addr => mar_mem,data         =>mem_mbr,rd=> MEMRd,ld=> RST);

DD3: BlockRG port map(D   => BUS1,Addr=> Inst_Addr(5 downto 4),EI    =>RegIn,RST=> RST,Clk=> Clk);

IR: REGI port map(D   => BUS1,Q=> Inst_Addr,EI=> IRIn,RST          =>RST,     Clk         => Clk);

DD4: MBR port map(D=> mem_mbr,Q=> BUS1,EO=> MBROut,RST          =>RST,         Clk    => Clk);

DD5: MAR port map(D         => pc_mar,Q       => mar_mem,RST        =>RST,     Clk         => Clk);

DD6: PC port map(D=> BUS1,Q   => pc_mar,EI=> PCIn,Inc      =>PCInc,RST=> RST,Clk=> Clk);

ACC: REGI port map(D=> BUS1,Q=> acc_alu,EI=> AccIn,RST=>RST,Clk=> Clk);

endCPU;

Программадля проверки работоспособности процессора написана в отдельном файле Mem.dat, хранящемся на диске, и подгружается в память прямо впроцессе работы средствами языка VHDL. Приведем пример тестовой программы ипокажем результаты ее работы.

01.00.0000 11111111   ;mova,#

10.00.0000 00000001   ;mov ro,#

10.01.0000 00000010   ;mov rl,#

10.10.0000 00000100   ;mov r2,#

10.11.0000 00001000   ;mov r3,#

01.00.0000 00000001   ;mov a,#

11.00.0000 00000000   ;rl a

00.00.0000 00001100   ;jmp#

Обработчикфайла построен таким образом, что игнорируются все символы, не входящие в типstd_logic. Первый столбец, первые 2 бита – код команды, вторые 2 бита — номерРОН), второй столбец – операнды. В случае с командой сдвига содержимое поляоперанда не имеет значения.

Загружаетсячисло в аккумулятор, затем в каждый из РОН, после чего производится очереднаязапись в аккумулятор и сдвиг его содержимого, искусственнозацикленныйкомандой JMP.

Временнаядиаграмма работы процессора при заданной программе приведена на рис. 3, где data – данные из памяти. На рис. 4. можноувидеть задержки и определить временные характеристики работы процессора.


/>

/>

Рис.3. Временная диаграмма работы процессора


/>

Рис.4. Временная диаграмма работы процессора


ВЫВОДЫ

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

Структурнаясхема, разработанная в этой работе, естественно, не является единственновозможной. Но на ее примере можно усвоить основные принципы построения цифровыхвычислительных систем, такие как микропрограммное управление, совместноеиспользование шин процессора различными устройствами со всеми вытекающимиотсюда требованиями к организации работы этих устройств: синхронизации,сингулярности передач информации и другими.

Даннаясхема обладает одной магистралью, она достаточно проста в исполнении, хотяодномагистральная система не всегда позволяет просто реализовать некоторыеоперации, а именно такая система занимает намного меньше места на печатнойплате чем двухмагистральная (и тем более трехмагистральная), что и дает ейпреимущества при конструировании небольших устройств.

Подиаграмме работы процессора видно, что выполнение команды пересылки занимает всреднем 100 ns, команда сдвига немного больше 125 ns. Полное выполнение всех командпроизводится за 1050 ns.

еще рефераты
Еще работы по информатике, программированию