Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Процессоры ARC.doc
Скачиваний:
24
Добавлен:
11.04.2014
Размер:
2.1 Mб
Скачать

18: Jump 2047.

A=0

B=0

C=0

AMUX=0 (код регистра-источника берётся из регистра микрокоманд (MIR))

BMUX=0 (код регистра-источника берётся из регистра микрокоманд (MIR))

CMUX=0 (код регистра-приёмника берётся из регистра микрокоманд (MIR))

RD=0

WR=0

ALU=AND

COND=JUMP

//безусловный переход по адресу (в микрокоде) в поле JUMP ADDR

JUMP ADDR=2047

12: PC=ADD(PC, temp0); JUMP 0.

A=PC

B= temp0

C= PC

AMUX=0 (код регистра-источника берётся из регистра микрокоманд (MIR))

BMUX=0 (код регистра-источника берётся из регистра микрокоманд (MIR))

CMUX=0 (код регистра-приёмника берётся из регистра микрокоманд (MIR))

RD=0

WR=0

ALU=ADD

COND=JUMP

JUMP ADDR=0

//т.к. команды ветвления (переходов) работают с адресами, то после их удачного выполнения не нужно переходить на адрес 2047 (где инкрементируется PC), т.к. его значение уже поменялось. Изменение PC – это цель успешного выполнения команд ветвления. Напомню, что PC будет показывать адрес следующей выполняемой команды. И не забудьте вернуться на нулевой адрес, т.к. выполнение программы должно продолжаться.

В данном случае, в микрокоде при переходе по адресу 12 будет успешное выполнение условия, а по адресу 2047 – нет (т.е. условие не верно).

2047: PC=INC(PC); JUMP 0.

A=PC

B= *

C= PC

AMUX=0 (код регистра-источника берётся из регистра микрокоманд (MIR))

BMUX=0 (код регистра-источника берётся из регистра микрокоманд (MIR))

CMUX=0 (код регистра-приёмника берётся из регистра микрокоманд (MIR))

RD=0

WR=0

ALU=INC

COND=JUMP

JUMP ADDR=0

Пример микрокода команды ld

1) Форматы команды:

ld rd, rs1, rs2; rd=mem[rs1+rs2] – косвенная регистровая адресация.

ld rd, rs1, imm13; rd=mem[rs1+imm13] – косвенная регистровая адресация с непосредственным смещением.

Код команды: op=11, op3(сам код ld)=000000.

Адрес при декодировании: 11100000000=1024+512+256=1792.

2) Микрокод команды ld:

0: IR=AND(PC, PC); MemRD.

//выполнение этой микрокоманды не связано с какой-то конкретной командой АЛУ, т.к. у нас выполняется операция чтения. Даже когда операция в АЛУ выполнится, то её результат не сохранится, т.к. мультиплексор C Bus из двух шин данных из памяти и из АЛУ выберет одну в зависимости от поля RD в регистре микрокоманд. В нашем случае, это будет шина данных из памяти, как раз она и сохранится в блоке регистров.

Посмотрите на схему процессора ARC. Проследите за значением поля RD из регистра микрокоманд (MIR). Оно управляет чтением из основной памяти, а также является сигналом выбора для мультиплексора C Bus (C Bus MUX).

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

Так для нашего случая, в регистре микрокоманд (MIR) в поле A нужно указать код регистра PC.

1: Decode.

1792: JIMM 1794; temp0=ADD(rs1, rs2).

1793: rd=AND(temp0, temp0); MemRD; JUMP 2047.

1794: temp0=SGNEXT(IR).

1795: temp0=ADD(rs1, temp0); JUMP 1793.

//следует отметить ещё и следующее, мы к примеру не можем записать так: temp0=ADD(temp0, rs1), - это не выполнимо, потому что поле rs1 регистра команд связано с мультиплексором A и если используется, то должно быть полем первого источника.

2047: PC=INC(PC); JUMP 0.

3) Заполнение полей регистра микрокоманд (MIR):

0: IR=AND(PC, PC); MemRD.

A=PC

B= PC

C=IR

// Это микрокоманда загружает в регистр IR команду из памяти программы по адресу равному значению регистра PC. PC и IR – эти регистры не доступны пользователю, поэтому их коды должны браться из регистра микрокоманд.

AMUX=0 (код регистра-источника берётся из регистра микрокоманд (MIR))

BMUX=0 (код регистра-источника берётся из регистра микрокоманд (MIR))

CMUX=0 (код регистра-приёмника берётся из регистра микрокоманд (MIR))

RD=1

WR=0

ALU=AND

COND=NEXT

JUMP ADDR=*