VHDL:在设计中实现乘法器时使用“*”运算符

电器工程 FPGA 视频文件 数字信号处理器
2022-01-22 22:39:40

现在的 FPGA 已经内置了 DSP 模块,最新的 FPGA 甚至内置了符合 IEEE-754 的浮点单元。

可以在其中选择所需参数后使用 GUI 创建 DSP 实体/模块,然后在设计中对其进行实例化。

我们什么时候需要在实例化实际 DSP 模块的设计中进行这种微管理,什么时候我们只需在代码中输入“*”运算符并让综合工具处理低级细节?哪个更好?

当涉及到二进制乘法时,有许多不同类型的乘法算法。既然现在我们已经在硅片上内置了 DSP 模块,甚至内置了浮点乘法器,这是否意味着所有这些算法都没有有效地过时。

4个回答

如果您只想将两个数字相乘并且它们适合 DSP 模块,那么*操作员应该推断出 DSP 模块。如果没有,请将综合工具发回 :)

然而,要利用更复杂的 DSP 功能组合,通常需要直接实例化模块并配置其参数。通过推理可能无法很好映射的示例(以 Xilinx DSP48E1为例):

  • 预加器的使用
  • 后蓄电池的使用
  • 模式检测器的使用
  • 逻辑单元的使用

尤其是上述的组合。

综合工具还不足以像您希望的那样高效地映射完全任意的逻辑和算术组合。

我自己做过几次。

通常,设计工具会根据综合设置在架构实现和 DSP Slice 之间进行选择。

例如,对于 Xilinx ISE,在综合过程设置、HDL 选项中,有一个设置“-use_dsp48”,其中包含以下选项:Auto、AutoMax、Yes、No。您可以想象,这控制了工具尝试放置的难度DSP片。我曾经遇到过一个问题,我将一个整数乘以 3,从而推断出一个 DSP 片——除了我已经手动推断了芯片中的每个 DSP 片,所以合成器失败了!我将设置更改为否,因为我已经在使用每个 dsp 切片。

这可能是一个很好的经验法则(我刚刚编造的):如果您的设计时钟频率低于 50 MHz,并且您可能会使用不到 50% 的芯片中的 DSP 片,那么只需使用*、+ 和 - 运算符。这将推断没有流水线寄存器的 DSP 片。这确实限制了最高速度。(我不知道当你使用除法时会发生什么)

但是,如果看起来您要运行的切片更接近 DSP 切片的最大速度(Spartan 6 正常速度等级为 333 MHz)您要使用所有切片,您应该手动推断它们.

在这种情况下,您有两个选择。

选项 1:手动使用原始 DSP 实例化模板。选项 2:使用 Xilinx Core Generator 的 IP 块。(我会使用此选项。同时,您将了解有关核心生成的所有信息,这将对将来有所帮助)

在执行上述任一操作之前,请阅读 DSP slice 用户指南的前几页。对于 Spartan 6 (DSP48A1),即 Xilinx 文档 UG389: http ://www.xilinx.com/support/documentation/user_guides/ug389.pdf

首先考虑核心生成器选项。我通常在 Core Generator 中为我正在使用的部件创建一个测试项目,在其中我创建任意数量的 IP 块只是为了学习系统。然后,当我准备在 ISE 中向我的设计添加一个时,我在 Design Hierarchy 中单击鼠标右键,单击 new source,然后选择“IP (CORE Generator & Architecture Wizard)”,这样我就可以直接编辑和重新生成块从我的项目。

在 Core gen 中,看看您可以选择的不同 IP 块 - 有几十个,其中大部分都非常酷。

乘数核心是您应该首先查看的。检查每一页,然后单击数据表按钮。重要的部分是整数位宽、流水线阶段(延迟)和任何控制信号。通过删除所有不需要的端口,这会产生最简单的块。

去年我在构建一个 5 x 3 阶 IIR 滤波器时,我不得不使用手动实例化模板,因为我正在构建一个非常自定义的实现,其中 2 个 DSP 片的时钟比采样率快 4 倍。这是一个彻头彻尾的痛苦。

如果存在 DSP 模块,则应尽可能使用它们,因为这样做比使用 LUT 更有效。除非您不需要高性能乘法,在这种情况下,您应该实现,例如,流水线加法器和移位寄存器以节省空间。

但是,在进入 GUI 工具之前,我会先查看推断 DSP 块。Xilinx XST 手册有关于如何用纯 verilog/VHDL 实例化 DSP 块的 HDL 'recipies'。基本上,如果您在乘法器之前和/或之后添加足够多的寄存器,XST 将使用 DSP 块来自动执行操作。您可以检查综合日志以查看它是否正确推断 DSP 模块。我想 Altera 也有类似的东西。

顺便说一句,几分钟前我刚刚在考虑这个问题,因为我目前正在研究一个仅使用乘数作为初始种子的 Mersenne twister 实现。我的第一遍实现不符合时间,但功能是正确的。XST 还将乘法运算放入 DSP 块中,但是它没有经过优化,因此它的运行速度大约是我想要的一半。我可能会使用移位和加法技术重新实现乘法运算,该技术将花费 32 倍的时钟周期数,但不再需要硬件乘法器。

这取决于您需要多少优化以及您的设计应该有多少可移植性。它有点像软件,使用一些汇编进行优化或让编译器选择指令。您可能还需要在大小/速度上进行一些权衡,因此您无法负担组合双精度乘法器。

我不知道 FPGA 中硬连线的 FP 乘法器在哪里。

适用于 CPU 的实际符合 IEEE P754 的乘法运算符涉及的不仅仅是一个大乘法器:您需要添加指数、移位非正规、管理无穷大和一些几乎无用的标志(不精确、下溢......)