Урок 1. Вентили и полусумматор: 1 + 1 = 10

В картинках

После этого урока две лампы покажут сумму двух битов: 1 + 1 загорится как 10 — «два» в двоичной системе. По дороге соберём из транзисторов все вентили набора: NOT, NAND, NOR, AND, OR и XOR. Дальше весь набор строится только из них.


1.1. Идея: сложить один разряд

У двоичного разряда всего две цифры, поэтому сложение одного разряда — это четыре случая:

ABперенос Cсумма S
0000
0101
1001
1110

Посмотри на столбцы по отдельности:

  • S = A ⊕ B — горит, когда горит ровно один вход. Это «исключающее ИЛИ», XOR;
  • C = A · B — горит, когда горят оба. Это AND.

Узел из XOR и AND называется полусумматор (HA, half adder). «Полу» — потому что он складывает два бита, но не умеет принять перенос от соседнего разряда. Это сделает полный сумматор в уроке 2.

A=1B=1XORANDS = 0C = 1CS«10» = два
Полусумматор HA на примере 1 + 1. XOR горит, когда горит ровно один вход, — здесь оба, поэтому сумма S = 0. AND горит, когда горят оба, — перенос C = 1. Лампы C и S рядом читаются как двоичное число 10.

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
pmosI0VCC ↔ O0
nmosI0O0 ↔ 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
pmosI0VCC ↔ O0
pmosI1VCC ↔ O0
nmosI0O0 ↔ mid
nmosI1mid ↔ GND
Порт выхода—имя O0, вход ← O0

Ctrl+G → имя NAND.

Шаг 3. NOR — ИЛИ-НЕ: 1 только когда оба входа 0

ДетальЗатвор (G)Канал соединяет
Порт входа—имя I0, выход → I0
Порт входа—имя I1, выход → I1
pmosI0VCC ↔ mid
pmosI1mid ↔ O0
nmosI0O0 ↔ GND
nmosI1O0 ↔ GND
Порт выхода—имя O0, вход ← O0

Ctrl+G → имя NOR.

Шаг 4. AND — И: И-НЕ в узле n, потом переворот

ДетальЗатвор (G)Канал соединяет
Порт входа—имя I0, выход → I0
Порт входа—имя I1, выход → I1
pmosI0VCC ↔ n
pmosI1VCC ↔ n
nmosI0n ↔ mid
nmosI1mid ↔ GND
pmosnVCC ↔ O0
nmosnO0 ↔ GND
Порт выхода—имя O0, вход ← O0

Ctrl+G → имя AND.

Шаг 5. OR — ИЛИ: ИЛИ-НЕ в узле n, потом переворот

ДетальЗатвор (G)Канал соединяет
Порт входа—имя I0, выход → I0
Порт входа—имя I1, выход → I1
pmosI0VCC ↔ mid
pmosI1mid ↔ n
nmosI0n ↔ GND
nmosI1n ↔ GND
pmosnVCC ↔ O0
nmosnO0 ↔ GND
Порт выхода—имя O0, вход ← O0

Ctrl+G → имя OR.

Шаг 6. XOR — «хотя бы один, но не оба»

Из готовых вентилей: XOR = AND(OR, NAND).

ДетальI0I1O0 (выход)
Порт входа——I0
Порт входа——I1
ORI0I1o
NANDI0I1n
ANDonO0
Порт выходаO0——

Ctrl+G → имя XOR.

Шаг 7. HA — полусумматор

Сумма одного разряда S = A ⊕ B и перенос C = A · B.

ДетальI0I1O0 (выход)
Порт входа——A
Порт входа——B
XORABS
ANDABC
Порт выходаS——
Порт выходаC——

Ctrl+G → имя HA. Ноги чипа: входы A, B, выходы S, C.

Шаг 8. Холст: тумблеры, полусумматор, лампы

ДетальНогаМетка
InputвыходA
InputвыходB
HAA
B
S
C
A
B
S
C
LEDвходS
LEDвходC

Лампы поставь рядом: C слева, S справа — так они читаются как двоичное число.

1.3. Проверка

ABЛампы C SЭто
00· ·0 + 0 = 0
01· ●0 + 1 = 1
10· ●1 + 0 = 1
11● ·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)

Не получается? Что-то не работает →