【问题标题】:I want to make vhdl divider我想做 vhdl 分隔符
【发布时间】:2017-12-08 04:16:11
【问题描述】:

我现在正在使用 FPGA spartan3,

我想计算下面公式表示的“结果”。 并且“结果”应该作为整数类型返回。所以我将所有变量都设置为整数类型,但它不起作用。

    result <=((a*b*7894*7)/(w*temp_constant));

我已将 a、b、c、w、temp_constant 设置为变量

    variable a : integer range 0 to 99;
    variable b : integer range 0 to 9999;
    variable w : integer range 0 to 200;
    variable temp_constant : integer range 0 to 99;

但是运算符'/'在这个合成中不起作用。错误消息是 'Operator '/' 必须有常量操作数或第一个操作数必须是 2 的幂"'

【问题讨论】:

  • 哇,这是一个相当复杂的计算。即使你让它合成,它也需要大量的资源并且有很长的延迟。不要期望高时钟频率。如果您来自软件:您无法像微控制器那样对 FPGA 进行编程。您需要实现流水线等。

标签: variables integer vhdl divider


【解决方案1】:

错误消息几乎(请参阅下面的注释)100% 清楚:您的综合工具不支持除法,除非使用常量操作数(结果由合成器在常量传播阶段计算)或除数2 的幂(除法是简单的右移)。

您的综合工具存在这种限制的一个可能原因是,有许多方法可以在硬件中计算整数除法,而在 VHDL 代码中仅键入 / 不足以从中进行选择。可能还有其他原因。

在您的操作数不是常量且除数不是 2 的幂的情况下,您必须自己在较低级别设计此除数。如果您不了解整数除法器的硬件实现,您将不得不搜索一下。这是一个很经典的话题,应该很容易找到好的资源。只是一个提示:预先计算定点表示中的所有逆,将它们存储在只读存储器中并使用乘法而不是除法是一种选择。

注意:我发现您收到的错误消息(第一个操作数必须是 2 的幂)有点令人惊讶。除非术语第一个操作数应该指定除数,这并不常见,它可能是一个错误,正确的错误消息应该是:第二个操作数必须是2的幂时间>。或者,甚至更好:除数必须是 2 的幂

【讨论】:

  • a,b,w,temp_constant 是指拨开关给出的输入,因此它们一直在变化。我怎样才能使它们成为一个固定点???
  • 你不然后定点。您计算 w*temp_constant 并将结果用作只读存储器 (ROM) 的地址。 ROM 内容是这样的:在地址X,您可以找到X 的倒数,乘以2 的恒定幂并四舍五入到最接近的整数。将从 ROM (2**N/(w*temp_constant) 读取的值乘以 a*b*7894*7,去掉 N 个 LSB,您就(几乎)完成了。
  • 由于您的输入来自交换机,您的吞吐量将非常低。每秒一个分区就足够了。因此,最好的实现可能不是基于 ROM 的实现。查看串行分频器并选择最小的一个。您的乘法器也一样:只使用一个并选择一个小型串行并行架构。计算将花费数十甚至数百个时钟周期,但仍然足够快。
猜你喜欢
  • 2013-04-01
  • 2018-08-12
  • 2013-06-29
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
相关资源
最近更新 更多