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

时间:2017-02-07 18:11:04

标签: parallel-processing vhdl

我正在研究一个项目,我需要用矢量进行计算(使用克施密特方法对矩阵进行正交化)。现在这个载体的长度是未知的,程序必须能够适应不同的长度。其中一个计算是计算一个新的向量(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具有相同的长度,您可以以1-D格式写入它们,即:A(正常)= [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 downto 0),C(1)= C(1-D)(7 downto 4)等。

如果您无法确保数字不高于0111(在4位情况下),则无法正常工作。

1 个答案:

答案 0 :(得分:0)

您可以使用length属性根据向量的大小创建循环。

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

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