Урок 1. Точка ПЗУ: транзистор — это бит

В картинках

После этого урока у вас будет одна точка постоянной памяти — ПЗУ — и вы увидите, как она хранит бит без питания и без защёлок: бит — это просто стоит транзистор или нет. Заодно соберём два вентиля набора, NOT и AND, — из транзисторов, как всё в этом наборе.


1.1. Идея: бит, который нельзя стереть

В памяти из защёлок бит живёт, пока есть питание, и его можно переписать. В ПЗУ (постоянном запоминающем устройстве) содержимое задано при изготовлении: в нужном месте ставят транзистор — или не ставят. Так хранили шрифты терминалов, программы калькуляторов и игр.

Одна точка ПЗУ — пересечение двух проводов:

  • строка — провод выбора: на него подаём 1, когда хотим прочитать;
  • столбец — провод бита: резистор всё время слабо тянет его к 1;
  • транзистор (если он есть) соединяет столбец с землёй, когда строка выбрана, и прижимает столбец к 0 — он сильнее резистора.
бит = 1: транзистор естьVCCRblстрока выбрана = 1NGND = 0NOTQ = 1столбец = 0прижал транзисторбит = 0: пустоVCCRblстрока выбрана = 1нет транзистораNOTQ = 0столбец = 1держит резистор
Одна точка ПЗУ. Строка — затворы, столбец — бит, резистор сверху держит 1. Есть транзистор — выбранная строка прижимает столбец к 0, NOT превращает его в 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
pmosI0VCC ↔ O0
nmosI0O0 ↔ GND
Порт выхода—имя O0, вход ← O0

Выделить эти 4 детали (и их метки) → Ctrl+G → в библиотеке двойной клик по имени → NOT.

AND (6 транзисторов): «И-НЕ» в узле n, потом переворот в O0.

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

Если у тебя уже есть NOT и AND из набора «Часы и игра из вентилей» — бери их: у них ноги A, B, Y, это то же самое, что I0, I1, O0 в таблицах.

Шаг 1. Питание и строка

ДетальМетка на выходе
Power (VCC)VCC
Ground (GND)GND
Inputs

Шаг 2. Столбец a — точка есть

ДетальЗатвор (G)Ноги / канал соединяют
Резистор—VCC ↔ a
nmossa ↔ GND
ДетальI0 (вход)O0 (выход)
NOTaQa
ДетальВход
LEDQa

Шаг 3. Столбец b — точки нет

ДетальНоги соединяют
РезисторVCC ↔ b
ДетальI0 (вход)O0 (выход)
NOTbQb
ДетальВход
LEDQb

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)

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