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
DEPTH = 256; % Memory depth and width are required %
WIDTH = 8; % Enter a decimal number %
ADDRESS_RADIX = DEC; % Address and value radixes are optional %
DATA_RADIX = BIN; % Enter BIN, DEC, HEX, or OCT; unless %
CONTENT
BEGIN
%-------------------%
0: 11001000; % LD Rg1, [6] %
1: 00000110;
2: 11010000; % LD Rg2, [7] %
3: 00000111;
4: 00011011; % ADD Rg3, Rg1, Rg2 %
5: 00000000;
6: 00010110; % const 22 (DEC) %
7: 00100001; % const 33 (DEC) %
END ;
ПРИМЕР 2
DEPTH = 256; % Memory depth and width are required %
WIDTH = 8; % Enter a decimal number %
ADDRESS_RADIX = DEC; % Address and value radixes are optional %
DATA_RADIX = BIN; % Enter BIN, DEC, HEX, or OCT; unless %
CONTENT
BEGIN
%-----------------%
0: 11001000; % LD Rg1, [10] %
1: 00001010;
2: 01010010; % SHR Rg2, Rg1 %
3: 00000111;
4: 01100000; % JC 8 %
5: 00001000;
6: 10010010; % DEC Rg2, Rg1 %
7: 00000000;
8: 11100010; % ST Rg1, [10] %
9: 00001010;
10: 00000001; % const = 1 %
END ;
Значения основных сигналов и содержимое основных регистров на каждом такте выполнения данных примеров программ приведены в виде временных диаграмм на электронном носителе.
Среднее количество микрокоманд при выполнении команды процессора можно приблизительно оценить как 4 + 17/8 + 1 = 7 микрокоманд на команду процессора. Таким образом, при максимальной тактовой частоте в 33,3 МГц средняя производительность процессора составит 4, 7 MOPS (или 33,3 М μops / сек).
Тестовая программа | Количество команд процессора | Количество микрокоманд | Время выполнения, нс | N / сек |
ПРИМЕР 1 | 3 | 18 | 540 | 1851851 |
ПРИМЕР 2 | 5 | 34 | 1020 | 980398 |
Повысить производительность процессора можно одним из следующих способов:
- Увеличить разрядность шины-приемника с 8 до 16 бит, и считывать команду из ОЗУ не за три такта, а за один;
- Увеличить функциональность АЛУ, при этом можно будет сократить длину микрокода для некоторых команд (особенно для SUB и DEC);
- Перейти от микропрограммного управления к управлению на основе жесткой логики;
- Применить конвейеризацию;
- Что-нибудь распараллелить.