Урок 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 счёт стоит.
XOR + DFFQ0 = 1станет 0c1=1XOR + DFFQ1 = 1станет 0c2=1XOR + DFFQ2 = 1станет 0c3=1XOR + DFFQ3 = 0станет 1EN=10111 (7) → 1000 (8): перенос перевернул три младших разряда
Счётчик прибавляет 1 столбиком. Перенос в младший разряд — EN. Разряд переворачивается, если в него пришёл перенос; перенос идёт дальше, если разряд был 1. Всё меняется сразу, на одном фронте такта.

Сброс. Сразу после включения триггеры стоят в непредсказуемом состоянии. 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
NOTI0
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
CNT6CLK
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 — сброс по фронту такта
2RST = 0, EN = 1лампы считают в двоичном: 1, 2, 3…; табло — то же десятичным
3дождаться 63горят все шесть ламп Q и лампа CO
4ещё один тактснова 0: счётчик пошёл по кругу
5EN = 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)

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