Урок 1. АЛУ и регистр A: калькулятор на тумблерах
В картинкахПосле этого урока у тебя будет сердце процессора карты: тумблерами выбираешь операцию и число, нажимаешь кнопку — и регистр A складывает, вычитает, сравнивает. Это калькулятор, только операции у него — команды процессора.
1.1. Идея: одно действие за такт
Процессор карты за один такт делает одно действие: A ← A (операция) B.
A— аккумулятор: регистр на 8 бит, в нём живёт результат;B— число: сейчас с тумблеров, потом из программы или памяти;- операция — код из 4 бит: тот же, что потом будет в слове программы.
Такт — кнопка CLK: нажал — выполнилась одна операция, A запомнил результат.
1.2. Идея: один сумматор на четыре операции
Сложение, сложение с переносом, вычитание и сравнение делает один сумматор из восьми FA:
- вычитание — это сложение с перевёрнутым числом и единицей:
A − B = A + НЕ B + 1; XORс сигналомsubпереворачивает битыB, единица приходит переносом в младший разряд;CMP— этоSUB, после которогоAне записывается: остаются только флаги.
1.3. Идея: флаги — память о результате
Два триггера помнят, каким был результат: Z — «получился ноль», C — «был перенос из старшего разряда» (у вычитания C = 1 значит «заёма не было», A ≥ B). По флагам программа потом будет решать, куда идти дальше.
1.4. Сборка
Новый проект. Нужны вентили NOT, NAND, NOR, AND, OR, XOR:
- уже есть в библиотеке — бери;
- собрать с нуля из транзисторов — урок 0;
- сразу к делу — вставь урок 0 (
Cmd+I, только определения чипов).
| Код | ir15…ir12 | Операция | Что делает |
|---|---|---|---|
| 0 | 0000 | LD | A ← B |
| 1 | 0001 | ST | записать A в память (урок 3) |
| 2 | 0010 | ADD | A ← A + B |
| 3 | 0011 | ADC | A ← A + B + C |
| 4 | 0100 | SUB | A ← A − B |
| 5 | 0101 | AND | A ← A И B |
| 6 | 0110 | OR | A ← A ИЛИ B |
| 7 | 0111 | XOR | A ← A ИСКЛ-ИЛИ B |
| 8 | 1000 | CMP | как SUB, A не меняется |
| 9–15 | 1001–1111 | переходы | урок 2 и 4 |
Два флага помнят, каким был результат: Z — ноль, C — перенос из старшего разряда.
Шаг 1. Чип SRLatch — защёлка: два NOR крест-накрест
Если SRLatch уже есть в библиотеке (из «Фрактальной машины» или «Памяти на транзисторах») — шаг пропусти.
| Деталь | Нога | Метка |
|---|---|---|
| Порт входа | выход | R |
| Порт входа | выход | S |
| Порт выхода | вход | Q |
| Порт выхода | вход | nQ |
| NOR | I0 I1 O0 | R nQ Q |
| NOR | I0 I1 O0 | S Q nQ |
Ctrl+G → имя SRLatch. Ноги: входы R, S; выходы Q, nQ.
Шаг 2. Чип DLatch — защёлка с разрешением: EN = 1 — Q повторяет D
Если DLatch уже есть в библиотеке (из «Фрактальной машины» или «Памяти на транзисторах») — шаг пропусти.
| Деталь | Нога | Метка |
|---|---|---|
| Порт входа | выход | D |
| Порт входа | выход | EN |
| Порт выхода | вход | Q |
| Порт выхода | вход | nQ |
| NOT | I0 O0 | D nD |
| AND | I0 I1 O0 | D EN setD |
| AND | I0 I1 O0 | nD EN rstD |
| SRLatch | S R Q nQ | setD rstD Q nQ |
Ctrl+G → имя DLatch. Ноги: входы D, EN; выходы Q, nQ.
Шаг 3. Чип DFF — триггер: запоминает D в момент, когда CLK 0 → 1
Если DFF уже есть в библиотеке (из «Фрактальной машины») — шаг пропусти.
| Деталь | Нога | Метка |
|---|---|---|
| Порт входа | выход | D |
| Порт входа | выход | CLK |
| Порт выхода | вход | Q |
| Порт выхода | вход | nQ |
| NOT | I0 O0 | CLK nCLK |
| DLatch | D EN Q | D nCLK mid |
| DLatch | D EN Q nQ | mid CLK Q nQ |
Ctrl+G → имя DFF. Ноги: входы D, CLK; выходы Q, nQ.
Шаг 4. Чип MUX2 — выбор из двух: S = 0 → A, S = 1 → B
Если MUX2 уже есть в библиотеке (из «Часов и игры») — шаг пропусти.
| Деталь | Нога | Метка |
|---|---|---|
| Порт входа | выход | A |
| Порт входа | выход | B |
| Порт входа | выход | S |
| Порт выхода | вход | Y |
| NOT | I0 O0 | S nS |
| NAND | I0 I1 O0 | A nS na |
| NAND | I0 I1 O0 | B S nb |
| NAND | I0 I1 O0 | na nb Y |
Ctrl+G → имя MUX2. Ноги: входы A, B, S; выходы Y.
Шаг 5. Чип RBIT — бит регистра: LD = 1 — запомнить D на фронте, nR = 0 — запомнить 0
| Деталь | Нога | Метка |
|---|---|---|
| Порт входа | выход | D |
| Порт входа | выход | LD |
| Порт входа | выход | nR |
| Порт входа | выход | CLK |
| Порт выхода | вход | Q |
| MUX2 | A B S Y | Q D LD m |
| AND | I0 I1 O0 | m nR d |
| DFF | D CLK Q | d CLK Q |
Ctrl+G → имя RBIT. Ноги: входы D, LD, nR, CLK; выходы Q.
Шаг 6. Чип FA — полный сумматор одного разряда
Если FA уже есть в библиотеке (из «Как считает процессор» или «Часов и игры») — шаг пропусти.
| Деталь | Нога | Метка |
|---|---|---|
| Порт входа | выход | A |
| Порт входа | выход | B |
| Порт входа | выход | CI |
| Порт выхода | вход | S |
| Порт выхода | вход | CO |
| XOR | I0 I1 O0 | A B p |
| XOR | I0 I1 O0 | p CI S |
| AND | I0 I1 O0 | A B g |
| AND | I0 I1 O0 | p CI pc |
| OR | I0 I1 O0 | g pc CO |
Ctrl+G → имя FA. Ноги: входы A, B, CI; выходы S, CO.
Шаг 7. Чип AND4 — И на 4 входа
Если AND4 уже есть в библиотеке (из «Часов и игры») — шаг пропусти.
| Деталь | Нога | Метка |
|---|---|---|
| Порт входа | выход | A |
| Порт входа | выход | B |
| Порт входа | выход | C |
| Порт входа | выход | D |
| Порт выхода | вход | Y |
| AND | I0 I1 O0 | A B ab |
| AND | I0 I1 O0 | ab C abc |
| AND | I0 I1 O0 | abc D Y |
Ctrl+G → имя AND4. Ноги: входы A, B, C, D; выходы Y.
Шаг 8. Чип OR4 — ИЛИ на 4 входа
Если OR4 уже есть в библиотеке (из «Своего процессора…») — шаг пропусти.
| Деталь | Нога | Метка |
|---|---|---|
| Порт входа | выход | A |
| Порт входа | выход | B |
| Порт входа | выход | C |
| Порт входа | выход | D |
| Порт выхода | вход | Y |
| OR | I0 I1 O0 | A B ab |
| OR | I0 I1 O0 | C D cd |
| OR | I0 I1 O0 | ab cd Y |
Ctrl+G → имя OR4. Ноги: входы A, B, C, D; выходы Y.
Шаг 9. Чип OR8 — ИЛИ на 8 входов
| Деталь | Нога | Метка |
|---|---|---|
| Порт входа | выход | A |
| Порт входа | выход | B |
| Порт входа | выход | C |
| Порт входа | выход | D |
| Порт входа | выход | E |
| Порт входа | выход | F |
| Порт входа | выход | G |
| Порт входа | выход | H |
| Порт выхода | вход | Y |
| OR4 | A B C D Y | A B C D lo |
| OR4 | A B C D Y | E F G H hi |
| OR | I0 I1 O0 | lo hi Y |
Ctrl+G → имя OR8. Ноги: входы A, B, C, D, E, F, G, H; выходы Y.
Шаг 10. Чип DEC16 — дешифратор 4 → 16: горит ровно один провод
Если DEC16 уже есть в библиотеке (из «Своего процессора…») — шаг пропусти.
| Деталь | Нога | Метка |
|---|---|---|
| Порт входа | выход | I0 |
| Порт входа | выход | I1 |
| Порт входа | выход | I2 |
| Порт входа | выход | I3 |
| Порт выхода | вход | Y0 |
| Порт выхода | вход | Y1 |
| Порт выхода | вход | Y2 |
| Порт выхода | вход | Y3 |
| Порт выхода | вход | Y4 |
| Порт выхода | вход | Y5 |
| Порт выхода | вход | Y6 |
| Порт выхода | вход | Y7 |
| Порт выхода | вход | Y8 |
| Порт выхода | вход | Y9 |
| Порт выхода | вход | Y10 |
| Порт выхода | вход | Y11 |
| Порт выхода | вход | Y12 |
| Порт выхода | вход | Y13 |
| Порт выхода | вход | Y14 |
| Порт выхода | вход | Y15 |
| NOT | I0 O0 | I0 n0 |
| NOT | I0 O0 | I1 n1 |
| NOT | I0 O0 | I2 n2 |
| NOT | I0 O0 | I3 n3 |
| AND4 | A B C D Y | n3 n2 n1 n0 Y0 |
| AND4 | A B C D Y | n3 n2 n1 I0 Y1 |
| AND4 | A B C D Y | n3 n2 I1 n0 Y2 |
| AND4 | A B C D Y | n3 n2 I1 I0 Y3 |
| AND4 | A B C D Y | n3 I2 n1 n0 Y4 |
| AND4 | A B C D Y | n3 I2 n1 I0 Y5 |
| AND4 | A B C D Y | n3 I2 I1 n0 Y6 |
| AND4 | A B C D Y | n3 I2 I1 I0 Y7 |
| AND4 | A B C D Y | I3 n2 n1 n0 Y8 |
| AND4 | A B C D Y | I3 n2 n1 I0 Y9 |
| AND4 | A B C D Y | I3 n2 I1 n0 Y10 |
| AND4 | A B C D Y | I3 n2 I1 I0 Y11 |
| AND4 | A B C D Y | I3 I2 n1 n0 Y12 |
| AND4 | A B C D Y | I3 I2 n1 I0 Y13 |
| AND4 | A B C D Y | I3 I2 I1 n0 Y14 |
| AND4 | A B C D Y | I3 I2 I1 I0 Y15 |
Ctrl+G → имя DEC16. Ноги: входы I0, I1, I2, I3; выходы Y0, Y1, Y2, Y3, Y4, Y5, Y6, Y7, Y8, Y9, Y10, Y11, Y12, Y13, Y14, Y15.
Шаг 11. Пульт: код операции, число, такт, сброс
Четыре тумблера ir12–ir15 — код операции (как будет в слове ПЗУ), восемь bv0–bv7 — число. Кнопка CLK — такт: нажал — выполнилась одна операция. Тумблер RST — сброс: пока включён, нажатие CLK кладёт 0 в A, C, Z.
| Деталь | Нога | Метка |
|---|---|---|
| Power | выход | VCC |
| Ground | выход | GND |
| Input (тумблер) | выход | ir12 |
| Input (тумблер) | выход | ir13 |
| Input (тумблер) | выход | ir14 |
| Input (тумблер) | выход | ir15 |
| Input (тумблер) | выход | bv0 |
| Input (тумблер) | выход | bv1 |
| Input (тумблер) | выход | bv2 |
| Input (тумблер) | выход | bv3 |
| Input (тумблер) | выход | bv4 |
| Input (тумблер) | выход | bv5 |
| Input (тумблер) | выход | bv6 |
| Input (тумблер) | выход | bv7 |
| Button (кнопка) | выход | CLK |
| Input (тумблер) | выход | RST |
| NOT | I0 O0 | RST nR |
Шаг 12. Дешифратор и управление
DEC16 зажигает провод операции. Дальше — кто что пишет: wA — пишется A (коды 0–7, кроме ST); wZ — флаг Z (они же и CMP); wC — флаг C (сложения, вычитание, CMP); sub — вычитание (SUB, CMP).
| Деталь | Нога | Метка |
|---|---|---|
| DEC16 | I0 I1 I2 I3 Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 Y8 Y9 Y10 Y11 Y12 Y13 Y14 Y15 | ir12 ir13 ir14 ir15 oLD oST oADD oADC oSUB oAND oOR oXOR oCMP oJMP oJZ oJNZ oJC oJNC oCALL oRET |
| NOR | I0 I1 O0 | ir15 oST wA |
| OR | I0 I1 O0 | wA oCMP wZ |
| OR4 | A B C D Y | oADD oADC oSUB oCMP wC |
| OR | I0 I1 O0 | oSUB oCMP sub |
Шаг 13. Сумматор: ADD, ADC, SUB, CMP
Вычитание — сложение с перевёрнутым числом и единицей: A + НЕ B + 1. XOR с sub переворачивает биты, единица приходит переносом cin. ADC прибавляет перенос прошлой операции (fC).
| Деталь | Нога | Метка |
|---|---|---|
| XOR | I0 I1 O0 | bv0 sub bx0 |
| XOR | I0 I1 O0 | bv1 sub bx1 |
| XOR | I0 I1 O0 | bv2 sub bx2 |
| XOR | I0 I1 O0 | bv3 sub bx3 |
| XOR | I0 I1 O0 | bv4 sub bx4 |
| XOR | I0 I1 O0 | bv5 sub bx5 |
| XOR | I0 I1 O0 | bv6 sub bx6 |
| XOR | I0 I1 O0 | bv7 sub bx7 |
| AND | I0 I1 O0 | oADC fC adcC |
| OR | I0 I1 O0 | sub adcC cin |
| FA | A B CI S CO | acc0 bx0 cin sm0 c1 |
| FA | A B CI S CO | acc1 bx1 c1 sm1 c2 |
| FA | A B CI S CO | acc2 bx2 c2 sm2 c3 |
| FA | A B CI S CO | acc3 bx3 c3 sm3 c4 |
| FA | A B CI S CO | acc4 bx4 c4 sm4 c5 |
| FA | A B CI S CO | acc5 bx5 c5 sm5 c6 |
| FA | A B CI S CO | acc6 bx6 c6 sm6 c7 |
| FA | A B CI S CO | acc7 bx7 c7 sm7 cout |
Шаг 14. Логика: AND, OR, XOR
| Деталь | Нога | Метка |
|---|---|---|
| AND | I0 I1 O0 | acc0 bv0 la0 |
| AND | I0 I1 O0 | acc1 bv1 la1 |
| AND | I0 I1 O0 | acc2 bv2 la2 |
| AND | I0 I1 O0 | acc3 bv3 la3 |
| AND | I0 I1 O0 | acc4 bv4 la4 |
| AND | I0 I1 O0 | acc5 bv5 la5 |
| AND | I0 I1 O0 | acc6 bv6 la6 |
| AND | I0 I1 O0 | acc7 bv7 la7 |
| OR | I0 I1 O0 | acc0 bv0 lo0 |
| OR | I0 I1 O0 | acc1 bv1 lo1 |
| OR | I0 I1 O0 | acc2 bv2 lo2 |
| OR | I0 I1 O0 | acc3 bv3 lo3 |
| OR | I0 I1 O0 | acc4 bv4 lo4 |
| OR | I0 I1 O0 | acc5 bv5 lo5 |
| OR | I0 I1 O0 | acc6 bv6 lo6 |
| OR | I0 I1 O0 | acc7 bv7 lo7 |
| XOR | I0 I1 O0 | acc0 bv0 lx0 |
| XOR | I0 I1 O0 | acc1 bv1 lx1 |
| XOR | I0 I1 O0 | acc2 bv2 lx2 |
| XOR | I0 I1 O0 | acc3 bv3 lx3 |
| XOR | I0 I1 O0 | acc4 bv4 lx4 |
| XOR | I0 I1 O0 | acc5 bv5 lx5 |
| XOR | I0 I1 O0 | acc6 bv6 lx6 |
| XOR | I0 I1 O0 | acc7 bv7 lx7 |
Шаг 15. Выбор результата
Цепочка выборов: сумма → XOR → OR → AND → число как есть (LD). Горит провод операции — её результат проходит дальше, остальные — мимо.
| Деталь | Нога | Метка |
|---|---|---|
| MUX2 | A B S Y | sm0 lx0 oXOR r1_0 |
| MUX2 | A B S Y | sm1 lx1 oXOR r1_1 |
| MUX2 | A B S Y | sm2 lx2 oXOR r1_2 |
| MUX2 | A B S Y | sm3 lx3 oXOR r1_3 |
| MUX2 | A B S Y | sm4 lx4 oXOR r1_4 |
| MUX2 | A B S Y | sm5 lx5 oXOR r1_5 |
| MUX2 | A B S Y | sm6 lx6 oXOR r1_6 |
| MUX2 | A B S Y | sm7 lx7 oXOR r1_7 |
| MUX2 | A B S Y | r1_0 lo0 oOR r2_0 |
| MUX2 | A B S Y | r1_1 lo1 oOR r2_1 |
| MUX2 | A B S Y | r1_2 lo2 oOR r2_2 |
| MUX2 | A B S Y | r1_3 lo3 oOR r2_3 |
| MUX2 | A B S Y | r1_4 lo4 oOR r2_4 |
| MUX2 | A B S Y | r1_5 lo5 oOR r2_5 |
| MUX2 | A B S Y | r1_6 lo6 oOR r2_6 |
| MUX2 | A B S Y | r1_7 lo7 oOR r2_7 |
| MUX2 | A B S Y | r2_0 la0 oAND r3_0 |
| MUX2 | A B S Y | r2_1 la1 oAND r3_1 |
| MUX2 | A B S Y | r2_2 la2 oAND r3_2 |
| MUX2 | A B S Y | r2_3 la3 oAND r3_3 |
| MUX2 | A B S Y | r2_4 la4 oAND r3_4 |
| MUX2 | A B S Y | r2_5 la5 oAND r3_5 |
| MUX2 | A B S Y | r2_6 la6 oAND r3_6 |
| MUX2 | A B S Y | r2_7 la7 oAND r3_7 |
| MUX2 | A B S Y | r3_0 bv0 oLD res0 |
| MUX2 | A B S Y | r3_1 bv1 oLD res1 |
| MUX2 | A B S Y | r3_2 bv2 oLD res2 |
| MUX2 | A B S Y | r3_3 bv3 oLD res3 |
| MUX2 | A B S Y | r3_4 bv4 oLD res4 |
| MUX2 | A B S Y | r3_5 bv5 oLD res5 |
| MUX2 | A B S Y | r3_6 bv6 oLD res6 |
| MUX2 | A B S Y | r3_7 bv7 oLD res7 |
Шаг 16. Регистр A и флаги Z, C
Z — «результат ноль»: ИЛИ всех 8 бит, перевёрнутое. C — перенос из старшего разряда (у вычитания: 1 = «не было заёма», A ≥ B).
| Деталь | Нога | Метка |
|---|---|---|
| RBIT | D LD nR CLK Q | res0 wA nR CLK acc0 |
| RBIT | D LD nR CLK Q | res1 wA nR CLK acc1 |
| RBIT | D LD nR CLK Q | res2 wA nR CLK acc2 |
| RBIT | D LD nR CLK Q | res3 wA nR CLK acc3 |
| RBIT | D LD nR CLK Q | res4 wA nR CLK acc4 |
| RBIT | D LD nR CLK Q | res5 wA nR CLK acc5 |
| RBIT | D LD nR CLK Q | res6 wA nR CLK acc6 |
| RBIT | D LD nR CLK Q | res7 wA nR CLK acc7 |
| OR8 | A B C D E F G H Y | res0 res1 res2 res3 res4 res5 res6 res7 nz |
| NOT | I0 O0 | nz zr |
| RBIT | D LD nR CLK Q | zr wZ nR CLK fZ |
| RBIT | D LD nR CLK Q | cout wC nR CLK fC |
Шаг 17. Табло и лампы
Табло показывает A (0–255). Лампы — флаги Z и C.
| Деталь | Нога | Метка |
|---|---|---|
| Display | ⚙ | ширина 8, DEC, шина acc |
| LED | вход | fZ |
| LED | вход | fC |
1.5. Проверка
| Операция | ir15…ir12 | bv7…bv0 (число) | Табло A | C | Z | Что видно |
|---|---|---|---|---|---|---|
| сброс | — | — | 0 | 0 | 0 | RST включён, нажать CLK, RST выключить |
| LD | 0000 | 1100 1000 (200) | 200 | 0 | 0 | взять число |
| ADD | 0010 | 0110 0100 (100) | 44 | 1 | 0 | 200 + 100 = 300 — не влезает в 8 бит: 300 − 256 = 44, C = 1 |
| ADC | 0011 | 0000 0000 (0) | 45 | 0 | 0 | 44 + 0 + C = 45: перенос прибавился |
| SUB | 0100 | 0010 1101 (45) | 0 | 1 | 1 | 45 − 45 = 0 → Z = 1; C = 1: заёма не было |
| SUB | 0100 | 0000 0001 (1) | 255 | 0 | 0 | 0 − 1 = 255: заём, C = 0 |
| CMP | 1000 | 1111 1111 (255) | 255 | 1 | 1 | как SUB, но A не меняется: 255 − 255 = 0 → Z = 1 |
| AND | 0101 | 0000 1111 (15) | 15 | 1 | 0 | оставить младшие 4 бита |
| OR | 0110 | 1111 0000 (240) | 255 | 1 | 0 | включить старшие 4 бита |
| XOR | 0111 | 1010 1010 (170) | 85 | 1 | 0 | перевернуть биты 1010 1010 |
| ST | 0001 | 0000 0111 (7) | 85 | 1 | 0 | ST (код 1) A не трогает |
| LD | 0000 | 0000 0000 (0) | 0 | 1 | 1 | LD 0 → Z = 1; C не меняется |
Каждая строка — поставить тумблеры и один раз нажать CLK. В колонках тумблеров слева — старший, 1 — включён.
LD,AND,OR,XORменяют толькоZ, лампаCгорит как горела — так и должно быть.- Коды 9–15 (переходы) пока ничего не делают: им нужен счётчик команд — урок 2.
RSTне мгновенный: сброс случается по нажатиюCLK(сброс синхронный, как у всей карты).
Если не так:
Aне меняется совсем — проверьLDуRBIT(меткаwA) иCLK.- Неверны только старшие биты суммы — цепочка переносов:
CIкаждогоFAна меткеCOпредыдущего (c1…c7). SUBприбавляет вместо вычитания —subна втором входеXORиcin.
В чип не сворачивать — дальше к этой схеме добавятся ПЗУ, память и порт.
Вставка урока 1 (Cmd+I)
Нужны вентили NOT, NAND, NOR, AND, OR, XOR (урок 0 или его вставка).
# Урок 1 — АЛУ и регистр A: калькулятор на тумблерах.# Вставка: Cmd+I в новый проект, где есть вентили NOT, NAND, NOR, AND, OR, XOR (урок 0 или его вставка).# Если чип уже есть в библиотеке — удали его блок chip из вставки. # ---------- SRLatch ----------chip SRLatch { portIn(R) portIn(S) portOut(Q) portOut(nQ) NOR(R, nQ, Q) NOR(S, Q, nQ)} # ---------- DLatch ----------chip DLatch { portIn(D) portIn(EN) portOut(Q) portOut(nQ) NOT(D, nD) AND(D, EN, setD) AND(nD, EN, rstD) SRLatch(S=setD, R=rstD, Q=Q, nQ=nQ)} # ---------- DFF ----------chip DFF { portIn(D) portIn(CLK) portOut(Q) portOut(nQ) NOT(CLK, nCLK) DLatch(D=D, EN=nCLK, Q=mid) DLatch(D=mid, EN=CLK, Q=Q, nQ=nQ)} # ---------- MUX2 ----------chip MUX2 { portIn(A) portIn(B) portIn(S) portOut(Y) NOT(S, nS) NAND(A, nS, na) NAND(B, S, nb) NAND(na, nb, Y)} # ---------- RBIT ----------chip RBIT { portIn(D) portIn(LD) portIn(nR) portIn(CLK) portOut(Q) MUX2(A=Q, B=D, S=LD, Y=m) AND(m, nR, d) DFF(D=d, CLK=CLK, Q=Q)} # ---------- FA ----------chip FA { portIn(A) portIn(B) portIn(CI) portOut(S) portOut(CO) XOR(A, B, p) XOR(p, CI, S) AND(A, B, g) AND(p, CI, pc) OR(g, pc, CO)} # ---------- AND4 ----------chip AND4 { portIn(A) portIn(B) portIn(C) portIn(D) portOut(Y) AND(A, B, ab) AND(ab, C, abc) AND(abc, D, Y)} # ---------- OR4 ----------chip OR4 { portIn(A) portIn(B) portIn(C) portIn(D) portOut(Y) OR(A, B, ab) OR(C, D, cd) OR(ab, cd, Y)} # ---------- OR8 ----------chip OR8 { portIn(A) portIn(B) portIn(C) portIn(D) portIn(E) portIn(F) portIn(G) portIn(H) portOut(Y) OR4(A=A, B=B, C=C, D=D, Y=lo) OR4(A=E, B=F, C=G, D=H, Y=hi) OR(lo, hi, Y)} # ---------- DEC16 ----------chip DEC16 { portIn(I0) portIn(I1) portIn(I2) portIn(I3) portOut(Y0) portOut(Y1) portOut(Y2) portOut(Y3) portOut(Y4) portOut(Y5) portOut(Y6) portOut(Y7) portOut(Y8) portOut(Y9) portOut(Y10) portOut(Y11) portOut(Y12) portOut(Y13) portOut(Y14) portOut(Y15) NOT(I0, n0) NOT(I1, n1) NOT(I2, n2) NOT(I3, n3) AND4(n3, n2, n1, n0, Y0) AND4(n3, n2, n1, I0, Y1) AND4(n3, n2, I1, n0, Y2) AND4(n3, n2, I1, I0, Y3) AND4(n3, I2, n1, n0, Y4) AND4(n3, I2, n1, I0, Y5) AND4(n3, I2, I1, n0, Y6) AND4(n3, I2, I1, I0, Y7) AND4(I3, n2, n1, n0, Y8) AND4(I3, n2, n1, I0, Y9) AND4(I3, n2, I1, n0, Y10) AND4(I3, n2, I1, I0, Y11) AND4(I3, I2, n1, n0, Y12) AND4(I3, I2, n1, I0, Y13) AND4(I3, I2, I1, n0, Y14) AND4(I3, I2, I1, I0, Y15)} # ---------- Пульт: код операции, число, такт, сброс ----------power(Out=VCC)ground(Out=GND)input(Out=ir12)input(Out=ir13)input(Out=ir14)input(Out=ir15)input(Out=bv0)input(Out=bv1)input(Out=bv2)input(Out=bv3)input(Out=bv4)input(Out=bv5)input(Out=bv6)input(Out=bv7)button(Out=CLK)input(Out=RST)NOT(RST, nR) # ---------- Дешифратор и управление ----------DEC16(I0=ir12, I1=ir13, I2=ir14, I3=ir15, Y0=oLD, Y1=oST, Y2=oADD, Y3=oADC, Y4=oSUB, Y5=oAND, Y6=oOR, Y7=oXOR, Y8=oCMP, Y9=oJMP, Y10=oJZ, Y11=oJNZ, Y12=oJC, Y13=oJNC, Y14=oCALL, Y15=oRET)NOR(ir15, oST, wA)OR(wA, oCMP, wZ)OR4(A=oADD, B=oADC, C=oSUB, D=oCMP, Y=wC)OR(oSUB, oCMP, sub) # ---------- Сумматор: ADD, ADC, SUB, CMP ----------XOR(bv0, sub, bx0)XOR(bv1, sub, bx1)XOR(bv2, sub, bx2)XOR(bv3, sub, bx3)XOR(bv4, sub, bx4)XOR(bv5, sub, bx5)XOR(bv6, sub, bx6)XOR(bv7, sub, bx7)AND(oADC, fC, adcC)OR(sub, adcC, cin)FA(A=acc0, B=bx0, CI=cin, S=sm0, CO=c1)FA(A=acc1, B=bx1, CI=c1, S=sm1, CO=c2)FA(A=acc2, B=bx2, CI=c2, S=sm2, CO=c3)FA(A=acc3, B=bx3, CI=c3, S=sm3, CO=c4)FA(A=acc4, B=bx4, CI=c4, S=sm4, CO=c5)FA(A=acc5, B=bx5, CI=c5, S=sm5, CO=c6)FA(A=acc6, B=bx6, CI=c6, S=sm6, CO=c7)FA(A=acc7, B=bx7, CI=c7, S=sm7, CO=cout) # ---------- Логика: AND, OR, XOR ----------AND(acc0, bv0, la0)AND(acc1, bv1, la1)AND(acc2, bv2, la2)AND(acc3, bv3, la3)AND(acc4, bv4, la4)AND(acc5, bv5, la5)AND(acc6, bv6, la6)AND(acc7, bv7, la7)OR(acc0, bv0, lo0)OR(acc1, bv1, lo1)OR(acc2, bv2, lo2)OR(acc3, bv3, lo3)OR(acc4, bv4, lo4)OR(acc5, bv5, lo5)OR(acc6, bv6, lo6)OR(acc7, bv7, lo7)XOR(acc0, bv0, lx0)XOR(acc1, bv1, lx1)XOR(acc2, bv2, lx2)XOR(acc3, bv3, lx3)XOR(acc4, bv4, lx4)XOR(acc5, bv5, lx5)XOR(acc6, bv6, lx6)XOR(acc7, bv7, lx7) # ---------- Выбор результата ----------MUX2(A=sm0, B=lx0, S=oXOR, Y=r1_0)MUX2(A=sm1, B=lx1, S=oXOR, Y=r1_1)MUX2(A=sm2, B=lx2, S=oXOR, Y=r1_2)MUX2(A=sm3, B=lx3, S=oXOR, Y=r1_3)MUX2(A=sm4, B=lx4, S=oXOR, Y=r1_4)MUX2(A=sm5, B=lx5, S=oXOR, Y=r1_5)MUX2(A=sm6, B=lx6, S=oXOR, Y=r1_6)MUX2(A=sm7, B=lx7, S=oXOR, Y=r1_7)MUX2(A=r1_0, B=lo0, S=oOR, Y=r2_0)MUX2(A=r1_1, B=lo1, S=oOR, Y=r2_1)MUX2(A=r1_2, B=lo2, S=oOR, Y=r2_2)MUX2(A=r1_3, B=lo3, S=oOR, Y=r2_3)MUX2(A=r1_4, B=lo4, S=oOR, Y=r2_4)MUX2(A=r1_5, B=lo5, S=oOR, Y=r2_5)MUX2(A=r1_6, B=lo6, S=oOR, Y=r2_6)MUX2(A=r1_7, B=lo7, S=oOR, Y=r2_7)MUX2(A=r2_0, B=la0, S=oAND, Y=r3_0)MUX2(A=r2_1, B=la1, S=oAND, Y=r3_1)MUX2(A=r2_2, B=la2, S=oAND, Y=r3_2)MUX2(A=r2_3, B=la3, S=oAND, Y=r3_3)MUX2(A=r2_4, B=la4, S=oAND, Y=r3_4)MUX2(A=r2_5, B=la5, S=oAND, Y=r3_5)MUX2(A=r2_6, B=la6, S=oAND, Y=r3_6)MUX2(A=r2_7, B=la7, S=oAND, Y=r3_7)MUX2(A=r3_0, B=bv0, S=oLD, Y=res0)MUX2(A=r3_1, B=bv1, S=oLD, Y=res1)MUX2(A=r3_2, B=bv2, S=oLD, Y=res2)MUX2(A=r3_3, B=bv3, S=oLD, Y=res3)MUX2(A=r3_4, B=bv4, S=oLD, Y=res4)MUX2(A=r3_5, B=bv5, S=oLD, Y=res5)MUX2(A=r3_6, B=bv6, S=oLD, Y=res6)MUX2(A=r3_7, B=bv7, S=oLD, Y=res7) # ---------- Регистр A и флаги Z, C ----------RBIT(D=res0, LD=wA, nR=nR, CLK=CLK, Q=acc0)RBIT(D=res1, LD=wA, nR=nR, CLK=CLK, Q=acc1)RBIT(D=res2, LD=wA, nR=nR, CLK=CLK, Q=acc2)RBIT(D=res3, LD=wA, nR=nR, CLK=CLK, Q=acc3)RBIT(D=res4, LD=wA, nR=nR, CLK=CLK, Q=acc4)RBIT(D=res5, LD=wA, nR=nR, CLK=CLK, Q=acc5)RBIT(D=res6, LD=wA, nR=nR, CLK=CLK, Q=acc6)RBIT(D=res7, LD=wA, nR=nR, CLK=CLK, Q=acc7)OR8(A=res0, B=res1, C=res2, D=res3, E=res4, F=res5, G=res6, H=res7, Y=nz)NOT(nz, zr)RBIT(D=zr, LD=wZ, nR=nR, CLK=CLK, Q=fZ)RBIT(D=cout, LD=wC, nR=nR, CLK=CLK, Q=fC) # ---------- Табло и лампы ----------display{bits=8, base="DEC", busSource="acc"}()led(fZ)led(fC)Не получается? Что-то не работает →