快速增加两个1-D阵列的方法

tri*_*can 5 hardware verilog fpga vhdl asic

我有以下数据:

A = [a0 a1 a2 a3 a4 a5 .... a24]
B = [b0 b1 b2 b3 b4 b5 .... b24]
Run Code Online (Sandbox Code Playgroud)

然后,我想要乘以如下:

C = A * B' = [a0b0 a1b1 a2b2 ... a24b24]
Run Code Online (Sandbox Code Playgroud)

这显然涉及25次乘法.

但是,在我的场景中,每个"循环迭代"只有5个新值被移入A(并且5个旧值从A移出).有没有快速的方法来利用数据通过A转移而不是全新的事实?理想情况下,我希望最小化乘法运算的数量(可能需要更多的加法/减法/累加).我最初认为收缩压阵列可能有所帮助,但它没有(我想!?)

更新1:注意B长期固定,但可以重新编程.

更新2:A的移位如下:a [24] <= a [19],a [23] <= a [18] ... a [1] <= new01,a [0] <= new00.依此类推每个时钟周期

非常感谢!

and*_*and 2

有没有快速的方法来利用数据通过 A 转移而不是全新的事实?

尽管您所做的只是向 A 移动和添加新元素,但 C 中的乘积通常都会有所不同,因为其中一个操作数通常会在每次迭代后发生变化。如果您有关于 A 或 B 的元素构造方式的更多信息,您可能会使用该结构来减少乘法次数。排除任何此类结构考虑因素,您将必须在每个循环中计算所有 25 个乘积。

理想情况下,我想最小化乘法运算的数量(可能需要更多的加法/减法/累加)。

理论上,可以通过数组元素的移位和相加来模拟乘法,从而将乘法次数减少到0。实际上,这会比硬件乘法慢,因此您最好只使用任何可用的基于硬件的乘法,除非有一些您没有提到的附加相关约束。