Урок 1. Экран 128 × 128: семь разрядов вместо шести

В картинках

После этого урока на экране 128 × 128 сам нарисуется треугольник Серпинского — тот же, что в «Фрактальной машине», но вчетверо подробнее. Это проверка нового экрана и развёртки: на ней в уроке 5 будет считаться множество Мандельброта.


1.1. Идея: ещё один разряд

Номер точки по каждой оси — двоичное число. На экране 64 × 64 хватало 6 разрядов, а 128 = 2⁷ — нужен седьмой. Всё остальное — та же развёртка:

  • счётчик X бежит по строке, на каждом такте — следующая точка;
  • его перенос cx в конце строки сдвигает счётчик строки Y;
  • кадр — 128 × 128 = 16 384 такта.
64 × 64128 × 1286 разрядов · 729 точек7 разрядов · 2 187 точек
Тот же треугольник Серпинского: на 64 × 64 (6 разрядов) и на 128 × 128 (7 разрядов). Добавили разряд — картинка из трёх копий прежней, точек втрое больше.

1.2. Идея: сброс снаружи

В «Фрактальной машине» каждый счётчик переворачивал RST своим NOT. В настоящих схемах делают иначе: сброс приходит уже перевёрнутым — nRST, «0 — сбросить», — а NOT один на всю плату. В этом наборе так и сделаем: счётчики, регистры и генератор случайных чисел получают nRST. Экран чистит сам RST — ногой CLR.

1.3. Сборка

Новый проект. Нужны чипы NOT, XOR, AND, OR, NOR, DFF из HB-03. Поставь Power и Ground.

Шаг 1. CNT7 — семибитный счётчик

ДетальНогаМетка
Порт входавыходCLK
Порт входавыходEN
Порт входавыходnRST
Порт выходавходQ0
Порт выходавходQ1
Порт выходавходQ2
Порт выходавходQ3
Порт выходавходQ4
Порт выходавходQ5
Порт выходавходQ6
Порт выходавходCO
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
c6
DFF (разряд 5)D
CLK
Q
nQ
d5
CLK
Q5
— (свободна)
XOR (разряд 6)I0
I1
O0
Q6
c6
t6
AND (сброс 6)I0
I1
O0
t6
nRST
d6
AND (перенос 6)I0
I1
O0
c6
Q6
CO
DFF (разряд 6)D
CLK
Q
nQ
d6
CLK
Q6
— (свободна)

Ctrl+G → имя CNT7. Ноги: входы CLK, EN, nRST; выходы Q0–Q6, CO.

Шаг 2. Экран

Поставь Dot display и настрой в ⚙:

Настройка экрана (⚙)Значение
LayoutDots
Height, dots128
Width, dots128
Port width1 dot

Шаг 3. Холст: генератор, сброс, два счётчика, узор Серпинского, экран

Узор для проверки — треугольник Серпинского из HB-03, теперь на семь разрядов: точка горит, если (x AND y) = 0.

ДетальНогаМетка
ClockвыходCLK
InputвыходRST
NOT (сброс)I0
O0
RST
nRST
NOT (такт экрана)I0
O0
CLK
nCLK
CNT7 (столбец X)CLK
EN
nRST
Q0
Q1
Q2
Q3
Q4
Q5
Q6
CO
CLK
VCC
nRST
x0
x1
x2
x3
x4
x5
x6
cx
CNT7 (строка Y)CLK
EN
nRST
Q0
Q1
Q2
Q3
Q4
Q5
Q6
CO
CLK
cx
nRST
y0
y1
y2
y3
y4
y5
y6
cy
AND (разряд 0)I0
I1
O0
x0
y0
a0
AND (разряд 1)I0
I1
O0
x1
y1
a1
AND (разряд 2)I0
I1
O0
x2
y2
a2
AND (разряд 3)I0
I1
O0
x3
y3
a3
AND (разряд 4)I0
I1
O0
x4
y4
a4
AND (разряд 5)I0
I1
O0
x5
y5
a5
AND (разряд 6)I0
I1
O0
x6
y6
a6
ORI0
I1
O0
a0
a1
o01
ORI0
I1
O0
a2
a3
o23
ORI0
I1
O0
a4
a5
o45
ORI0
I1
O0
o01
o23
o03
ORI0
I1
O0
o45
a6
o46
NORI0
I1
O0
o03
o46
pix
Dot displayX0
X1
X2
X3
X4
X5
X6
Y0
Y1
Y2
Y3
Y4
Y5
Y6
D0
WE
CLK
CLR
x0
x1
x2
x3
x4
x5
x6
y0
y1
y2
y3
y4
y5
y6
pix
VCC
nCLK
RST

Генератор Clock — 60Hz: видно, как бежит развёртка, но кадр из 16 384 точек рисуется 4,5 минуты. Щёлкни по корпусу генератора до 4kHz — кадр за 4 секунды.

1.4. Проверка

Что сделатьЧто видно
RST вкл, 2–3 такта, RST выклэкран чист, счётчики на нуле — развёртка начинает с левого верхнего угла
Clock 60Hzточки бегут по строке, строка за строкой — кадр за 4,5 минуты
Clock 4kHzкадр за 4 секунды: треугольник Серпинского на весь экран
Посмотри на правый нижний уголправый нижний угол не горит: 127 AND 127 = 127
Посмотри на левый столбец и верхнюю строкугорят целиком: x = 0 или y = 0 — AND даёт 0

Если горит только верхняя половина экрана — проверь у Dot display ногу Y6 (метка y6) и Height, dots = 128. Если картинка повторяется — у одного из CNT7 седьмой разряд не на своей метке.


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

Нужны NOT, XOR, AND, OR, NOR, DFF из «Фрактальной машины» (уроки 0 и 1).

# Урок 1 — экран 128 × 128: семибитный счётчик CNT7 и развёртка; проверка — треугольник Серпинского на весь экран.# Нужны NOT, XOR, AND, OR, NOR, DFF из HB-03 (или урок 0 HB-03 + урок 1 HB-03). Поставь Power и Ground. # --- 7-битный счётчик: разряд меняется, когда все младшие = 1 (и счёт разрешён); nRST = 0 — по фронту все в 0 ---# Сброс приходит уже перевёрнутым (nRST): один NOT на всю схему вместо NOT в каждом счётчике.chip CNT7 {  portIn(CLK)  portIn(EN)  portIn(nRST)  portOut(Q0)  portOut(Q1)  portOut(Q2)  portOut(Q3)  portOut(Q4)  portOut(Q5)  portOut(Q6)  portOut(CO)  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, c6)  DFF(D=d5, CLK=CLK, Q=Q5)  XOR(Q6, c6, t6)  AND(t6, nRST, d6)  AND(c6, Q6, CO)  DFF(D=d6, CLK=CLK, Q=Q6)} # --- на холст: генератор, сброс, счётчики столбца X и строки Y ---clock{rt=60}(CLK)input(RST)NOT(RST, nRST)NOT(CLK, nCLK)CNT7(CLK=CLK, EN=VCC, nRST=nRST, Q0=x0, Q1=x1, Q2=x2, Q3=x3, Q4=x4, Q5=x5, Q6=x6, CO=cx)CNT7(CLK=CLK, EN=cx, nRST=nRST, Q0=y0, Q1=y1, Q2=y2, Q3=y3, Q4=y4, Q5=y5, Q6=y6, CO=cy)# --- проверка экрана: треугольник Серпинского — точка горит, если (x AND y) = 0 ---AND(x0, y0, a0)AND(x1, y1, a1)AND(x2, y2, a2)AND(x3, y3, a3)AND(x4, y4, a4)AND(x5, y5, a5)AND(x6, y6, a6)OR(a0, a1, o01)OR(a2, a3, o23)OR(a4, a5, o45)OR(o01, o23, o03)OR(o45, a6, o46)NOR(o03, o46, pix)# экран: точка (x, y) получает pix; запись по спаду такта — когда счётчики уже переключились; RST заодно чистит экранdotdisplay SCR{layout=dots, w=128, h=128}(X0=x0, X1=x1, X2=x2, X3=x3, X4=x4, X5=x5, X6=x6, Y0=y0, Y1=y1, Y2=y2, Y3=y3, Y4=y4, Y5=y5, Y6=y6, D0=pix, WE=VCC, CLK=nCLK, CLR=RST)

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