Урок 1. Экран 128 × 128: семь разрядов вместо шести
В картинкахПосле этого урока на экране 128 × 128 сам нарисуется треугольник Серпинского — тот же, что в «Фрактальной машине», но вчетверо подробнее. Это проверка нового экрана и развёртки: на ней в уроке 5 будет считаться множество Мандельброта.
1.1. Идея: ещё один разряд
Номер точки по каждой оси — двоичное число. На экране 64 × 64 хватало 6 разрядов, а 128 = 2⁷ — нужен седьмой. Всё остальное — та же развёртка:
- счётчик
Xбежит по строке, на каждом такте — следующая точка; - его перенос
cxв конце строки сдвигает счётчик строкиY; - кадр — 128 × 128 = 16 384 такта.
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 и настрой в ⚙:
| Настройка экрана (⚙) | Значение |
|---|---|
| Layout | Dots |
| Height, dots | 128 |
| Width, dots | 128 |
| Port width | 1 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 |
| OR | I0 I1 O0 | a0 a1 o01 |
| OR | I0 I1 O0 | a2 a3 o23 |
| OR | I0 I1 O0 | a4 a5 o45 |
| OR | I0 I1 O0 | o01 o23 o03 |
| OR | I0 I1 O0 | o45 a6 o46 |
| NOR | I0 I1 O0 | o03 o46 pix |
| Dot display | X0 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)Не получается? Что-то не работает →