Урок 1. Память: защёлка и D-триггер
В картинкахПосле этого урока у схемы появится память: лампа будет запоминать, что было на входе в момент щелчка такта, и держать это, пока не придёт следующий. Без памяти не нарисовать картинку — схеме нужно помнить, какая точка сейчас и куда идти дальше.
1.1. Идея: петля, которая держит
Если выход вентиля завести обратно на его вход, схема может «застрять» в одном из двух состояний — и это память. Два NOR крест-накрест — SR-защёлка: S записывает 1, R — 0, а когда оба 0, она помнит, что было.
Неудобно держать два входа, поэтому добавляем две AND — получается D-защёлка: пока EN = 1, выход повторяет D, при EN = 0 — держит.
А для счётчиков нужна запись в один момент — на фронте такта. Это D-триггер: две защёлки по очереди. Пока CLK = 0, ведущая слушает D; когда CLK становится 1, ведущая закрывается, а ведомая показывает то, что она успела запомнить.
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 |
| NOT | I0 O0 | D nD |
| AND | I0 I1 O0 | D EN setD |
| AND | I0 I1 O0 | nD EN rstD |
| SRLatch | R 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 |
| NOT | I0 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 |
| DFF | D CLK Q nQ | D CLK Q nQ |
| LED | вход | Q |
1.3. Проверка
Щёлкай тумблеры по строкам сверху вниз. Начинаем с записи 0: сразу после включения триггер может стоять как в 0, так и в 1.
| № | Тумблер D | Тумблер CLK | Лампа Q | Что происходит |
|---|---|---|---|---|
| 1 | 0 | 0 → 1 | не горит | фронт CLK: Q запомнил D = 0 |
| 2 | 0 | 1 → 0 | не горит | спад CLK ничего не записывает |
| 3 | 1 | 0 | не горит | D изменился, но фронта CLK нет — Q держит |
| 4 | 1 | 0 → 1 | горит | фронт CLK: Q запомнил D = 1 |
| 5 | 0 | 1 | горит | D изменился — Q держит |
| 6 | 0 | 1 → 0 | горит | спад — ничего не записывается |
| 7 | 0 | 0 → 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)Не получается? Что-то не работает →