Урок 1. Точка ПЗУ: транзистор — это бит
В картинкахПосле этого урока у вас будет одна точка постоянной памяти — ПЗУ — и вы увидите, как она хранит бит без питания и без защёлок: бит — это просто стоит транзистор или нет. Заодно соберём два вентиля набора, NOT и AND, — из транзисторов, как всё в этом наборе.
1.1. Идея: бит, который нельзя стереть
В памяти из защёлок бит живёт, пока есть питание, и его можно переписать. В ПЗУ (постоянном запоминающем устройстве) содержимое задано при изготовлении: в нужном месте ставят транзистор — или не ставят. Так хранили шрифты терминалов, программы калькуляторов и игр.
Одна точка ПЗУ — пересечение двух проводов:
- строка — провод выбора: на него подаём 1, когда хотим прочитать;
- столбец — провод бита: резистор всё время слабо тянет его к 1;
- транзистор (если он есть) соединяет столбец с землёй, когда строка выбрана, и прижимает столбец к 0 — он сильнее резистора.
Выбрали строку: где транзистор есть — столбец 0, где нет — 1. NOT на выходе переворачивает, и получается привычное правило: есть транзистор — 1, нет транзистора — 0.
Резистор — деталь с двумя ногами, «слабый провод»: сигнал проходит через него, но уступает любому настоящему выходу. В палитре — пустой прямоугольник, клавиша X.
1.2. Сборка
Новый пустой проект. Все соединения — метками: одинаковое имя — один провод.
Шаг 0. Вентили NOT и AND — свои чипы набора
Питание (Power → метка VCC, Ground → метка GND) поставь сразу — внутри чипов VCC/GND общие.
Ставим на пустом месте холста, потом сворачиваем каждый в чип. Транзистор: затвор G слева, канал — верх и низ (равноправны). pmos проводит при затворе 0, nmos — при 1.
NOT (2 транзистора):
| Деталь | Затвор (G) | Канал соединяет |
|---|---|---|
| Порт входа | — | имя I0, выход → I0 |
| pmos | I0 | VCC ↔ O0 |
| nmos | I0 | O0 ↔ GND |
| Порт выхода | — | имя O0, вход ← O0 |
Выделить эти 4 детали (и их метки) → Ctrl+G → в библиотеке двойной клик по имени → NOT.
AND (6 транзисторов): «И-НЕ» в узле n, потом переворот в O0.
| Деталь | Затвор (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 |
Если у тебя уже есть NOT и AND из набора «Часы и игра из вентилей» — бери их: у них ноги A, B, Y, это то же самое, что I0, I1, O0 в таблицах.
Шаг 1. Питание и строка
| Деталь | Метка на выходе |
|---|---|
| Power (VCC) | VCC |
| Ground (GND) | GND |
| Input | s |
Шаг 2. Столбец a — точка есть
| Деталь | Затвор (G) | Ноги / канал соединяют |
|---|---|---|
| Резистор | — | VCC ↔ a |
| nmos | s | a ↔ GND |
| Деталь | I0 (вход) | O0 (выход) |
| NOT | a | Qa |
| Деталь | Вход | |
| LED | Qa | |
Шаг 3. Столбец b — точки нет
| Деталь | Ноги соединяют | |
|---|---|---|
| Резистор | VCC ↔ b | |
| Деталь | I0 (вход) | O0 (выход) |
| NOT | b | Qb |
| Деталь | Вход | |
| LED | Qb |
1.3. Проверка
| Тумблер | Лампа Qa | Лампа Qb | |
|---|---|---|---|
| s = 0 | не горит | не горит | строка не выбрана — молчат обе |
| s = 1 | горит | не горит | выбрана: есть транзистор — 1, нет транзистора — 0 |
Опыт: перенеси транзистор из столбца a в столбец b (канал b ↔ GND) — при s = 1 загорится Qb, а Qa погаснет. Это и есть «перепрошивка»: содержимое ПЗУ — это расстановка транзисторов.
Частая ошибка. Резистор поставлен между столбцом и NOT, а к VCC не подключён. Тогда при закрытом транзисторе столбец никто не тянет — он «висит», и лампа становится оранжевой вместо того, чтобы погаснуть. Одна нога резистора — VCC.
Вставка урока 1 (Cmd+I)
В новый пустой проект: вентили набора и точка ПЗУ.
# Урок 1 — точка ПЗУ: вентили набора NOT и AND, одна строка s и два столбца (a — точка есть, b — нет).# Вставка: Cmd+I в новый пустой проект. # Вентили набора: NOT (2 транзистора) и AND (6 транзисторов). Транзистор: nmos/pmos(затвор, верх, низ).chip NOT { portIn(I0) portOut(O0) pmos(I0, VCC, O0) nmos(I0, O0, GND)} # AND = «И-НЕ» (два P параллельно сверху, два N последовательно снизу) + NOTchip 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)} power(VCC)ground(GND)input(s) # столбец a: резистор держит 1, транзистор строки прижимает к 0resistor(VCC, a)nmos(s, a, GND)NOT(I0=a, O0=Qa)led(Qa) # столбец b: только резистор — транзистора нетresistor(VCC, b)NOT(I0=b, O0=Qb)led(Qb)Не получается? Что-то не работает →