FPGA固件设计:多大才算大?

电器工程 FPGA 视频文件 赛灵思
2022-01-19 10:17:26

我有一个特别大的信号处理转换,需要从 matlab 移植到 VHDL。它肯定需要某种资源共享。一点计算给了我以下信息:

  • 512 英尺 64 点
  • 41210 乘加运算

考虑到最大的 Virtex 6 FPGA 有大约 2000 个 DSP48E 块,我知道我可以进行资源共享以便多次重复使用资源。执行时间不是真正的问题,处理时间在 FPGA 方面可能需要相对较长的时间。

查看资源使用情况,使用 radix-2 lite 架构可以获得 4dsp 块/FFT 操作 = 2048 个 DSP 块,总共约 43k。最大的 Virtex FPGA 有 2k 个块,或 20 个操作/多路复用器。

显然,在织物中包含如此大的多路复用器也会占用切片。我在哪里可以找到这个限制的上限?我不能无限共享FPGA资源。41210 乘数是否太大?如何计算太大?

我还查看了其他资源(切片、布拉姆斯等)。Radix-2 Lite 还提供 4 x 18k brams/fft = 2048 brams,最大的 Xilinx FPGA 包含 2128 Brams。非常边缘。我担心我的设计太大了。


更新:

有关设计本身的更多信息。我无法详细说明,但这是我可以提供的:

Initial conditions -> 512 ffts -> 40k multipliers ---------|----> output data to host 

                 ^------re-calculate initial conditions----|

输出数据速率规范:“比 matlab 模拟更快”

计算明智,这就是我所在的位置:

FFT阶段:简单。我可以实现 1/2/4/8 FFT,将结果存储在 SDRAM 中并稍后访问。比较小,就算时间长了也没关系。使用 radix-2 lite 我可以获得 2 个 DSP48E 和 2 个 18k BRAMS/FFT。流提供 6 个 DSP48E 0BRAMS/FFT。在任何一种情况下,64 点 FFT 在 FPGA 资源方面都很小。

乘数:这是我的问题。乘法输入取自查找表或 FFT 数据。它实际上只是一堆乘法加法。没有太多可优化的地方。不是过滤器,但具有类似于过滤器的特性。

考虑到 FPGA 上的资源共享,数学计算如下:一个 LUT-6 可用作 4 路复用器。N路M位多路复用器的公式如下:

N*M/3 = number of luts, or N*M/12 = slices (4 LUTS/slice).

为我的实施处理数字并没有给出好的结果。90% 的 virtix-6 系列没有足够的切片来共享其 DSP 资源以执行 40k 操作。

4个回答

我想知道是否有另一种看待问题的方法?

发挥您对 512 个 FFT 操作(每个 64 点)和 42k MAC 操作的估计......我想这是您通过算法所需要的?

现在您已经找到了一个使用 4 个 DSP 单元的 FFT 内核……但是每个 FFT 需要多少个时钟周期?(吞吐量,而不是延迟)?假设 64,或每点 1 个周期。然后你必须在 64 个周期内完成这 42k 个 Mac 操作——每个周期可能 1k 个 MAC,每个 MAC 处理 42 个操作。

现在是时候更详细地研究算法的其余部分了:识别的不是 MAC,而是可以重用的更高级别的操作(过滤、相关等)。为这些操作中的每一个构建内核,具有可重用性(例如具有不同可选系数集的滤波器),很快您可能会发现在相对较大的内核之间需要相对较少的多路复用器......

另外,是否可以降低强度?我有一些情况需要循环中的乘法来生成二次(和更高)。展开它们,我可以迭代地生成它们而无需乘法:在 FPGA 上构建差异引擎的那一天,我对自己非常满意!

在不了解应用程序的情况下,我无法提供更多详细信息,但一些此类分析可能会使一些重大简化成为可能。

另外 - 因为听起来好像您没有明确的平台 - 考虑是否可以跨多个 FPGA 进行分区......看看这个板这个在一个方便的平台上提供多个 FPGA 的板。他们还有一块板子,上面有 100 个 Spartan-3 设备……

(当软件人员关闭另一个问题时,我感到很失望——我认为它至少在那里是合适的)

编辑:重新编辑 - 我认为你开始到达那里。如果所有乘法器输入要么是 FFT 输出,要么是“非过滤”系数,那么您将开始看到需要利用的那种规律性。每个乘法器的一个输入连接到 FFT 输出,另一个输入连接到系数 ROM(BlockRam 实现为常量数组)。

通过同一个 FFT 单元对不同的 FFT 操作进行排序将自动对 FFT 输出进行排序,使其通过该乘法器。将正确的系数排序到另一个 MPY 输入现在“仅仅”是在正确的时间组织正确的 ROM 地址的问题:一个组织问题,而不是 MUX 的巨大头痛。

关于性能:我认为 Dave Tweed 是不必要的悲观 - FFT 采用 n*log(n) 操作,但你可以选择 O(n) 蝴蝶单位和 O(logN) 周期,或 O(logN) 单位和 O( n) 循环,或其他适合您的资源和速度目标的组合。一种这样的组合可能会使后 FFT 乘法结构比其他组合简单得多......

如果这个问题没有严格的实时约束,而且听起来好像没有——你只是希望它运行得“更快”,那么它似乎很适合在一个或多个 GPU 上进行加速。有几个软件库使这成为一个相对简单的命题,这比直接使用定制 FPGA 硬件要容易一个数量级。

只需 Google 搜索“启用 GPU 的库”或“GPU 加速库”即可开始使用。

我们执行时间的问题有多小?

这看起来确实是一种情况,您应该真正实现一个软 MCU、一个带有集成硬 MCU 的 FPGA,甚至是一个单独的 MCU 设备,并串行化您的所有操作。

假设您有执行时间,那么在软件中进行 FFT 将更容易调试,而且设计也可能更简单。

可以使用专用硬件或 FPGA(甚至 CPLD)来大大加速某些类型的数学运算。在尝试设计硬件(电路或 FPGA 逻辑)以加速数学运算时,要牢记的关键是弄清楚进出设备所需的数据顺序。具有高效 I/O 布局的设备可能比具有低效率布局的设备提供更好的性能,即使后者需要更多电路。

我还没有尝试为 FFT 制定硬件辅助设计,但我看过的是大型乘法运算的硬件辅助(可能用于 RSA 加密)。许多微控制器,即使是那些具有特殊快速乘法硬件的微控制器,在此类操作中效率并不高,因为它们需要大量的寄存器改组。旨在最小化寄存器交换的硬件可以通过多精度乘法运算获得更好的性能,即使硬件本身并不复杂。例如,可以一次执行两位流水线 16xN 乘法的硬件(移入 multiplcand 的两个低位,移出结果的两个高位)可能比可以在一个周期内执行 8x8 乘法的硬件实现更好的性能,即使前者可能需要更少的电路(并且由于流水线,具有更短的关键数据路径)。关键是要弄清楚必要代码的“内循环”是什么样的,并弄清楚是否有任何可以轻松消除的低效率。