Урок 2. Счётчик: шесть триггеров считают до 63
В картинкахПосле этого урока шесть ламп будут считать в двоичной системе — 0, 1, 2 … 63 и по кругу, а табло покажет то же число десятичным. Счётчик — сердце развёртки: в следующем уроке два таких будут пробегать все точки экрана.
2.1. Идея: прибавить 1 столбиком
Счётчик на каждом фронте такта прибавляет 1. Прибавлять 1 мы умеем столбиком: младший разряд переворачивается всегда, следующий — когда младший был 1, и так далее.
- разряд переворачивает
XORс переносом:t(i) = Q(i) ⊕ c(i); - перенос дальше даёт
AND:c(i+1) = c(i) · Q(i); - перенос в самый младший разряд —
EN: приEN = 0счёт стоит.
Сброс. Сразу после включения триггеры стоят в непредсказуемом состоянии. RST = 1 на один фронт такта записывает во все разряды 0 — так при включении сбрасываются настоящие схемы. В настоящих микросхемах сброс обычно активен нулём (/MR у счётчика 74HC161, /RES у процессора 6502), а инверсию ставят одну на всю плату; у нас — для простоты — RST = 1.
2.2. Сборка
Тот же проект. Стенд урока 1 (тумблеры D, CLK, чип DFF на холсте, лампа) удали; Power/Ground оставь.
Идея. Счётчик прибавляет 1 на каждом фронте такта — а прибавлять 1 мы умеем столбиком: младший разряд переворачивается всегда, следующий — когда младший был 1, и так далее. Разряд переворачивает XOR с переносом, перенос дальше даёт AND: c(i+1) = c(i) · Q(i). Перенос в самый младший разряд — EN: EN = 0 — счёт стоит.
Сброс. Сразу после включения триггеры стоят в непредсказуемом состоянии. Чтобы начать с нуля, RST = 1 на один фронт такта записывает во все разряды 0 — так при включении сбрасываются настоящие схемы.
Шаг 1. CNT6 — шесть разрядов
| Деталь | Нога | Метка |
|---|---|---|
| Порт входа | выход | CLK |
| Порт входа | выход | EN |
| Порт входа | выход | RST |
| NOT | I0 O0 | RST nRST |
| XOR (разряд 0) | I0 I1 O0 | Q0 EN t0 |
| AND (сброс 0) | I0 I1 O0 | t0 nRST d0 |
| AND (перенос 0) | I0 I1 O0 | EN Q0 c1 |
| DFF (разряд 0) | D CLK Q nQ | d0 CLK Q0 — (свободна) |
| XOR (разряд 1) | I0 I1 O0 | Q1 c1 t1 |
| AND (сброс 1) | I0 I1 O0 | t1 nRST d1 |
| AND (перенос 1) | I0 I1 O0 | c1 Q1 c2 |
| DFF (разряд 1) | D CLK Q nQ | d1 CLK Q1 — (свободна) |
| XOR (разряд 2) | I0 I1 O0 | Q2 c2 t2 |
| AND (сброс 2) | I0 I1 O0 | t2 nRST d2 |
| AND (перенос 2) | I0 I1 O0 | c2 Q2 c3 |
| DFF (разряд 2) | D CLK Q nQ | d2 CLK Q2 — (свободна) |
| XOR (разряд 3) | I0 I1 O0 | Q3 c3 t3 |
| AND (сброс 3) | I0 I1 O0 | t3 nRST d3 |
| AND (перенос 3) | I0 I1 O0 | c3 Q3 c4 |
| DFF (разряд 3) | D CLK Q nQ | d3 CLK Q3 — (свободна) |
| XOR (разряд 4) | I0 I1 O0 | Q4 c4 t4 |
| AND (сброс 4) | I0 I1 O0 | t4 nRST d4 |
| AND (перенос 4) | I0 I1 O0 | c4 Q4 c5 |
| DFF (разряд 4) | D CLK Q nQ | d4 CLK Q4 — (свободна) |
| XOR (разряд 5) | I0 I1 O0 | Q5 c5 t5 |
| AND (сброс 5) | I0 I1 O0 | t5 nRST d5 |
| AND (перенос 5) | I0 I1 O0 | c5 Q5 CO |
| DFF (разряд 5) | D CLK Q nQ | d5 CLK Q5 — (свободна) |
| Порт выхода | вход | Q0 |
| Порт выхода | вход | Q1 |
| Порт выхода | вход | Q2 |
| Порт выхода | вход | Q3 |
| Порт выхода | вход | Q4 |
| Порт выхода | вход | Q5 |
| Порт выхода | вход | CO |
Ctrl+G → имя CNT6. Ноги чипа: входы CLK, EN, RST; выходы Q0–Q5, CO.
CO горит, когда счётчик дошёл до 63 и счёт разрешён: это перенос в следующий счётчик — в уроке 3 так соединятся счётчики строки и столбца экрана.
Шаг 2. Холст: генератор, тумблеры, счётчик, лампы, табло
| Деталь | Нога | Метка |
|---|---|---|
| Clock | выход | CLK |
| Input | выход | EN |
| Input | выход | RST |
| CNT6 | CLK EN RST Q0 Q1 Q2 Q3 Q4 Q5 CO | CLK EN RST Q0 Q1 Q2 Q3 Q4 Q5 CO |
| LED | вход | Q5 |
| LED | вход | Q4 |
| LED | вход | Q3 |
| LED | вход | Q2 |
| LED | вход | Q1 |
| LED | вход | Q0 |
| LED | вход | CO |
| Display | ⚙ | ширина 6, DEC, шина Q |
Лампы поставь в ряд слева направо от Q5 до Q0 — так они читаются как двоичное число. Генератор Clock меняет частоту щелчком по корпусу: 1Hz, 2Hz, 10Hz, 60Hz и быстрые.
2.3. Проверка
| № | Что сделать | Что видно |
|---|---|---|
| 1 | Генератор на 2Hz (щелчок по корпусу), EN = 0, RST = 1, подождать секунду | все лампы Q погасли, табло 0 — сброс по фронту такта |
| 2 | RST = 0, EN = 1 | лампы считают в двоичном: 1, 2, 3…; табло — то же десятичным |
| 3 | дождаться 63 | горят все шесть ламп Q и лампа CO |
| 4 | ещё один такт | снова 0: счётчик пошёл по кругу |
| 5 | EN = 0 | счёт стоит, лампы держат число |
Если после RST лампы не гаснут — проверь AND (сброс): на второй ноге у каждого nRST, а NOT стоит на RST.
Вставка урока 2 (Cmd+I)
Нужны NOT, XOR, AND и DFF из урока 1.
# Урок 2 — счётчик: шесть D-триггеров считают 0…63; EN — разрешение, RST — сброс в 0 (по фронту), CO — перенос.# Вставка: Cmd+I поверх урока 1 (нужны NOT, XOR, AND, DFF). Стенд урока 1 удалить, кроме питания. # --- 6-битный счётчик: разряд меняется, когда все младшие = 1 (и счёт разрешён); RST = 1 — по фронту все в 0 ---chip CNT6 { portIn(CLK) portIn(EN) portIn(RST) portOut(Q0) portOut(Q1) portOut(Q2) portOut(Q3) portOut(Q4) portOut(Q5) portOut(CO) NOT(RST, nRST) XOR(Q0, EN, t0) AND(t0, nRST, d0) AND(EN, Q0, c1) DFF(D=d0, CLK=CLK, Q=Q0) XOR(Q1, c1, t1) AND(t1, nRST, d1) AND(c1, Q1, c2) DFF(D=d1, CLK=CLK, Q=Q1) XOR(Q2, c2, t2) AND(t2, nRST, d2) AND(c2, Q2, c3) DFF(D=d2, CLK=CLK, Q=Q2) XOR(Q3, c3, t3) AND(t3, nRST, d3) AND(c3, Q3, c4) DFF(D=d3, CLK=CLK, Q=Q3) XOR(Q4, c4, t4) AND(t4, nRST, d4) AND(c4, Q4, c5) DFF(D=d4, CLK=CLK, Q=Q4) XOR(Q5, c5, t5) AND(t5, nRST, d5) AND(c5, Q5, CO) DFF(D=d5, CLK=CLK, Q=Q5)} # --- на холст: генератор такта, тумблеры EN и RST, счётчик, шесть ламп и лампа переноса ---clock{rt=2}(CLK)input(EN)input(RST)CNT6(CLK=CLK, EN=EN, RST=RST, Q0=Q0, Q1=Q1, Q2=Q2, Q3=Q3, Q4=Q4, Q5=Q5, CO=CO)led(Q0)led(Q1)led(Q2)led(Q3)led(Q4)led(Q5)led(CO)Не получается? Что-то не работает →