Блог страдающего Лиса
Lorem ipsum hello dolor sit world amet

31 окт 2024 Чт Фрактал Мандельброта для AVR

И вот опять я создаю этот фрактал. На этот раз я снова создал его на AVR процессоре, чтобы проверить качество и правильность работы эмулятора. Все получилось как надо, но скорость рисования фрактала, я бы не сказал, что суперская. Появилась одна идея, создать фрактал с помощью верилога.
Один цикл обработки достаточно небольшой:
x = x*x - y*y + cx
y = 2*x*y + cy
if x*x + y*y >= 4 then break
Как видно, необходимо всего 3 умножения за раз: xx, yy и xy, одно вычитание и три сложения. Это выполняется за 1 такт все. Для того чтобы выполнить умножение, необходимо сначала привести значение к абсолютному значению, а это делается через простую проверку дополненного кода, например a = b[31] ? -b : b. После умножения обязательно надо будет обратно привести в дополненный код из прямого, если результат получился отрицательным. Он получится отрицательным если знаки множителей a[31] ^ b[31] будут разными.
Сложение и вычитание уже можно делать без оглядки на знак, потому что все значения эти работают уже в дополненном коде. Также интересное замечание, что x^2 - y^2 не сможет превысить диапазон допустимых значений -3.999 ... 3.999, так как оба числа получатся положительными. Минимальное число xx=0, максимальное yy=3.999, что дает -3.999. И наоборот. Аналогично с xy. Единственное что только надо учесть так это +cx, +cy, значения которых не должны тоже превысить максимум, так что закладывать надо диапазон от -7.999 до 7.999, с 3 битами на целое число.
Максимальное количество итерации будет равно 320 x 200 x 256, что дает 16'384'000 тактов. Это значит, что в худшем случае будет рисоваться за 16.3/25 ~ 0,6 секунд. Это довольно быстро, кстати говоря.
Скорость рендеринга можно увеличить в разы, если использовать рисование блоков по 1кб например, в 64 потока. Конечно, столько не нужно, можно просто в 4 потока сделать, что даст максимальную скорость 1/0.15=6 fps на самом сложном случае.
Будет интересно.
1x54vqk-clipx.png