You don't want for loops like that. If you want to generate a circle on the fly (rather than using a bitmap), keep track of your current coordinate in a separate process (always
block). Each always block will run on every tick of the VGA clock, so you have a new pixel position every time the block executes.
Then have another always
block which looks at those x and y coordinates and decides if the current point is in the circle or not. Based on that decision, you can choose a foreground or background colour. Again, this operates once for every pixel, in order.
The tricky part is the decision as to whether the current point is in the circle or not.
If this seems a bit too hard to start with, draw a square instead as the equations for that are very straightforward. Once you got that down and understand exactly how and why it works, you can graduate to circles (and other parametrically defined shapes). To find methods of rendering these shapes on the fly, as you scan the image, you might find the term "scanline render" or "incremental render" helpful.
On thinking some more about this, is it not the case that the standard equation for a circle:
x^2 + y^2 = r^2
can be rendered as an inequality to return points inside a circle:
x^2 + y^2 < r^2
Extending to allow variation in the centre point:
(x-xc)^2 + (y-yc)^2 < r^2
That would mean that for every pixel, you subtract the centre point from the x and y, square them and compare to r^2
. If it's less-than r^2, plot the pixel.
That would have been a lot of logic in an old-fashioned FPGA, but 3 subtractors and 2 multipliers is nothing these days (or if you operate at a multiple of the pixel clock, you could share the multiplier at the expense of a mux on the inputs)