Урок 1. Вентили и полусумматор: 1 + 1 = 10
В картинкахПосле этого урока две лампы покажут сумму двух битов: 1 + 1 загорится как 10 — «два» в двоичной системе. По дороге соберём из транзисторов все вентили набора: NOT, NAND, NOR, AND, OR и XOR. Дальше весь набор строится только из них.
1.1. Идея: сложить один разряд
У двоичного разряда всего две цифры, поэтому сложение одного разряда — это четыре случая:
| A | B | перенос C | сумма S |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 |
| 1 | 0 | 0 | 1 |
| 1 | 1 | 1 | 0 |
Посмотри на столбцы по отдельности:
S = A ⊕ B— горит, когда горит ровно один вход. Это «исключающее ИЛИ»,XOR;C = A · B— горит, когда горят оба. ЭтоAND.
Узел из XOR и AND называется полусумматор (HA, half adder). «Полу» — потому что он складывает два бита, но не умеет принять перенос от соседнего разряда. Это сделает полный сумматор в уроке 2.
XOR в наборе собран из готовых вентилей: «хотя бы один» (OR) и одновременно «не оба» (NAND) — XOR = AND(OR, NAND).
1.2. Сборка
Новый пустой проект. Сначала поставь питание: Power → метка VCC, Ground → метка GND (внутри чипов они общие). Каждый вентиль собирается на пустом месте холста, потом выделить его детали с метками → Ctrl+G → в библиотеке двойной клик по имени → имя чипа. Транзистор: затвор G слева, канал — верх и низ (равноправны); pmos проводит при затворе 0, nmos — при 1.
Если NOT и AND уже есть из набора «Знакогенератор» — бери их, они такие же. Если есть вентили из набора «Часы и игра из вентилей» — тоже подойдут: у них ноги A, B, Y — это то же, что I0, I1, O0 в таблицах.
Шаг 1. NOT — переворот: 1 → 0, 0 → 1
| Деталь | Затвор (G) | Канал соединяет |
|---|---|---|
| Порт входа | — | имя I0, выход → I0 |
| pmos | I0 | VCC ↔ O0 |
| nmos | I0 | O0 ↔ GND |
| Порт выхода | — | имя O0, вход ← O0 |
Ctrl+G → имя NOT.
Частая ошибка. Перепутать N и P: если сверху (к VCC) стоит N, а снизу (к GND) — P, вентиль не переворачивает, а повторяет вход. Сверху всегда P, снизу — N. Тип меняется Alt + щелчком по транзистору (на Mac — ⌥ или ⌘ + щелчок); обычный щелчок тип не трогает.
Шаг 2. NAND — И-НЕ: 0 только когда оба входа 1
| Деталь | Затвор (G) | Канал соединяет |
|---|---|---|
| Порт входа | — | имя I0, выход → I0 |
| Порт входа | — | имя I1, выход → I1 |
| pmos | I0 | VCC ↔ O0 |
| pmos | I1 | VCC ↔ O0 |
| nmos | I0 | O0 ↔ mid |
| nmos | I1 | mid ↔ GND |
| Порт выхода | — | имя O0, вход ← O0 |
Ctrl+G → имя NAND.
Шаг 3. NOR — ИЛИ-НЕ: 1 только когда оба входа 0
| Деталь | Затвор (G) | Канал соединяет |
|---|---|---|
| Порт входа | — | имя I0, выход → I0 |
| Порт входа | — | имя I1, выход → I1 |
| pmos | I0 | VCC ↔ mid |
| pmos | I1 | mid ↔ O0 |
| nmos | I0 | O0 ↔ GND |
| nmos | I1 | O0 ↔ GND |
| Порт выхода | — | имя O0, вход ← O0 |
Ctrl+G → имя NOR.
Шаг 4. AND — И: И-НЕ в узле n, потом переворот
| Деталь | Затвор (G) | Канал соединяет |
|---|---|---|
| Порт входа | — | имя I0, выход → I0 |
| Порт входа | — | имя I1, выход → I1 |
| pmos | I0 | VCC ↔ n |
| pmos | I1 | VCC ↔ n |
| nmos | I0 | n ↔ mid |
| nmos | I1 | mid ↔ GND |
| pmos | n | VCC ↔ O0 |
| nmos | n | O0 ↔ GND |
| Порт выхода | — | имя O0, вход ← O0 |
Ctrl+G → имя AND.
Шаг 5. OR — ИЛИ: ИЛИ-НЕ в узле n, потом переворот
| Деталь | Затвор (G) | Канал соединяет |
|---|---|---|
| Порт входа | — | имя I0, выход → I0 |
| Порт входа | — | имя I1, выход → I1 |
| pmos | I0 | VCC ↔ mid |
| pmos | I1 | mid ↔ n |
| nmos | I0 | n ↔ GND |
| nmos | I1 | n ↔ GND |
| pmos | n | VCC ↔ O0 |
| nmos | n | O0 ↔ GND |
| Порт выхода | — | имя O0, вход ← O0 |
Ctrl+G → имя OR.
Шаг 6. XOR — «хотя бы один, но не оба»
Из готовых вентилей: XOR = AND(OR, NAND).
| Деталь | I0 | I1 | O0 (выход) |
|---|---|---|---|
| Порт входа | — | — | I0 |
| Порт входа | — | — | I1 |
| OR | I0 | I1 | o |
| NAND | I0 | I1 | n |
| AND | o | n | O0 |
| Порт выхода | O0 | — | — |
Ctrl+G → имя XOR.
Шаг 7. HA — полусумматор
Сумма одного разряда S = A ⊕ B и перенос C = A · B.
| Деталь | I0 | I1 | O0 (выход) |
|---|---|---|---|
| Порт входа | — | — | A |
| Порт входа | — | — | B |
| XOR | A | B | S |
| AND | A | B | C |
| Порт выхода | S | — | — |
| Порт выхода | C | — | — |
Ctrl+G → имя HA. Ноги чипа: входы A, B, выходы S, C.
Шаг 8. Холст: тумблеры, полусумматор, лампы
| Деталь | Нога | Метка |
|---|---|---|
| Input | выход | A |
| Input | выход | B |
| HA | A B S C | A B S C |
| LED | вход | S |
| LED | вход | C |
Лампы поставь рядом: C слева, S справа — так они читаются как двоичное число.
1.3. Проверка
| A | B | Лампы C S | Это |
|---|---|---|---|
| 0 | 0 | · · | 0 + 0 = 0 |
| 0 | 1 | · ● | 0 + 1 = 1 |
| 1 | 0 | · ● | 1 + 0 = 1 |
| 1 | 1 | ● · | 1 + 1 = 10 (два) |
Если S горит при 1 + 1 — проверь XOR: его NAND должен давать 0, когда оба входа 1.
Вставка урока 1 (Cmd+I)
Новый пустой проект. Вставка ставит все вентили, полусумматор и стенд урока.
# Урок 1 — вентили набора из транзисторов и полусумматор HA.# Вставка: Cmd+I в новый пустой проект. Транзистор: nmos/pmos(затвор, верх, низ). # --- вентили из транзисторов ---chip NOT { portIn(I0) portOut(O0) pmos(I0, VCC, O0) nmos(I0, O0, GND)} # И-НЕ: два P параллельно сверху, два N последовательно снизуchip NAND { portIn(I0) portIn(I1) portOut(O0) pmos(I0, VCC, O0) pmos(I1, VCC, O0) nmos(I0, O0, mid) nmos(I1, mid, GND)} # ИЛИ-НЕ: два P последовательно сверху, два N параллельно снизуchip NOR { portIn(I0) portIn(I1) portOut(O0) pmos(I0, VCC, mid) pmos(I1, mid, O0) nmos(I0, O0, GND) nmos(I1, O0, GND)} # И = И-НЕ + переворот (6 транзисторов)chip AND { portIn(I0) portIn(I1) portOut(O0) pmos(I0, VCC, n) pmos(I1, VCC, n) nmos(I0, n, mid) nmos(I1, mid, GND) pmos(n, VCC, O0) nmos(n, O0, GND)} # ИЛИ = ИЛИ-НЕ + переворот (6 транзисторов)chip OR { portIn(I0) portIn(I1) portOut(O0) pmos(I0, VCC, mid) pmos(I1, mid, n) nmos(I0, n, GND) nmos(I1, n, GND) pmos(n, VCC, O0) nmos(n, O0, GND)} # исключающее ИЛИ: «хотя бы один, но не оба» = AND(OR, NAND)chip XOR { portIn(I0) portIn(I1) portOut(O0) OR(I0, I1, o) NAND(I0, I1, n) AND(o, n, O0)} # --- полусумматор: сумма одного разряда и перенос ---chip HA { portIn(A) portIn(B) portOut(S) portOut(C) XOR(A, B, S) AND(A, B, C)} # --- на холст: питание, два тумблера, полусумматор, две лампы ---power(VCC)ground(GND)input(A)input(B)HA(A, B, S, C)led(S)led(C)Не получается? Что-то не работает →