Реферат: Разработка структуры процессора на основе МПА с жесткой логикой
СОДЕРЖАНИЕ
ВВЕДЕНИЕ
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.