Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ВиМТ (курсовая)

.pdf
Скачиваний:
2
Добавлен:
30.01.2019
Размер:
584.26 Кб
Скачать

ФЕДЕРАЛЬНОЕ АГЕНСТВО СВЯЗИ

ФГБОУ ВПО «Санкт-Петербургский государственный университет телекоммуникаций им. Проф. М. А. Бонч-Бруевича»

ФАКУЛЬТЕТ ИНФОКОММУНИКАЦИОННЫХ СЕТЕЙ И СИСТЕМ Кафедра программной инженерии и вычислительной техники

Пояснительная записка

к курсовому проекту

Моделирование простейшего RISC-процессора

Подготовили: Принял:

Санкт-Петербург

Цель работы:

Изучение основ функционирования микропроцессора путём самостоятельного моделирование простейшего RISC-процессора, выполняющего ограниченное количество команд.

Задание на моделирование:

IN port, R1; MOV data, R2; ADD R1, R2; CMP R0, R2;

Программа предполагает ввод данных в регистр 1 с тумблеров, в регистр 2 данные поступают непосредственно из текста команды. Затем содержимое регистров суммируется, и результат сравнивается с «0». При этом выставляются флаги (знак, ноль, и перенос). Содержимое регистров выводится на сегментные индикаторы. Содержимое триггеров флагов выводится на светодиоды.

Введение

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

Процессор будет иметь :

Исполнительный блок, содержащий 4 регистра. Регистры 8разрядные. Регистр с младшим адресом, R0, всегда хранит « 0».

Арифметико-логическое устройство, АЛУ, будет содержать только 8-

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

Таким образом, проектируемый процессор может выполнять команды обмена с пространством памяти, команды внутренних пересылок и команды сложения. Как упоминалось ранее, обмен с пространством памяти пока не затрагиваем. Нас будут интересовать пересылки и сложение. Адресация таких действий может быть как регистровая (источник и приемник адресуются по регистрам), так и непосредственная ( источник представлен 8-разрядным операндом в структуре команды). Для успешной обработки информации RISK — процессором разработаем «формат команды», которую должен исполнить процессор. Примем размерность формата команды - 16 разрядов.

P15,P14,P13,P12,P11,P10,P9,P8,P7,P6,P5,P4,P3,P2,P1,P0

Вэтом формате выделяем следующие поля:

Р15,Р14,Р13 код операции (код операции определяет что делать). Коды операции задаются произвольно:

001 запись операнда в память (IN),

010 пересылка с непосредственной адресацией (MOV),

2

011 – сложение с непосредственной адресацией (ADD),

100 – пересылка с регистровой адресацией (CMP);

P12 – резерв, 0;

P11..P6 – адресные поля источников и приёмников:

P11,P10 – адрес первого источника,

P9,P8 – адрес второго источника,

P7,P6 – адрес приёмника.

Для случаев с непосредственной адресацией приёмника адресуется по

P9,P8.

Проектируемый процессор будет выполнять следующий порядок команд:

1.

IN port, R1 – ввести данные в регистр 1 с тумблеров;

2.

MOV data, R2 – данные из текста непосредственно поступают

 

во 2 регистр;

 

3.

ADD

R1,

R2

суммировать содержимое регистров;

4.

CMP

R0,

R2

результат сравниваем с «0».

P5..P0 – значение непосредственных операндов. Пусть data=14. Запишем коды для этих команд. Неиспользуемые разряды заполним нулями.

Команда

 

 

Кодыкоманд

 

 

п/п

P15..P13

P12

P11 P10

P9 P8

P7 P6

P5..P0

 

 

 

 

 

 

 

 

 

1

IN port, R1

001

0

00

01

00

000000

 

 

 

 

 

 

 

 

2

MOV data, R2

010

0

00

10

00

001110

 

 

 

 

 

 

 

 

3

ADD R1, R2

011

0

01

10

10

000000

 

 

 

 

 

 

 

 

4

CMP R0, R2

100

0

00

10

00

000000

 

 

 

 

 

 

 

 

Так как наш процессор будет выполнять лишь 4 команды, блок памяти инструкций для него можно представить в виде простейшего КЦУ, к выходу которого подключены два 8-разрядных регистра. На вход КЦУ поступают адреса от программного счетчика. Каждый адрес, таким образом, вызывает определенный программный код, который отображается в выходном буфере. Для настоящего цикла работ строим память на восемь 16-разрядных состояний. Минимальная единица информации для стандартной процессорной системы – байт, поэтому программный счетчик должен иметь 4 разряда. Управление блоком памяти производится тремя старшими разрядами, младший разряд подает тактовый сигнал на исполнительный блок.

Записанный выше код инструкций содержит адреса направлений действий схемы (коды операций) и адреса устройств, непосредственно в этой операции участвующих (источников и преемников).

3

1. Формирование блока памяти инструкций.

Необходимо построить схему блока, содержащую память инструкций (raminst) и программный счётчик (cnt44). Блок памяти инструкций представлен в виде простейшего КЦУ, к выходу которого подключены два 8-разрядных регистра (reg8). Обращение к регистрам возможно при активном уровне «1» на разрешающем входе ena. На вход КЦУ поступают адреса от программного счётчика. Каждый адрес, таким, образом, вызывает определённый программный код, который отображается в выходном буфере. Максимальный объём проектируемой памяти – восемь 16-разрядных ячеек, поэтому строим 4-разрядный счётчик, младший разряд которого формирует тактовую частоту для исполнительного блока, а три старших разряда – адреса на блок памяти raminst.

Схема 1.1 - Блок памяти инструкций

Входы «ENA» и «RES» счётчика на схеме соединяются с примитивным «VCC», т.е. устанавливаются в «1». Вход «eninst», который даёт разрешение на обращение к памяти инструкций, также можно заменить подачей «1».

Код для блока raminst:

library ieee;

use ieee.std_logic_1164.all; entity raminst is

port(

adr_i:in bit_vector(3 downto 1); data_out:out bit_vector(15 downto 0) );

end raminst;

architecture BBB of raminst is

4

begin p0:process(adr_i) begin

case adr_i is

when "000"=>data_out<="0010000100000000"; when "001"=>data_out<="0100001000001110"; when "010"=>data_out<="0110011010000000"; when "011"=>data_out<="1000001000000000"; when others=>data_out<="0000000000000000";

end case; end process;

end;

Диаграмма работы блока raminst:

Код для 4-разрядного счётчика cnt44:

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity cnt44 is port(

clk: in std_logic; ena: in std_logic; res: in std_logic;

q: out std_logic_vector(3 downto 0)

);

end cnt44;

architecture arch of cnt44 is

signal cnt: std_logic_vector(3 downto 0); begin process (clk,res)

begin

if (res='0') then cnt<=(others=>'0'); elsif(rising_edge(clk)) then if(ena='1') then

cnt<=cnt+"0001"; end if;

5

end if; end process;

q<=cnt; end arch;

Код для 8-разрядного счётчика reg8:

library ieee;

use ieee.std_logic_1164.all; entity reg8 is

port(

data_i:in std_logic_vector(7 downto 0); clk_i:in std_logic;

ena:in std_logic; ctrl:in std_logic;

data_out: out std_logic_vector(7 downto 0)

);

end reg8;

architecture arch of reg8 is

signal regist: std_logic_vector(7 downto 0); begin process (clk_i)

begin

if(rising_edge(clk_i)) then if(ena ='1') then

regist <= data_i; end if;

end if; end process;

data_out <= regist when ctrl = '1' else "ZZZZZZZZ"; end arch;

Диаграмма работы блока IU:

6

2. Формирование блока управления.

Теперь нам необходимо построить управляющее устройство, формирующее сигналы управления на исполнительный блок. В состав этого устройства входят инструкции (IU) и блок дешифрации команд (Decoder Unit, DCU), имеющий 4 дешифратора. Основной дешифратор на 3 адресных входа (dec) получает код операции и управляет дешифраторами (dec1), которые имеют по два адресных входа, определяющими местонахождение операндов (adr_i[1..0]), входы управления подключением (en), а так же выводом операнда данных на внутреннюю шину данных, адресного операнда – на позиции, определяющие адрес в пространстве памяти данных. Управление формируется соответственно: для операнда данных – в случае команд переноса и сложения непосредственной адресацией, для адресного операнда – в случае команд обращения к области памяти данных.

Договоримся, что два дешифратора определяют источники по разрядам кода Р11, Р10 и Р9, Р8; а один дешифратор определяет приемник по разрядам кода Р7, Р6. В случае, когда команда имеет только один операнд – источник, приемник определяется по разрядам Р9, Р8, т.е. с помощью дешифратора второго источника. Управление дешифратором первого источника получает активный уровень в случае исполнения команд: сложения (все адресации) и переноса с регистровой адресацией. Управление дешифратором второго источника получает активный уровень в случае исполнения команд сложения и переноса с регистровой адресацией. Управление дешифратором приемника получает активный уровень в случае исполнения команд сложения и переноса с любыми видами адресации. Кроме того для команд сложения при любой адресации и переноса с регистровой адресацией блок управления формирует сигнал активизации АЛУ (выход en_add), формируемый основным дешифратором.

Схема 2.1 - Блок управления

7

Код для основного дешифратора на три входа dec:

library ieee;

use ieee.std_logic_1164.all; entity dec is

port(

adr_i:in bit_vector(2 downto 0); data_out:out bit_vector(7 downto 0));

end;

architecture BBB of dec is begin p0:process(adr_i)

begin

case adr_i is when"000"=>data_out<="00000001"; when"001"=>data_out<="00000010"; when"010"=>data_out<="00000100"; when"011"=>data_out<="00001000"; when"100"=>data_out<="00010000"; when"101"=>data_out<="00100000"; when"110"=>data_out<="01000000"; when"111"=>data_out<="10000000";

end case; end process;

end;

Код для дешифратора на два входа dec1:

library ieee;

use ieee.std_logic_1164.all; entity dec1 is

port(

adr_i:in bit_vector(1 downto 0); en:in bit;

data_out:out bit_vector(3 downto 0)); end dec1;

architecture BBB of dec1 is begin process(adr_i)

begin

if(en='1')then data_out(0)<=(not(adr_i(0)))and(not(adr_i(1))); data_out(1)<=(adr_i(0))and(not(adr_i(1))); data_out(2)<=(not(adr_i(0)))and(adr_i(1)); data_out(3)<=(adr_i(0))and(adr_i(1));

elsif(en='0')then

data_out(3 downto 0)<="0000"; end if;

end process;

end;

8

Диаграмма работы блока CU:

9

3. Формирование блока регистров.

Исполнительное устройство моделируемого процессора содержит два блока: блок регистров, где операнды временно хранятся для производства операций над ними, и арифметико-логического устройство (ALU, АЛУ), где собственно и производятся операции.

В этой части проекта необходимо построить блок регистров, содержащий три 8-разрядных регистра. Один из этих регистров постоянно хранит «0», т.е. не может быть приемником информации, два других же предполагаются под общее назначение. На общую шину данных может поступать как значение непосредственного операнда источника, так и содержимое выхода сумматора АЛУ. Простейшими развязками этих сигналов в нашем случае могут служить блоки элементов 2ИЛИ и 3ИЛИ. У каждого регистра буфер записи (ena) может быть включен только в том случае, если этот регистр служит приемником операнда (позиции приемник или второй источник).

Схема 3.1 - Блок регистров

Код для регистра с возможностью считывания операнда в дополнительном коде reg_sb:

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all; entity reg_sb is

port(

data_i:in std_logic_vector(7 downto 0); clk_i:in std_logic;

10