## Introduction to the Mandelbrot set

Like I mentioned in the previous post, I wanted to familiarize myself with the HDMI output on the DE10-nano FPGA board, and there is no harm in getting some pretty graphics along the way, so I decided to implement a Mandelbrot set viewer on FPGA.

If you are not familiar with the Mandelbrot set, it is a type of a fractal, which is simply put an infinitely – repeating recursive pattern. That means that you can zoom into the set and discover ever repeating, self-mirroring patterns. They are also a little weird ;). You can read more about them on the linked Wikipedia article.

The familiar look of the Mandelbrot set is depicted in this picture:

For the formal definition of the Mandelbrot set, I’ll just quote the Wikipedia article:

The Mandelbrot set is the set of values of

cin the complex plane for which the orbit of critical point z= 0 under iteration of the quadratic map remains bounded. Thus, a complex numbercis a member of the Mandelbrot set if, when starting withz_{0}= 0 and applying the iteration repeatedly, the absolute value ofz_{n}remains bounded for alln> 0.For example, for

c= 1, the sequence is 0, 1, 2, 5, 26, …, which tends to infinity, so 1 is not an element of the Mandelbrot set. On the other hand, forc= −1, the sequence is 0, −1, 0, −1, 0, …, which is bounded, so −1 does belong to the set.

Which put in simple terms means that the Mandelbrot set can be calculated simply by iteratively calculating the equation for all “interesting” complex numbers , and starting the iteration with . The complex number is expressed as ** x + iy**, where

**and**

*x***can be mapped to the horizontal and vertical position on the screen. If the iteration doesn’t escape to infinity, then is part of the set.**

*y*That handles the “black&white” part. You can then decide how to color the image. A popular (and simple) algorithm you can use is the Escape time algorithm, which selects the color of each individual pixel based on whether the pixel is part of the set or not, and if not, how many iterations it took to “escape”.

The simplified Escape time algorithm can be represented in pseudocode like this:

x2 := 0 y2 := 0 while (x2 + y2 ≤ 4 and iteration < max_iteration) do y := 2 × x × y + y0 x := x2 - y2 + x0 x2 := x × x y2 := y × y iteration := iteration + 1

The Mandelbrot set colored with the Escape time algorithm has some properties that are very helpful if you want to calculate it on an FPGA:

- the set is closed and contained in a closed disk of radius 2 – if the distance from the origin (starting point) is bigger than 2 for the current iteration, then that origin is not part of the set, and you can stop iterating
- since the set has a limited radius, that means that the range of numbers we need to work with is also limited – important if you want to use integer only math
- the pixel values are independent of one another – you can calculate all pixels in parallel
- not a lot of iterations are needed for each pixel
- the equation to calculate it is simple, probably the simplest of all fractals that I know of

So, to implement the algorithm on an FPGA, you can already see the requirements:

- memory to hold the calculated pixel values – how much depends on the FPGA resources, and the amount of available memory will determine the maximum resolution
- the maximum number of iterations will be also limited by the memory – using 8, 9 or 10 bit memory width will provide the best resource utilization
- as can be seen from the pseudocode above, a lot of multipliers will be needed, ideally, you would use all the FPGA DSP elements available
- the multipliers will need to be quite wide, at least 27 bits, since you’d want to zoom deep into the Mandelbrot set

This covers the introduction to the Mandelbrot set. I’ll go deeper into the implementation in the next post. Cheers!