Урок 4. Треугольник Серпинского: фрактал из десяти вентилей
В картинкахПосле этого урока на экране появится настоящий фрактал — треугольник Серпинского: большой треугольник из трёх таких же, каждый из них — из трёх ещё меньших, и так до отдельной точки. А логики для него — шесть AND и дерево OR.
4.1. Идея: ни одного общего разряда
Точка (x, y) горит, если у x и y нет ни одного общего разряда с единицей: (x AND y) = 0.
Почему получается треугольник? Посмотри на старший разряд. Если он 1 у x — точка в правой половине, у y — в нижней. Обе единицы сразу запрещены, поэтому правый нижний квадрат пустой, а в трёх остальных — то же правило для пяти младших разрядов, то есть та же картинка вдвое меньше. И так шесть раз.
Тот же узор даёт треугольник Паскаля, если закрасить в нём нечётные числа, — так его и находили задолго до компьютеров.
4.2. Сборка
Тот же проект, что урок 3: развёртка, два CNT6 и экран остаются. Меняется только узор — логика, которая решает, гореть ли точке (x, y).
Идея. Точка горит, если у x и y нет ни одного общего разряда с единицей: (x AND y) = 0.
| x | y | x AND y | Точка |
|---|---|---|---|
| 5 = 000101 | 2 = 000010 | 000000 | горит |
| 5 = 000101 | 4 = 000100 | 000100 | не горит |
| 12 = 001100 | 3 = 000011 | 000000 | горит |
Из этого простого правила вырастает треугольник Серпинского: большой треугольник состоит из трёх таких же, только вдвое меньше, а каждый из них — ещё из трёх… На экране 64 × 64 таких ступеней шесть — по числу разрядов, и горит 3⁶ = 729 точек. Тот же узор даёт треугольник Паскаля, если закрасить в нём нечётные числа.
Как это собрать: 6 AND — по одному на разряд, «единица в этом разряде у обоих». Если хоть один AND горит, точка гаснет: все шесть собираем деревом OR, а последним ставим NOR — он сразу и собирает, и переворачивает.
Шаг 1. Убрать старый узор
| Что удалить | Как найти |
|---|---|
| XOR (узор) | выход которого = pix |
У метки pix должен остаться один источник — новый NOR. Два источника на одной метке — замыкание.
Шаг 2. Узор Серпинского
| Деталь | Нога | Метка |
|---|---|---|
| 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 |
| 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 |
| NOR (точка) | I0 I1 O0 | o03 o45 pix |
4.3. Проверка
| № | Что сделать | Что видно |
|---|---|---|
| 1 | RST = 1, один такт, RST = 0; генератор 4kHz или быстрее | кадр рисуется заново |
| 2 | дождаться конца кадра | прямоугольный треугольник: прямой угол слева вверху, внутри — три треугольника поменьше, в каждом ещё три… |
| 3 | присмотрись к углу 8 × 8 слева вверху | там тот же треугольник, только маленький — это и есть фрактал: часть похожа на целое |
Если треугольник «рваный» или в нём лишние точки — проверь пары у AND: в каждом AND разряды x и y одного номера. Если экран весь тёмный — проверь, что XOR (узор) удалён, а pix выходит из NOR.
Вставка урока 4 (Cmd+I)
Перед вставкой удали XOR (узор), выход которого = pix: у pix должен остаться один источник.
# Урок 4 — треугольник Серпинского: точка горит, если (x AND y) = 0 — ни в одном разряде нет двух единиц сразу.# Вставка: Cmd+I поверх урока 3. Перед вставкой удали XOR (узор), выход которого = pix: у pix должен остаться один источник. # --- 6 AND: единица в одном разряде x и y сразу ---AND(x0, y0, a0)AND(x1, y1, a1)AND(x2, y2, a2)AND(x3, y3, a3)AND(x4, y4, a4)AND(x5, y5, a5)# --- хоть одна такая пара — точка не горит: OR деревом, в конце NOR ---OR(a0, a1, o01)OR(a2, a3, o23)OR(a4, a5, o45)OR(o01, o23, o03)NOR(o03, o45, pix)Не получается? Что-то не работает →