首页 文章

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

提问于
浏览
0

我正在研究一个项目,我需要用矢量进行计算(使用克施密特方法对矩阵进行正交化) . 现在这个载体的长度是未知的,程序必须能够适应不同的长度 . 这种计算之一是计算新的向量(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 回答

相关问题