Урок 0. Вентили из транзисторов: для тех, кто начинает с нуля

В картинках

Этот урок — по желанию. Если вентили NOT, NAND, NOR, AND, OR, XOR уже есть в библиотеке из другого набора серии — переходи сразу к уроку 1. Если хочешь собрать всё сам, с транзисторов, — начни здесь: шесть вентилей, из которых дальше строится вся фрактальная машина.


0.1. Идея: транзистор — выключатель

В симуляторе транзистор — выключатель с тремя ногами: затвор G управляет, проводит ли канал между верхней и нижней ногой. nmos проводит при G = 1, pmos — при G = 0. Пара «P сверху к VCC, N снизу к GND» с общим затвором — это NOT: на выходе всегда противоположное входу. Из таких пар собираются NAND и NOR, а из них — все остальные.

0.2. Сборка

Урок для тех, кто собирает всё с нуля. Если вентили NOT, NAND, NOR, AND, OR, XOR уже есть в библиотеке (из наборов «Знакогенератор», «Как считает процессор» или «Часы и игра из вентилей») — этот урок можно пропустить.

Новый пустой проект. Сначала поставь питание: Power → метка VCC, Ground → метка GND (внутри чипов они общие). Каждый вентиль собирается на пустом месте холста, потом выделить его детали с метками → Ctrl+G → в библиотеке двойной клик по имени → имя чипа. Транзистор: затвор G слева, канал — верх и низ (равноправны); pmos проводит при затворе 0, nmos — при 1.

Если есть вентили из набора «Часы и игра из вентилей» — тоже подойдут: у них ноги 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.

0.3. Проверка

Выдели чип в библиотеке или на холсте и нажми T — откроется таблица истинности. Сверь:

ЧипO0 при I1 I0 = 00 01 10 11
NOT(один вход I0) 1 0
NAND1 1 1 0
NOR1 0 0 0
AND0 0 0 1
OR0 1 1 1
XOR0 1 1 0

Вставка урока 0 (Cmd+I)

Вставка содержит только определения чипов: вентили появятся в библиотеке, холст не изменится.

# Урок 0 — вентили серии из транзисторов: NOT, NAND, NOR, AND, OR, XOR. Только определения чипов — холст не меняется.# Вставка: 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)}

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