我想在 640x480 VGA 显示器上输出一个半径为 100 像素的移动红色圆圈。我被困在如何制作和填写实际的圆圈上。现在我已经看了一下大脑麻木的 Bresenham 算法,但我无法让它们适合我的 verilog 代码。
我已经理论化了我能做什么,但我不完全确定它是可能的。我知道圆的方程是 (xa) (xa)+(yb) (yb)=r*r 其中 (a,b) 是原点。所以我想用RGB颜色填充这个圆圈并将它从上到下移动,即从b = 0到480 at a = 640/2
由于VGA从左到右输出像素,向下迭代,我猜我必须使用嵌套循环。我知道垂直运动的第一个循环从 0 到 480。这是我遇到问题的第二个循环。它从 0 变为 640,但我希望像素在到达 (x,y) (沿圆圈的一个点)时改变颜色,保留该颜色,然后在它们通过 (x+k) 时变回来(其中 k 是水平和弦)。
基本上,如果下面是我圈子的水平和弦:
_黑色.(x,y)___红色(k 像素) _ .(x+k,y) _黑色
reg [8:0] bally;//y coordinate of the center of circle
reg [8:0] rad;//radius
always @ (posedge clk)
begin
for(VCount=0;VCount<=480;VCount++)
for(HCount=0;HCount<=640;HCount++)
if((HCount*HCount>=rad*rad-((VCount-bally)*(VCount-bally)) && HCount*HCount<=((10000-((VCount-bally)*(VCount-bally)))+k)))
R<=1;
G<=0;
B<=0;
end
我的问题是,我如何用我已经拥有的变量来表示我的 if 条件中的 k?我意识到这可能不是一个 Verilog 问题,但可能是我在基本三角学上失败了,但我的思想真的被困在这上面了。而且,如果我在尝试制作这个圈子时非常偏离(代码方面、逻辑方面、综合方面),请告诉我。任何帮助将不胜感激。