47512 (665841), страница 2
Текст из файла (страница 2)
Рг7 - i вспомогательных регистров, которые по желанию программиста могут быть аккумуляторами, индексными регистрами или использоваться для запоминания промежуточных результатов.
Формат микрокоманд
| MIR – Microinstruction register – регистр микрокоманд (24 bit) | |||||||||||||||||||||||||||||||
| A | A MUX | B | B MUX | C | C MUX | RD | WR | ALU | COND | JMP ADDRESS | |||||||||||||||||||||
A, B, C – номер регистра для осуществления чтения (A, B) или записи (C)
A MUX, B MUX, C MUX – откуда брать номер регистра
(0 – из команды IR, 1 – из микрокоманды MIR)
RD – чтение из ОЗУ
При этом адрес памяти берется с шины А, а результат подается на шину С
WR – запись в ОЗУ
При этом адрес памяти берется с шины А, а данные - с шины B
ALU – код операции АЛУ
| КОП АЛУ | Операция АЛУ |
| 00 | NOP |
| 01 | ADD |
| 10 | SHRA |
| 11 | NAND |
COND – условие для определения адреса следующей выполняемой микрокоманды
| COND | Куда переходим | |
| 00 | NEXT | на следующую микрокоманду |
| 01 | DECODE | декодирование команды, Address = [KOP]100 |
| 10 | JMP | безусловный переход |
| 11 | JC | условный переход по переносу (Carry Flag) |
JMP ADDRESS – адрес в памяти микропрограмм, куда осуществляется переход
Микрокод
| Адрес | Микрокоманда | Пояснение |
| 0 1 2 3 | IR_HI = NOP(PC); READ PC = ADD(PC, IR_HI) IR_LO = NOP(PC); READ DECODE | чтение старшего слова команды переход к следующему слову (PC = PC + 1) чтение младшего слова команды декодирование считанной команды |
| ADD Rx, Ry, Rz | ||
| 4 | Rx = ADD(Ry, Rz); JMP 62 | сложение содержимого регистров |
| NAND Rx, Ry, Rz | ||
| 12 | Rx = NAND(Ry,Rz); JMP 62 | И-НЕ для содержимого регистров |
| SHR Rx, Ry | ||
| 20 | Rx = SHR(Ry); JMP 62 | арифметич. сдвиг содержимого регистра |
| JC address | ||
| 28 29 30 | Temp0 = NOP(Temp0); JC 30 JMP 62 PC = NOP(IR_LO); JMP 0 | организация условного перехода если условие не выполнилось, то завершить иначе записать в PC новый адрес из IR_LO |
| DEC Rx, Ry | ||
| 36 37 38 | Temp0 = SHR(IR_HI) Temp0 = NAND(Temp0, Temp0) Rx = ADD(Ry,Temp0); JMP 62 | Temp0 = 0 (00000001 00000000) Temp0 = -1 (11111111) Rx = Ry + Temp0 = Ry + (-1) |
| SUB Rx, Ry, Rz | ||
| 44 45 46 47 48 | Temp0 = SHR(IR_HI) Temp0 = ADD(Temp0, Rz) Temp0 = NAND(Temp0, Temp0) Temp0 = ADD(Temp0, IR_HI) Rx = ADD(Ry, Temp0); JMP 62 | Temp0 = 0 (00000001 00000000) Temp0 = 0 + Rz = Rz инвертировать Temp0 = Rz Temp0 = ( ! Rz) + 1 Rx = Ry + (-Rz) |
| LD Rx, address | ||
| 52 | Rx = NOP(IR_LO); READ; JMP 62 | чтение из ОЗУ (шина A – адрес) |
| ST Ry, address | ||
| 60 61 | Temp0 = NOP(Ry) Temp0 = NOP(IR_LO, Temp0); WRITE; JMP 62 | Temp0 = Ry (данные на шину B) запись в ОЗУ (шина A – адрес, шина B - данные) |
| End: | ||
| 62 | PC = ADD(PC, IR_HI); JMP 0 | увеличение счетчика команд (PC=PC+1) |
Кодировка микрокода
DEPTH = 64; % количество слов %
WIDTH = 24; % размер слова в битах %
ADDRESS_RADIX = DEC; % система счисления для адреса %
DATA_RADIX = BIN; % система счисления для данных %
CONTENT
BEGIN
[0..63] : 0; % по умолчанию везде нули %
% Инициализация %
0: 101100011101100000000000; % IR_HI = NOP(PC); READ %
1: 101111011011000100000000; % PC = ADD(PC, IR_HI) %
2: 101100011111100000000000; % IR_LO = NOP(PC); READ %
3: 000100011001000001000000; % DECODE %
% ADD Rx, Ry, Rz %
4: 000000000000000110111110; % Rx = ADD(Ry, Rz); JMP 62 %
% NAND Rx, Ry, Rz %
12: 000000000000001110111110; % Rx = NAND(Ry,Rz); JMP 62 %
% SHR Rx, Ry %
20: 000000000000001010111110; % Rx = SHR(Ry); JMP 62 %
% JC address %
28: 100110011001000011011110; % Temp0 = NOP(Temp0); JC 30 %
29: 100110011001000010111110; % JMP 62 %
30: 111110011011000010000000; % PC = NOP(IR_LO); JMP 0 %
% DEC Rx, Ry %
36: 110100011001001000000000; % Temp0 = SHR(IR_HI) %
37: 100110011001001100000000; % Temp0 = NAND(Temp0, Temp0) %
38: 000010010000000110111110; % Rx = ADD(Ry,Temp0); JMP 62 %
% SUB Rx, Ry, Rz %
44: 110100011001001000000000; % Temp0 = SHR(IR_HI) %
45: 100100001001000100000000; % Temp0 = ADD(Temp0, Rz) %
46: 100110011001001100000000; % Temp0 = NAND(Temp0, Temp0) %
47: 100111011001000100000000; % Temp0 = ADD(Temp0, IR_HI) %
48: 000010010000000110111110; % Rx = ADD(Ry, Temp0); JMP 62 %
% LD Rx, address %
52: 111100010000100010111110; % Rx = NOP(IR_LO); READ; JMP 62%
% ST Ry, address %
60: 000000011001000000000000; % Temp0 = NOP(Ry) %
61: 111110011001010010111110; % Temp0 = NOP(IR_LO, Temp0);
WRITE; JMP 62 %
62: 101111011011000110000000; % PC = ADD(PC, IR_HI); JMP 0 %
END ;
Примеры выполнения команд
Примеры выполнения каждой команды с указанием значения всех основных сигналов и содержимым основных регистров на каждом такте выполнения приведены на электронном носителе.
Основные сигналы и регистры
| Сокращение | Примечание |
| CLOCK | синхронизирующий сигнал |
| C_SEL[2..0] | номер регистра выбранного в качестве приемника |
| A_SEL[2..0] | номер регистра выбранного в качестве источника 1 |
| B_SEL[2..0] | номер регистра выбранного в качестве источника 2 |
| Rx[2..0] | номер регистра приемника из IR (регистра команд) |
| Ry[2..0] | номер регистра источника 1 из IR (регистра команд) |
| Rz[2..0] | номер регистра источника 2 из IR (регистра команд) |
| MIR_A[2..0] | номер регистра приемника из MIR (р-ра микрокоманд) |
| MIR_B[2..0] | номер регистра источника 1 из MIR (р-ра микрокоманд) |
| MIR_C[2..0] | номер регистра источника 2 из MIR (р-ра микрокоманд) |
| AMUX | Откуда брать номер регистра (0 – из IR, 1 – из MIR) Эти сигналы управляют соответствующими мультиплексорами. |
| BMUX | |
| CMUX | |
| A_bus[7..0] | Данные на шинах источниках, выходящих из блока регистров |
| B_bus[7..0] | |
| C_ALU[7..0] | Результат выходящий из АЛУ |
| C_RAM[7..0] | Данные, считанные из ОЗУ |
| C_bus[7..0] | Выбранные данные для записи (С_ALU или C_RAM) |
| RD | сигнал чтения из ОЗУ |
| WR | сигнал записи в ОЗУ |
| KOP_ALU[1..0] | код операции АЛУ (поступает из MIR) |
| COND[1..0] | определение следующей микрокоманды (из MIR) |
| CBL_SEL[1..0] | результат работы Control Branch Logic (логика управления ветвлением) – определяет следующую микрокоманду |
| CF | флаг переноса, поступающий из АЛУ в Control Branch Logic |
| JMP_ADR[5..0] | адрес следующей микрокоманды (из MIR) |
| MIR[23..0] | полное значение регистра микрокоманд (24 бит) |
| PC | программный счетчик (адрес в ОЗУ) |
Примеры программ
ПРИМЕР 1














