进行以前未知数量的并行操作。在 VHDL 中

Make a previously unknown number of parallel operations. In VHDL

我正在做一个项目,我需要用向量进行计算(使用 gram schmidt 方法对矩阵进行正交化)。这个向量的长度现在是未知的,程序必须能够适应不同的长度。其中一种计算是计算一个新向量 (C),它是 A 和 B 相加的结果。向量的每个元素都是定点数。

我想要C(i)=A(i)+B(i)。对于向量的所有元素(对于 i=0 到 N,其中 N 是向量长度)。

我可以找到 2 个解决方案,但都存在一些问题:

1- 我可以在实体中声明长度根据泛型变化的向量,然后创建一个遍历所有向量的 for 循环。

for I in 0 to N loop
    C(I)<=A(I)+B(I);
end loop;

这个解决方案的问题是执行是顺序的,因此很慢。我对此不完全确定,我不知道如何检查它,但我猜想编译器不够聪明,无法注意到它可以并行处理。在这个应用程序中,速度是一个关键因素。

2- 我可以声明与实际数据的最大可能长度一样长的向量,并用零填充它们。然后我可以分配:

C(0)<=A(0)+B(0);
C(1)<=A(1)+B(1);
C(2)<=A(2)+B(2);
...
C(Nmax)<=A(Nmax)+B(Nmax);

这不是一个优雅的解决方案,在此应用程序中,N 可以在 3 到 300 之间,因此编程可能完全是浪费和乏味。

3-我想找到第三种解决方案,它能够按照 C(i)=A(i)+B(i) 等模板创建组合计算的数字(由泛型指定) .有没有这样的解决方案?它实际上是在创建一个循环,该循环不会按顺序执行,而是同时执行。

我知道使用CUDA也可以做类似的事情,但这个项目实际上是GPU和FPGA之间的比较,所以换平台也不是合适的解决方案。

提前致谢

编辑:我想到了另一个不令人满意的解决方案,但我想分享它以防其他人将来检查它时有所帮助。鉴于A和B的长度相同,可以写成一维格式,即:A(normal)=[1001,1100,0011],A(1-D)=100111000011。对 B 也是如此。

如果你事先知道任意两个可能数的和可以用相同的位数表示,就不会有问题。因此,对于 4 个无符号位,您应该确保在任何可能的情况下,A 或 B 中的数字都是 !>0111(不高于 0111)。您可以只写 C(1-D)=A(1-D)+B(1-D) 然后只需将 C(0)=C(1-D)(3 降为 0), C(1)= C(1-D)(7 降为 4) 等

如果您不能确保数字不高于 0111(在 4 位的情况下),它将无法工作。

您也许可以使用长度属性来创建一个循环,具体取决于向量的大小。

https://www.csee.umbc.edu/portal/help/VHDL/attribute.html

如问题评论中所述,只要循环未与时钟同步,就应展开循环。