【问题标题】:VHDL can't matching context of call for to_unsigned in user defined functionVHDL 无法匹配用户定义函数中 to_unsigned 的调用上下文
【发布时间】:2017-12-11 02:09:34
【问题描述】:

我正在使用 Quartus Prime Pro。
我正在处理这样一个函数:

library ieee ;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

function round_resize (a : unsigned; b : integer) return unsigned is
  variable c : signed (a'length - 1 downto 0); --problem child
  variable d : signed (b - 1 downto 0);
begin
  c := a + to_signed(2**(b-2), a'length);
  d := to_unsigned(c(c'length-2 downto (c'length-b-1)));
  return d;
end function;

但我得到了错误:

错误(13643):file.vhd(109)处的 VHDL 错误:无法确定运算符“+”的定义——找到 0 个可能的定义

所以我把问题子改成这样:

c := to_unsigned( a + to_signed(2**(b-2), a'length), a'length);

但我收到以下错误:

Error(13815): VHDL Qualified Expression error at cpmmod.vhd(110): to_unsigned type specified in Qualified Expression must match signed type that is implicitly for expression by context

我还能尝试什么来完成这项工作?

【问题讨论】:

  • 嗯,你可以respect types,但不清楚你为什么要这么做。
  • @user1155120 我真的不明白你为什么不把它放在答案中......相反,你只是链接到有答案的代码图像!为什么尽管付出了所有这些努力,但仍然拒绝发布答案?

标签: vhdl unsigned quartus


【解决方案1】:

您正在尝试添加一个带符号值的无符号。您可以在添加变量之前转换两者之一以在变量上获得相同的类型。

【讨论】:

    【解决方案2】:

    拿但内尔是正确的。

    要了解正在发生的事情,您需要了解两个概念:

    i) VHDL 中的运算符是函数

    当你使用一个操作符时,你实际上是在调用一个函数。在numeric_std 包中,有很多各种运算符的定义。例如,+ 运算符的一种定义是

      function "+" (L, R: UNSIGNED) return UNSIGNED;
    

    ii) VHDL 使用重载

    如果你查看numeric_std 包,你会看到+ 运算符的许多定义:

      function "+" (L, R: UNSIGNED) return UNSIGNED;
      function "+" (L, R: SIGNED) return SIGNED;
      function "+" (L: UNSIGNED; R: NATURAL) return UNSIGNED;
      function "+" (L: NATURAL; R: UNSIGNED) return UNSIGNED;
      function "+" (L: INTEGER; R: SIGNED) return SIGNED;
      function "+" (L: SIGNED; R: INTEGER) return SIGNED;
    

    每个都有不同的参数类型和返回类型组合。编译器可以通过这种组合(称为签名)来确定调用哪一个。这个想法被称为重载。它仅在只有一个可能的函数可以调用时才有效。如果不止一个,编译器不知道调用哪一个;如果少于一个,编译器没有函数可以调用...

    ...那是你的问题。如果您查看上面列出的numeric_std+ 运算符函数的签名,您将看到没有定义组合SIGNEDUNSIGNED 类型的+ 运算符。因此,在您的情况下,编译器没有可调用的函数并且重载失败。

    您需要仔细考虑要实现的算法,然后将所有内容转换为您认为合适的SIGNEDUNSIGNED。您可以使用类型转换轻松做到这一点,因为SIGNEDUNSIGNED密切相关的类型(它们都是由整数索引的std_logic 数组)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-02
      相关资源
      最近更新 更多