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.依此类推每个时钟周期
非常感谢!
有没有快速的方法来利用数据通过 A 转移而不是全新的事实?
尽管您所做的只是向 A 移动和添加新元素,但 C 中的乘积通常都会有所不同,因为其中一个操作数通常会在每次迭代后发生变化。如果您有关于 A 或 B 的元素构造方式的更多信息,您可能会使用该结构来减少乘法次数。排除任何此类结构考虑因素,您将必须在每个循环中计算所有 25 个乘积。
理想情况下,我想最小化乘法运算的数量(可能需要更多的加法/减法/累加)。
理论上,可以通过数组元素的移位和相加来模拟乘法,从而将乘法次数减少到0。实际上,这会比硬件乘法慢,因此您最好只使用任何可用的基于硬件的乘法,除非有一些您没有提到的附加相关约束。