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=*