Койяанискаци - Процессор Радиолюбителя
Добавлено: Чт дек 24, 2020 19:17:22
Основнaя Хабр-Статья.
Целью было сделать некое программируемое Тьюринг-полное устройство, пригодное к использовании в качестве Центрального Процессорного.
Основной акцент делался на кодировании микропрограмм посредством реального механического дампа из шестнадцатеричных тумблеров.
А чтобы не придумывать очередной бинарный машинный код, за основу были взяты тетрады этих тумблеров.
Тем самым…
В исполнении Принстонской архитектуры на одну операцию затрачивается по 2 такта. Соответственно, Гарвардский вариант требует по 1 такту.
Разрядность контроллера может варьироваться от 4 бит до 64, в зависимости от поставленной задачи и реализации.
Количество всех Регистров Общего Назначения может также варьироваться от 6 до 30.
Причём, роль РОН могут исполнять любые типовые устройства: Таймеры, ПДП, Датчики, Сервоприводы и т.п…
Также, за РОН можно использовать и универсальную магазинную память в режиме FIFO или LIFO, чтобы обеспечить стековые операции.
Концептуально архитектура не ограничивает конечную реализацию процессора. Так как самое главное в процессоре - дешифратор команд, который не должен менять свою логику и обязан декодировать команды в соответствии с парадигмой описываемой архитектуры.
В классическом варианте выполнение программы выполняется не спешно:Но можно ускорить весь процесс:Если усложнить декодирование команд добавлением нескольких дешифраторов.
Минимально же весь микроконтроллер без АЛУ и РОН можно представить вот так:
Допустим, можно на «Кой-Коде» организовать подобие RISC-ядра для эмуляции выполнения команд процессора i8080.
Сначала назначим все регистры i8080 на Кой-Регистры:Теперь можно описать большинство инструкций процессора i8080 примерно вот так:Откуда видно, что большинство команд легко накладываются на эмуляцию. Тем самым, если использовать ПЗУ 4 кб под прошивку микрокода и под каждую команду выделить по 16 байтов Кой-Кода, то в Гарвардском исполнении большинство из этих команд будут выполняться за 3 такта. И если на считывание кода команды в цикле M1 будет затрачено 2 такта, то на большинство этих команд в общей сложности будет затрачиваться по 5 тактов или 8 тактов, что практически сравнимо с производительностью самого i8080…
Если не скупиться и использовать четвёрку дешифратора команд, на Кой-Команды будет уходить по 1 такту или по 3, а в общей сложности на чтение i8080-кода и его исполнение будет тратиться по 3 такта или 5, что уже заметно лучше.
P.S.: Здесь и далее будут использоваться сокращения вида «Кой-Дамп», «Кой-Код» и т.п…
Целью было сделать некое программируемое Тьюринг-полное устройство, пригодное к использовании в качестве Центрального Процессорного.
Основной акцент делался на кодировании микропрограмм посредством реального механического дампа из шестнадцатеричных тумблеров.
А чтобы не придумывать очередной бинарный машинный код, за основу были взяты тетрады этих тумблеров.
Тем самым…
- Код «A1» на тумблере в дампе так и означает выборку регистра «A1»
- Код «B2» означает выборку регистра «B2»
- Код «AB» означает группу операндов «A,B» для АЛУ-операций. В данном случае - «A1,B2»
- Код «EC» означает «End-by-Carry» - выход из подпрограммы по флагу «CF»
В исполнении Принстонской архитектуры на одну операцию затрачивается по 2 такта. Соответственно, Гарвардский вариант требует по 1 такту.
Разрядность контроллера может варьироваться от 4 бит до 64, в зависимости от поставленной задачи и реализации.
Количество всех Регистров Общего Назначения может также варьироваться от 6 до 30.
Причём, роль РОН могут исполнять любые типовые устройства: Таймеры, ПДП, Датчики, Сервоприводы и т.п…
Также, за РОН можно использовать и универсальную магазинную память в режиме FIFO или LIFO, чтобы обеспечить стековые операции.
Концептуально архитектура не ограничивает конечную реализацию процессора. Так как самое главное в процессоре - дешифратор команд, который не должен менять свою логику и обязан декодировать команды в соответствии с парадигмой описываемой архитектуры.
В классическом варианте выполнение программы выполняется не спешно:
Код: Выделить всё
0000 A9 |REG A9 ; (Такт #1) Выборка регистра блока A с индексом #9
0001 AB |ARG A,B ; (Такт #2) Сборка группы операндов регистровых групп A и B
0002 0F|MOV A9,B0 ; (Такт #3) Фиксирование в левом операнде данных правого
| | ^^
\ / ||
V |/
| |
+----------+Код: Выделить всё
0000 A9 AB 0F|MOV A9,B0 ; (Такт #1) Операция выполняется за 1 тактСначала назначим все регистры i8080 на Кой-Регистры:
Код: Выделить всё
B - B1
C - C1
D - B2
E - C2
H - B3
L - C3
SP- B4C4
A - A1
PC- B5C5
PSW-A1A0
M - B3C3Спойлер
Код: Выделить всё
I8080 CODE|KOYAANISQATSI CODE
----------|--------------------
02|STAX B |A1 10 AF|MOV B1C1,A1 ; 5 тактов
0A|LDAX B |A1 10 AE|MOV A1,B1C1 ; 5 тактов
12|STAX D |A1 20 AF|MOV B2C2,A1 ; 5 тактов
1A|LDAX D |A1 20 AE|MOV A1,B2C2 ; 5 тактов
--+-------+--------+-----------
40|MOV B,B|B1 BB 1F|MOV B1,B1 ; 3 такта
41|MOV B,C|B1 BC 1F|MOV B1,C1 ; 3 такта
42|MOV B,D|B1 BB 2F|MOV B1,B2 ; 3 такта
43|MOV B,E|B1 BC 2F|MOV B1,C2 ; 3 такта
44|MOV B,H|B1 BB 3F|MOV B1,B3 ; 3 такта
45|MOV B,L|B1 BC 3F|MOV B1,C3 ; 3 такта
46|MOV B,M|B1 30 BE|MOV B1,B3C3 ; 5 тактов
47|MOV B,A|B1 BA 1F|MOV B1,A1 ; 3 такта
--+-------+--------+-----------
48|MOV C,B|C1 CB 1F|MOV C1,B1
49|MOV C,C|C1 CC 1F|MOV C1,C1
4A|MOV C,D|C1 CB 2F|MOV C1,B2
4B|MOV C,E|C1 CC 2F|MOV C1,C2
4C|MOV C,H|C1 CB 3F|MOV C1,B3
4D|MOV C,L|C1 CC 3F|MOV C1,C3
4E|MOV C,M|C1 30 CE|MOV C1,B3C3
4F|MOV C,A|C1 CA 1F|MOV C1,A1
--+-------+--------+-----------
50|MOV D,B|B2 BB 1F|MOV B2,B1
51|MOV D,C|B2 BC 1F|MOV B2,C1
52|MOV D,D|B2 BB 2F|MOV B2,B2
53|MOV D,E|B2 BC 2F|MOV B2,C2
54|MOV D,H|B2 BB 3F|MOV B2,B3
55|MOV D,L|B2 BC 3F|MOV B2,C3
56|MOV D,M|B2 30 BE|MOV B2,B3C3
57|MOV D,A|B2 BA 1F|MOV B2,A1
--+-------+--------+-----------
58|MOV E,B|C2 CB 1F|MOV C2,B1
59|MOV E,C|C2 CC 1F|MOV C2,C1
5A|MOV E,D|C2 CB 2F|MOV C2,B2
5B|MOV E,E|C2 CC 2F|MOV C2,C2
5C|MOV E,H|C2 CB 3F|MOV C2,B3
5D|MOV E,L|C2 CC 3F|MOV C2,C3
5E|MOV E,M|C2 30 CE|MOV C2,B3C3
5F|MOV E,A|C2 CA 1F|MOV C2,A1
--+-------+--------+-----------
60|MOV L,B|B3 BB 1F|MOV B3,B1
61|MOV L,C|B3 BC 1F|MOV B3,C1
62|MOV L,D|B3 BB 2F|MOV B3,B2
63|MOV L,E|B3 BC 2F|MOV B3,C2
64|MOV L,H|B3 BB 3F|MOV B3,B3
65|MOV L,L|B3 BC 3F|MOV B3,C3
66|MOV L,M|B3 30 BE|MOV B3,B3C3
67|MOV L,A|B3 BA 1F|MOV B3,A1
--+-------+--------+-----------
68|MOV L,B|C3 CB 1F|MOV C3,B1
69|MOV L,C|C3 CC 1F|MOV C3,C1
6A|MOV L,D|C3 CB 2F|MOV C3,B2
6B|MOV L,E|C3 CC 2F|MOV C3,C2
6C|MOV L,H|C3 CB 3F|MOV C3,B3
6D|MOV L,L|C3 CC 3F|MOV C3,C3
6E|MOV L,M|C3 30 CE|MOV C3,B3C3
6F|MOV L,A|C3 CA 1F|MOV C3,A1
--+-------+--------+-----------
70|MOV M,B|B1 30 BF|MOV B3C3,B1
71|MOV M,C|C1 30 CF|MOV B3C3,C1
72|MOV M,D|B2 30 BF|MOV B3C3,B2
73|MOV M,E|C2 30 CF|MOV B3C3,C2
74|MOV M,H|B3 30 BF|MOV B3C3,B3
75|MOV M,L|C3 30 CF|MOV B3C3,C3
76|HLT |00 |HLT
77|MOV M,A|A1 30 AF|MOV B3C3,A1
--+-------+--------+-----------
78|MOV A,B|A1 AB 1F|MOV A1,B1
79|MOV A,C|A1 AC 1F|MOV A1,C1
7A|MOV A,D|A1 AB 2F|MOV A1,B2
7B|MOV A,E|A1 AC 2F|MOV A1,C2
7C|MOV A,H|A1 AB 3F|MOV A1,B3
7D|MOV A,L|A1 AC 3F|MOV A1,C3
7E|MOV A,M|A1 A0 CE|MOV A1,B3C3
7F|MOV A,A|A1 AA 1F|MOV A1,A1
--+-------+--------+-----------
88|ADC B |A1 AB 1A|ADD A1,B1 ; 3 такта
89|ADC C |A1 AC 1A|ADD A1,C1 ; 3 такта
8A|ADC D |A1 AB 2A|ADD A1,B2 ; 3 такта
8B|ADC E |A1 AC 2A|ADD A1,C2 ; 3 такта
8C|ADC H |A1 AB 3A|ADD A1,B3 ; 3 такта
8D|ADC L |A1 AC 3A|ADD A1,C3 ; 3 такта
8E|ADC M |A1AA301A|ADD A1,B3C3 ; 6 тактов
8F|ADC A |A1 AA 1A|ADD A1,A1 ; 3 такта
--+-------+--------+-----------
98|SBB B |A1 AB 1B|SUB A1,B1
99|SBB C |A1 AC 1B|SUB A1,C1
9A|SBB D |A1 AB 2B|SUB A1,B2
9B|SBB E |A1 AC 2B|SUB A1,C2
9C|SBB H |A1 AB 3B|SUB A1,B3
9D|SBB L |A1 AC 3B|SUB A1,C3
9E|SBB M |A1AA301B|SUB A1,B3C3
9F|SBB A |A1 AA 1B|SUB A1,A1
--+-------+--------+-----------
A0|ANA B |A1 AB 1C|AND A1,B1
A1|ANA C |A1 AC 1C|AND A1,C1
A2|ANA D |A1 AB 2C|AND A1,B2
A3|ANA E |A1 AC 2C|AND A1,C2
A4|ANA H |A1 AB 3C|AND A1,B3
A5|ANA L |A1 AC 3C|AND A1,C3
A6|ANA M |A1AA301C|AND A1,B3C3
A7|ANA A |A1 AA 1C|AND A1,A1
--+-------+--------+-----------
A8|XRA B |A1 AB 1E|EOR A1,B1
A9|XRA C |A1 AC 1E|EOR A1,C1
AA|XRA D |A1 AB 2E|EOR A1,B2
AB|XRA E |A1 AC 2E|EOR A1,C2
AC|XRA H |A1 AB 3E|EOR A1,B3
AD|XRA L |A1 AC 3E|EOR A1,C3
AE|XRA M |A1AA301E|EOR A1,B3C3
AF|XRA A |A1 AA 1E|EOR A1,A1
--+-------+--------+-----------
B0|ORA B |A1 AB 1D|OR A1,B1
B1|ORA C |A1 AC 1D|OR A1,C1
B2|ORA D |A1 AB 2D|OR A1,B2
B3|ORA E |A1 AC 2D|OR A1,C2
B4|ORA H |A1 AB 3D|OR A1,B3
B5|ORA L |A1 AC 3D|OR A1,C3
B6|ORA M |A1AA301D|OR A1,B3C3
B7|ORA A |A1 AA 1D|OR A1,A1
--+-------+--------+-----------
CE|ACI IB |A1AA501A|ADD A1,B5C5
DE|SBI IB |A1AA501B|SUB A1,B5C5
E6|ANI IB |A1AA501C|AND A1,B5C5
EE|XRI IB |A1AA501E|EOR A1,B5C5
F6|ORI IB |A1AA501D|OR A1,B5C5Если не скупиться и использовать четвёрку дешифратора команд, на Кой-Команды будет уходить по 1 такту или по 3, а в общей сложности на чтение i8080-кода и его исполнение будет тратиться по 3 такта или 5, что уже заметно лучше.
P.S.: Здесь и далее будут использоваться сокращения вида «Кой-Дамп», «Кой-Код» и т.п…