vhdl - 以复数量递增复平面中的向量

时间:2014-07-17 19:25:27

标签: vhdl fixed-point mandelbrot

我正在开发一个项目,该项目将在640 x 480 vga显示器上生成并显示Mandelbrot设置(计划使用其他更高分辨率)。

将VGA x坐标映射到复平面是相当简单的 - 如果我将Mandelbrot x区域从-2.0到+ 2.0,并将其映射到VGA上,我得到x增量为.00625(4/640),所以随着vga x坐标从0增加到639,复数坐标需要以.00625的步长从-2.0递增。 我一直在尝试使用Q4.28格式的定点数学运算(整数部分为4位,小数部分为28位)。 启动很简单 - xE0000000以Q4.28格式映射到-2.0。

我的问题是,在VHDL中,使用定点算法,如何将矢量增加一小部分?

注意:我以前的尝试虽然不正确,但会产生"看起来"如果你看一下测试工作台生成的数据集和我编写的一些c#代码来比较结果,那么它就像图像一样正确但不是。 提前谢谢。

编辑:部分逻辑(来自评论)

signal x_DELTA : signed(31 downto 0):= x"00199999"; 
signal cx_MIN : signed(31 downto 0):= x"E0000000"; 
signal cx : signed(31 downto 0); 

process(clk, reset, other stuff) 
begin 
   if reset = '1' then 
      cx <= cx_MIN; 
   elsif rising_edge(clk) then 
      cx <= cx + x_DELTA; 

注意:此代码已缩短并缩写为显示相关部分并符合注释字符限制。

1 个答案:

答案 0 :(得分:0)

固定点加法与常规整数加法相同。您必须确保加数都被缩放(移位),以便它们的二进制点对齐。将增量乘以2 ** 28,以便以当前格式使用它。然后你就像任何其他整数一样将它们加在一起。

如果此增量仅为常量,则最好显示算法以VHDL方式生成它,而不是手动计算幻数:

constant x_DELTA : integer := integer(4.0/640.0 * 2.0**28);
...
cx <= cx + x_DELTA;

如果你需要做很多定点工作,你可以使用VHDL-2008 fixed_pkg包而不是手动跟踪二进制点和移位来简化操作。 VHDL-93 version是在初始开发过程中创建的,应该适用于任何当前的模拟器和合成器。