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


10

当今的FPGA内置了DSP模块,最新的FPGA甚至还内置了符合IEEE-754的浮点单元。

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

什么时候需要在实例化实际DSP模块的设计中进行此类微管理,何时仅在代码中输入“ *”运算符并让综合工具处理底层细节?哪个更好?

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


哪种FPGA在结构中具有754兼容的FPU?
Martin Thompson

Answers:


6

我自己做了几次。

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

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

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

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

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

选项1:手动使用原始DSP实例化模板。选项2:使用Xilinx Core Generator的IP块。(我将使用此选项。与此同时,您将学习有关核心代的所有知识,这将对将来有所帮助)

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

首先考虑Core Generator选项。我通常在Core Generator中为我正在使用的部件创建一个测试项目,在其中创建任意数量的IP块只是为了学习系统。然后,当我准备在ISE中向设计中添加一个时,请在“设计层次结构”中单击鼠标右键,单击“新源”,然后选择“ IP(CORE Generator和体系结构向导)”,以便我可以直接编辑和重新生成模块从我的项目。

在Core gen中,看看可以选择的不同IP块-有几十个,其中大多数都很酷。

首先应该看乘数核心。签出每一页,然后单击数据表按钮。重要的部分是整数位宽度,流水线级(等待时间)和任何控制信号。通过删除不需要的所有端口,可以生成最简单的块。

去年,当我构建一个5乘3阶IIR滤波器时,由于必须构建一个非常自定义的实现,所以我不得不使用手动实例化模板,其中2个DSP片的时钟速率比采样速率快4倍。太痛苦了。


13

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

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

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

尤其是上述的组合。

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


4

如果存在DSP模块,则应尽可能使用它们,因为与使用LUT进行相同的操作相比,它会更有效。除非不需要高性能乘法,否则应该实现流水线加法器和移位寄存器,以节省空间。

但是,在进入GUI工具之前,我将介绍如何推断DSP模块。Xilinx XST手册具有HDL“配方”,用于说明如何使用纯Verilog / VHDL实例化DSP模块。基本上,如果在乘法器之前和/或之后添加足够的寄存器,则XST将使用DSP模块来自动实现该操作。您可以检查综合日志,以查看它是否正确推断了DSP模块。我认为Altera也有类似的东西。

顺便说一句,我只是在几分钟前就在考虑这一点,因为我目前正在研究梅森捻线机的实现,该实现仅对初始种子使用乘数。我的第一遍实施不符合时间要求,但是功能正确。XST还将乘法运算放入DSP模块中,但是并未进行优化,因此它的运行速度约为我想要的一半。我可能会使用移位加法技术重新实现乘法,该技术将花费时钟周期数的32倍,但不再需要硬件乘法器。


为什么在使用硬件乘法器时计时失败?
Quantum231 2014年

显然,32位乘32位非流水线乘法需要8 ns以上的时间。
alex.forencich 2014年

嗯,我明白了,没有考虑这一点。因此,DSP模块没有流水线。我想知道它们究竟如何实现乘法。它实际上是一个硬并行乘法器吗?
Quantum231 2014年

我认为可以将其配置为以几种不同的方式工作。根据XST手册,在输入和输出上添加足够的寄存器将使XST可以在DSP48 Slice中使用流水线乘法器。在我的情况下,只有一个输出寄存器,而没有输入寄存器,因此无法利用这一点。由于这仅用于初始化(播种PRNG),因此我将并行乘法替换为位串行乘法器,以节省资源利用率。
alex.forencich

2

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

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

实际适用于CPU的符合IEEE P754的乘法运算符涉及的不只是一个大的乘法器:您需要添加指数,平移非正规数,管理无限数和一些几乎没有用的标志(inexact,下溢...)


像Altera 10系列这样的最新一代FPGA在硬件本身上具有符合IEEE-754的浮点乘法器!我还没有机会自己使用它们。
Quantum231 2014年

如果我们内置了DSP模块,那么FPGA应该使用它们而不是组合乘法器,或者使用其他算法,例如使用存储模块?
Quantum231 2014年

2

我阅读了此文档 http://www2.warwick.ac.uk/fac/sci/eng/staff/saf/papers/fpl2014-ronak.pdf

虽然可以从流水线的RTL代码高效地合成适合单个DSP模块的功能,但我们发现需要多个DSP模块的更复杂的功能会降低性能。数学函数的标准RTL描述可以进行大量流水线化,例如,在每次操作之后,但是,由于该流水线可能未考虑DSP块的结构和内部阶段,因此,由于DSP模块的组合方式不允许它们全速运行。

我希望我能找到他们的工具来检查他们的发现。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.