Урок 1. Память: защёлка и D-триггер

В картинках

После этого урока у схемы появится память: лампа будет запоминать, что было на входе в момент щелчка такта, и держать это, пока не придёт следующий. Без памяти не нарисовать картинку — схеме нужно помнить, какая точка сейчас и куда идти дальше.


1.1. Идея: петля, которая держит

Если выход вентиля завести обратно на его вход, схема может «застрять» в одном из двух состояний — и это память. Два NOR крест-накрест — SR-защёлка: S записывает 1, R — 0, а когда оба 0, она помнит, что было.

R=0S=0NORNORQ = 1nQ = 0петля держит
SR-защёлка: выход каждого NOR заходит на вход другого. Q = 1 держит второй NOR в нуле, а его ноль держит первый в единице — пока S и R оба 0, состояние не меняется. S = 1 записывает 1, R = 1 — 0.

Неудобно держать два входа, поэтому добавляем две AND — получается D-защёлка: пока EN = 1, выход повторяет D, при EN = 0 — держит.

А для счётчиков нужна запись в один момент — на фронте такта. Это D-триггер: две защёлки по очереди. Пока CLK = 0, ведущая слушает D; когда CLK становится 1, ведущая закрывается, а ведомая показывает то, что она успела запомнить.

CLKDQ
D-триггер: выход Q меняется только в момент фронта CLK (пунктир) — берёт то, что было на D. Между фронтами D может скакать как угодно — Q держит.

1.2. Сборка

Новый пустой проект. Поставь питание: Power → метка VCC, Ground → метка GND (внутри чипов они общие).

Нужны вентили NOT, NAND, NOR, AND, OR, XOR:

  • уже собирал в другом наборе — они в библиотеке, бери;
  • хочешь собрать сам, с транзисторов, — «Урок 0. Вентили из транзисторов»;
  • хочешь сразу к делу — вставь урок 0 (Cmd+I): вентили появятся в библиотеке, холст не изменится.

Шаг 1. SRLatch — защёлка: два NOR крест-накрест

Выход каждого NOR заходит на вход другого — получается петля, которая держит своё состояние. S = 1 — запомнить 1, R = 1 — запомнить 0, оба 0 — держать.

ДетальНогаМетка
Порт входавыходR
Порт входавыходS
NOR (1-й)I0
I1
O0
R
nQ
Q
NOR (2-й)I0
I1
O0
S
Q
nQ
Порт выходавходQ
Порт выходавходnQ

Ctrl+G → имя SRLatch. Ноги чипа: входы R, S, выходы Q, nQ.

Шаг 2. DLatch — D-защёлка: «пока EN = 1, повторяй D»

ДетальНогаМетка
Порт входавыходD
Порт входавыходEN
NOTI0
O0
D
nD
ANDI0
I1
O0
D
EN
setD
ANDI0
I1
O0
nD
EN
rstD
SRLatchR
S
Q
nQ
rstD
setD
Q
nQ
Порт выходавходQ
Порт выходавходnQ

Ctrl+G → имя DLatch. Ноги чипа: входы D, EN, выходы Q, nQ.

Шаг 3. DFF — D-триггер: запись только в момент фронта CLK

Две защёлки по очереди: пока CLK = 0, ведущая слушает D, ведомая держит выход; в момент, когда CLK становится 1, ведущая закрывается, а ведомая показывает то, что она успела запомнить.

ДетальНогаМетка
Порт входавыходD
Порт входавыходCLK
NOTI0
O0
CLK
nCLK
DLatch (ведущая)D
EN
Q
nQ
D
nCLK
mid
— (свободна)
DLatch (ведомая)D
EN
Q
nQ
mid
CLK
Q
nQ
Порт выходавходQ
Порт выходавходnQ

Ctrl+G → имя DFF. Ноги чипа: входы D, CLK, выходы Q, nQ.

Шаг 4. Холст: тумблеры D и CLK, D-триггер, лампа

ДетальНогаМетка
InputвыходD
InputвыходCLK
DFFD
CLK
Q
nQ
D
CLK
Q
nQ
LEDвходQ

1.3. Проверка

Щёлкай тумблеры по строкам сверху вниз. Начинаем с записи 0: сразу после включения триггер может стоять как в 0, так и в 1.

№Тумблер DТумблер CLKЛампа QЧто происходит
100 → 1не горитфронт CLK: Q запомнил D = 0
201 → 0не горитспад CLK ничего не записывает
310не горитD изменился, но фронта CLK нет — Q держит
410 → 1горитфронт CLK: Q запомнил D = 1
501горитD изменился — Q держит
601 → 0горитспад — ничего не записывается
700 → 1не горитфронт CLK: Q запомнил D = 0

Если Q меняется сразу вместе с D, без фронта CLK, — проверь, что у ведущей DLatch на EN стоит nCLK, а у ведомой — CLK.


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

Нужны вентили NOT, AND, NOR — из урока 0 или из библиотеки.

# Урок 1 — память: SR-защёлка → D-защёлка → D-триггер.# Вставка: Cmd+I в новый проект, где уже есть вентили NOT, AND, NOR (урок 0 или вставка урока 0). # --- память: SR-защёлка → D-защёлка → D-триггер ---# SR-защёлка: два NOR крест-накрест; S — запомнить 1, R — запомнить 0chip SRLatch {  portIn(R)  portIn(S)  portOut(Q)  portOut(nQ)  NOR(R, nQ, Q)  NOR(S, Q, nQ)} # D-защёлка: EN = 1 — Q повторяет D, EN = 0 — держитchip DLatch {  portIn(D)  portIn(EN)  portOut(Q)  portOut(nQ)  NOT(D, nD)  AND(D, EN, setD)  AND(nD, EN, rstD)  SRLatch(S=setD, R=rstD, Q=Q, nQ=nQ)} # D-триггер: две защёлки по очереди — запись только в момент, когда CLK меняется с 0 на 1chip DFF {  portIn(D)  portIn(CLK)  portOut(Q)  portOut(nQ)  NOT(CLK, nCLK)  DLatch(D=D, EN=nCLK, Q=mid)  DLatch(D=mid, EN=CLK, Q=Q, nQ=nQ)} # --- на холст: питание, тумблеры D и CLK, D-триггер, лампа Q ---power(VCC)ground(GND)input(D)input(CLK)DFF(D=D, CLK=CLK, Q=Q, nQ=nQ)led(Q)

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